包含的库函数:
import os
import cv2 as cv
import numpy as np
import time
import json
import threading
from queue import Queue
import sys
应用的库函数的简单介绍——
os库:
开始设置的变量:
picture_path='SamplingPictures/'
picture_number=0 #第几个图片
num=0 #成功了多少张图片
魔方颜色的阈值:
#魔方的颜色
greenLower = (46, 133, 46)
greenUpper = (85, 255, 255)
redLower = (150, 100, 6)
redUpper = (185, 255, 255)
yellowLower = (21, 84, 46)
yellowUpper = (64, 255, 255)
orangeLower = (2, 150, 100)
orangeUpper = (15, 255, 255)
whiteLower = (0, 0, 146) # gray
whiteUpper = (180, 78, 255)
blueLower = (88, 143, 46)
blueUpper = (120, 255, 255)
设置空字典:
listnet=[]
listall=[]
listhsv=[]
listrgb=[]
将字典转化为josn字符(未使用):
class MyEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, np.integer):
return int(obj)
elif isinstance(obj, np.floating):
return float(obj)
elif isinstance(obj, np.ndarray):
return obj.tolist() #Numpy 中 tolist()用于将数组或矩阵转为列表
else:
return super(MyEncoder, self).default(obj)
设置函数获取图片路径,返回图片路径:
def read_picture(i):
path=picture_path+'huanyuan{0}.jpg'.format(i)
print(path)
return(path)
format()函数的介绍
"{} {}".format("hello", "world") # 不设置指定位置,按默认顺序
#输出为'hello world'
"{0} {1}".format("hello", "world") # 设置指定位置
#输出为'hello world'
"{1} {0} {1}".format("hello", "world") # 设置指定位置
#输出为'world hello world'
字符串类型格式化采用format()方法,基本使用格式是:
? ? ?"模板字符串".format(<逗号分隔的参数>)
调用format()方法后会返回一个新的字符串,参数从0 开始编号
举例:
"{}:计算机{}的CPU 占用率为{}%。".format("2016-12-31","PYTHON",10)
Out[10]: '2016-12-31:计算机PYTHON的CPU 占用率为10%。'
设置函数通过index变量返回颜色(未使用):
def indextocolor(index):
color=()
if (index==0):
color=(0, 0, 255)
if (index==1):
color=(255, 0, 0)
if (index==2):
color=(0, 255, 255)
if (index==3):
color=(0, 165, 255)
if (index==4):
color=(0, 255, 0)
if (index==5):
color=(255, 255, 255)
return (color)
绘制方格(未使用)
def draw_rectangle(image,color,i):
x=Outer_frame[i][0]
y=Outer_frame[i][1]
x1=Outer_frame[i][0]+Side_length
y1=Outer_frame[i][1]+Side_length
cv.rectangle(image,(x,y),(x1,y1),color,-1)
获取魔方每个面的颜色BGR的平均值(获取图像平均值的普遍算法):
def get_averageBGR(image,x,y):
img = cv.cvtColor(image,cv.COLOR_BGR2RGB)
img=img[y+10:y+40,x+10:x+40]
per_image_Rmean = []
per_image_Gmean = []
per_image_Bmean = []
list1=[]
per_image_Bmean.append(np.mean(img[:,:,0]))#对其他通道置零只显示单个通道
per_image_Gmean.append(np.mean(img[:,:,1]))
per_image_Rmean.append(np.mean(img[:,:,2]))
R_mean = np.mean(per_image_Rmean)
G_mean = np.mean(per_image_Gmean)
B_mean = np.mean(per_image_Bmean)
list1.append(R_mean)
list1.append(G_mean)
list1.append(B_mean)
return (list1)
opencv默认的彩色图像的颜色空间是BGR所以用
img = cv.cvtColor(image,cv.COLOR_BGR2RGB)
将图片默认的RGB转换为BGR格式
缩小采样空间,防止放魔方时产生的位置移动,来尽量不要采样到边框:
img=img[y+10:y+40,x+10:x+40]
设置列表变量记录每个颜色通道的数值
per_image_Rmean = []
per_image_Gmean = []
per_image_Bmean = []
用append函数在列表末尾添加新的对象
per_image_Bmean.append(np.mean(img[:,:,0]))#对其他通道置零只显示单个通道
per_image_Gmean.append(np.mean(img[:,:,1]))
per_image_Rmean.append(np.mean(img[:,:,2]))
?opencv假设图像是RGB三分量组成的图像,那么图像的
第一通道是R,
第二通道是G,
第三通道是B
Img[:,:,2]代表R通道,也就是红色分量图像;
Img[:,:,1]代表G通道,也就是绿色分量图像;
Img[:,:,0]代表B通道,也就是蓝色分量图像。
np.mean()为求均值的函数
拓展:
python列表中“::”的切片
?s = 'abcdefgh'
?s[::-1] # 可以视为翻转操作
输出为'hgfedcba'
s[::2] # 隔一个取一个元素的操作
输出为'aceg'
变量赋值:
R_mean = np.mean(per_image_Rmean)
G_mean = np.mean(per_image_Gmean)
B_mean = np.mean(per_image_Bmean)
其中np.mean()重复使用,但对结果无影响可删除
列表赋值并返回:
list1.append(R_mean)
list1.append(G_mean)
list1.append(B_mean)
print(list1)
获取魔方每个面的颜色HSV的平均值(获取图像平均值的普遍算法):
def get_averageHSV(img,x,y):
hsv=[]
list1=[]
h=s=v=0
image1=img[y+10:y+40,x+10:x+40]
# cv.imshow('1',image1)
# cv.waitKey(0)
hsv= cv.cvtColor(image1,cv.COLOR_BGR2HSV)
width = hsv.shape[0]
height= hsv.shape[1]
for index1 in range (width):
for index2 in range (height):
h=h+ hsv[index1,index2,0]
s=s+ hsv[index1,index2,1]
v=v+ hsv[index1,index2,2]
aveh=h//(width*height)
aves=s//(width*height)
avev=v//(width*height)
list1.append(aveh)
list1.append(aves)
list1.append(avev)
return (list1)
设置空列表和变量:
list1=[]
h=s=v=0
img.shape[0]:图像的垂直尺寸(高度) img.shape[1]:图像的水平尺寸(宽度) img.shape[2]:图像的通道数
在矩阵中,[0]就表示行数,[1]则表示列数
width = hsv.shape[0]
height= hsv.shape[1]
获取图像的hsv中hsv各个通道的数值:
for index1 in range (width):
for index2 in range (height):
h=h+ hsv[index1,index2,0]
s=s+ hsv[index1,index2,1]
v=v+ hsv[index1,index2,2]
计算平均值:
aveh=h//(width*height)
aves=s//(width*height)
avev=v//(width*height)
width*height为图片像素点的数量
返回列表值:
list1.append(aveh)
list1.append(aves)
list1.append(avev)
return (list1)
图像均衡化:
?
def average(img):
# 彩色图像均衡化,需要分解通道 对每一个通道均衡化
image_yuv = cv.cvtColor(img,cv.COLOR_BGR2YUV)
#直方图均衡化
image_yuv[:,:,0] = cv.equalizeHist(image_yuv[:,:,0])
#显示效果
output = cv.cvtColor(image_yuv,cv.COLOR_YUV2BGR)
cv.imshow('HistEqualize',output)
return (output)
?
|