600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > opencv-python 实现颜色检测

opencv-python 实现颜色检测

时间:2020-10-03 19:52:43

相关推荐

opencv-python 实现颜色检测

作者:RayChiu_Labloy

版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

目录

一、第一个应用:

一、第二个应用:

一、第一个应用:

参考:/article/206173.htm

可用于实现倒车辅助标记检测的功能,倒车辅助标记颜色已经确定了,所以不需要使用深度学习的方法,那样成本太高了,直接可以使用颜色检测的方法。

1.首先需要确定待检测目标的HSV值

import cv2img = cv2.imread('l3.png')gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)def mouse_click(event, x, y, flags, para):if event == cv2.EVENT_LBUTTONDOWN: # 左边鼠标点击print('PIX:', x, y)print("BGR:", img[y, x])print("GRAY:", gray[y, x])print("HSV:", hsv[y, x])if __name__ == '__main__':cv2.namedWindow("img")cv2.setMouseCallback("img", mouse_click)while True:cv2.imshow('img', img)if cv2.waitKey() == ord('q'):breakcv2.destroyAllWindows()

2.然后利用颜色检测,检测出指定目标

import numpy as npimport cv2font= cv2.FONT_HERSHEY_SIMPLEXlower_red=np.array([0,127,128])#红色阈值下界higher_red=np.array([10,255,255])#红色阈值上界lower_green=np.array([35,110,106])#绿色阈值下界higher_green=np.array([77,255,255])#绿色阈值上界cap=cv2.VideoCapture(0)#打开电脑内置摄像头if(cap.isOpened()):while(True):ret,frame=cap.read()#按帧读取,这是读取一帧img_hsv=cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)mask_red=cv2.inRange(img_hsv,lower_red,higher_red)#可以认为是过滤出红色部分,获得红色的掩膜mask_green=cv2.inRange(img_hsv,lower_green,higher_green)#获得绿色部分掩膜mask_green = cv2.medianBlur(mask_green, 7) # 中值滤波mask_red = cv2.medianBlur(mask_red, 7) # 中值滤波mask=cv2.bitwise_or(mask_green,mask_red)#三部分掩膜进行按位或运算cnts1,hierarchy1=cv2.findContours(mask_red,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)#轮廓检测cnts3,hierarchy3=cv2.findContours(mask_green,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)for cnt in cnts1:(x,y,w,h)=cv2.boundingRect(cnt)#该函数返回矩阵四个点cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 255), 2)#将检测到的颜色框起来cv2.putText(frame,'red',(x,y-5),font,0.7,(0,0,255),2)for cnt in cnts3:(x, y, w, h) = cv2.boundingRect(cnt) # 该函数返回矩阵四个点cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2) # 将检测到的颜色框起来cv2.putText(frame, 'green', (x, y - 5), font, 0.7, (0,255,0), 2)cv2.imshow('frame',frame)k=cv2.waitKey(20)&0xFFif k ==27:breakcv2.waitKey(0)cv2.destroyAllWindows()

只取蓝色 eg:

import cv2import matplotlib.pyplot as pltimport numpy as npcap = cv2.VideoCapture(0)lower_blue=np.array([78, 43, 46])upper_blue=np.array([110, 255, 255])width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))height =int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))while(1):ret, frame = cap.read()img=cap.read()cv2.imshow('Capture', frame)hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)mask = cv2.inRange(hsv, lower_blue, upper_blue)cv2.imshow('Mask', mask)res = cv2.bitwise_and(frame, frame, mask=mask)cv2.rectangle(res, (0, height), (width , 0 ), (0, 255, 0), 5)cv2.imshow('Result', res)if cv2.waitKey(1) & 0xFF == ord('q'):breakcap.release()cv2.destroyAllWindows()

3.效果

一、第二个应用:

参考/Linfeng-Lee/Color_Recognition

# 使用opencv对图片进行特定颜色识别 (使用的图片见底部)文件1:read_photo.py用于读取图片进行hsv色域转换

import cv2frame=cv2.imread('lena.tiff')src=cv2.imshow('photo',frame)img_HSV=cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)src=cv2.imshow('HSV',img_HSV)cv2.waitKey()

文件2:test_img.py用于对图片特定颜色识别,这里我识别的是黄色

