本帖最后由 linmiaoyan 于 2019-3-30 14:53 编辑
12智能变色灯 在摄像头前放置不同颜色的物体,灯泡自动改变颜色。
摄像头前物体是什么颜色?看起来问题很简单,但是让计算机来回答并不容易。当我们要判断某个物体是什么颜色的时候,往往会先找出这一物体的最主要颜色,再判断这一颜色和哪种颜色最接近。计算机虽然说不出天蓝、橘黄之类的色彩名词,但可以精确地分析出图像中某一个像素点的RGB值,即RGB三种颜色的具体组成,但一个物体往往不会是纯色的,所以要确定一张含有多种颜色的图像的“颜色”,需要确定一个算法。
算法一:将这个图像的所有像素点的RGB值分别相加,取出RGB三种颜色的平均值。如果担心计算的效率太低,可以均匀地取出部分像素,应该可以得到大致的颜色平均值。 简单的取色方法,通过对图像参数的计算得出结果,拥有高准确度。
算法二:利用滤镜功能,给这个图像加上RGB三种颜色遮罩,处理为黑白图片,然后通过计算分别得到图像的白色区域面积大小,换算为0-255之间的数值。 更加类似于机器学习,通过颜色字典的学习,机器能够“智能”的识别主要物体的颜色,在拥有大量数据的情况下,机器的识别能力能够大大提升。
以上两种方法可以相互结合,得到更好的识别效果
import cv2
import time
from yeelight import Bulb
bulb = Bulb("192.168.31.127")
bulb.turn_on()
#得到图片
def get_pic():
cap=cv2.VideoCapture(0)
sucess,img=cap.read()
cv2.imwrite("image.jpg",img)
cap.release()
#处理图片(裁剪 读取像素点的RGB值并取平均)
def get_color(frame):
#读取图片像素点的步长,50则为50个像素点读取一次
step=0
red=0
blue=0
green=0
print('开始处理')
high, width, _ = frame.shape
print('剪裁前行数%d,列数%d' % (high, width))
# 裁剪坐标为[x0:x1,y0:y1],我们截取图像的中心部分
frame=frame[int(high/4):int(high*3/4),int(width/4):int(width*3/4)]
high, width, _ = frame.shape
print('剪裁后行数%d,列数%d' % (high, width))
#读取图片中所有像素点的RGB值
frame1 = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
for i in frame1:
#i中的数据类型是一整行的像素点[[0,0,0][0,0,0]]
step+=1
if (step==50):
for point in i:
#point中的数据类型是单个像素点
red+=point[0]
green+=point[1]
blue+=point[2]
times=0
red=red/len(i)
green=green/len(i)
blue=blue/len(i)
return red,green,blue
if __name__ == '__main__':
while 1:
get_pic()
filename = r"image.jpg"
frame = cv2.imread(filename)
r,g,b=get_color(frame)
print('r:',r)
print('g:',g)
print('b:',b)
bulb.set_rgb(int(r),int(g),int(b))
time.sleep(2)
|