import cv2import numpy as npif __name__ == '__main__':Img = cv2.imread('img.png') # 读入一幅图像kernel_2 = np.ones((2, 2), np.uint8) # 2x2的卷积核kernel_3 = np.ones((3, 3), np.uint8) # 3x3的卷积核kernel_4 = np.ones((4, 4), np.uint8) # 4x4的卷积核print(kernel_2)print(kernel_3)print(kernel_4)if Img is not None: # 判断图片是否读入HSV = cv2.cvtColor(Img, cv2.COLOR_BGR2HSV) # 把BGR图像转换为HSV格式#下面两个值是要识别的颜色范围Lower = np.array([20, 20, 20]) # 要识别颜色的下限Upper = np.array([30, 255, 255]) # 要识别的颜色的上限# mask是把HSV图片中在颜色范围内的区域变成白色,其他区域变成黑色mask = cv2.inRange(HSV, Lower, Upper)# 下面四行是用卷积进行滤波# erode()函数可以对输入图像用特定结构元素进行腐蚀操作,该结构元素确定腐蚀操作过程中的邻域的形状,# 各点像素值将被替换为对应邻域上的最小值:erosion = cv2.erode(mask, kernel_3, iterations=1)erosion = cv2.erode(erosion, kernel_3, iterations=1)# dilate()函数可以对输入图像用特定结构元素进行膨胀操作,该结构元素确定膨胀操作过程中的邻域的形状,# 各点像素值将被替换为对应邻域上的最大值:dilation = cv2.dilate(erosion, kernel_3, iterations=1)dilation = cv2.dilate(dilation, kernel_3, iterations=1)# target是把原图中的非目标颜色区域去掉剩下的图像target = cv2.bitwise_and(Img, Img, mask=dilation)# 将滤波后的图像变成二值图像放在binary中ret, binary = cv2.threshold(dilation, 127, 255, cv2.THRESH_BINARY)# 在binary中发现轮廓,轮廓按照面积从小到大排列contours, hierarchy = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)p = 0for i in contours: # 遍历所有的轮廓x, y, w, h = cv2.boundingRect(i) # 将轮廓分解为识别对象的左上角坐标和宽、高# 在图像上画上矩形(图片、左上角坐标、右下角坐标、颜色、线条宽度)cv2.rectangle(Img, (x, y), (x + w, y + h), (0, 255,), 3)# 给识别对象写上标号font = cv2.FONT_HERSHEY_SIMPLEXcv2.putText(Img, str(p), (x - 10, y + 10), font, 1, (0, 0, 255), 2) # 加减10是调整字符位置p += 1print('黄色方块的数量是', p, '个') # 终端输出目标数量# cv2.imshow('target', target)# cv2.imshow('Mask', mask)# cv2.imshow("prod", dilation)cv2.imshow('Img', Img)cv2.imwrite('Img.png', Img) # 将画上矩形的图形保存到当前目录while True:Key = chr(cv2.waitKey(15) & 255)if Key == 'q':cv2.destroyAllWindows()break

文件3:test_video.py这里开启本地摄像头对视频流进行颜色识别,也可以对本地视频进行识别

import cv2import numpy as npcap = cv2.VideoCapture(0)cv2.namedWindow("RGB", 1)cv2.namedWindow("HSV", 1)cv2.namedWindow("MASK", 1)cv2.namedWindow("target", 1)while True:ret,frame = cap.read() # frame = cv2.flip(frame, 1)image1 = cv2.putText(frame, 'Press esc to exit', (10, 30), cv2.FONT_HERSHEY_COMPLEX_SMALL, 1, (0, 0, 255),thickness=1, lineType=1)kernel_3 = np.ones((3, 3), np.uint8) # 3x3的卷积核if frame is not None:HSV = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) # 把BGR图像转换为HSV格式Lower = np.array([20, 20, 20]) # 要识别颜色的下限Upper = np.array([30, 255, 255]) # 要识别的颜色的上限# mask是把HSV图片中在颜色范围内的区域变成白色,其他区域变成黑色mask = cv2.inRange(HSV, Lower, Upper)# 卷积进行滤波erosion = cv2.erode(mask, kernel_3, iterations=1)erosion = cv2.erode(erosion, kernel_3, iterations=1)dilation = cv2.dilate(erosion, kernel_3, iterations=1)dilation = cv2.dilate(dilation, kernel_3, iterations=1)# target是把原图中的非目标颜色区域去掉剩下的图像target = cv2.bitwise_and(frame, frame, mask=dilation)# 变成二值图像放在binary中ret, binary = cv2.threshold(dilation, 127, 255, cv2.THRESH_BINARY)contours, hierarchy = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)p = 0for i in contours: # 遍历所有的轮廓x, y, w, h = cv2.boundingRect(i) # 将轮廓分解为识别对象的左上角坐标和宽、高# 在图像上画上矩形(图片、左上角坐标、右下角坐标、颜色、线条宽度)cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255,), 3)cv2.imshow('RGB', frame)cv2.imshow('HSV', HSV)cv2.imshow('MASK', mask)cv2.imshow('target', target)key = cv2.waitKey(3)if key == 27:break

## 主要知识: rgb色域到hsv色域的转换,HSV是一种比较直观的颜色模型,对于人类分辨颜色更友好。 这个模型中颜色的参数分别是:色调(H, Hue),饱和度(S,Saturation),明度(V, Value)。

HSV :

lena.tiff :

img.png :

【如果对您有帮助,交个朋友给个一键三连吧,您的肯定是我博客高质量维护的动力!!!】

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。