opencv-python 实现颜色检测
参考:https://www.jb51.net/article/206173.htm可用于实现倒车辅助标记检测的功能,倒车辅助标记颜色已经确定了,所以不需要使用深度学习的方法,那样成本太高了,直接可以使用颜色检测的方法。1.首先需要确定待检测目标的HSV值import cv2img = cv2.imread('l3.png')gray = cv2.cvtColor(img, cv2.COLOR_B
·
作者:RayChiu_Labloy
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处
目录
一、第一个应用:
参考:https://www.jb51.net/article/206173.htm
可用于实现倒车辅助标记检测的功能,倒车辅助标记颜色已经确定了,所以不需要使用深度学习的方法,那样成本太高了,直接可以使用颜色检测的方法。
1.首先需要确定待检测目标的HSV值
import cv2
img = 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'):
break
cv2.destroyAllWindows()
2.然后利用颜色检测,检测出指定目标
import numpy as np
import cv2
font= cv2.FONT_HERSHEY_SIMPLEX
lower_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)&0xFF
if k ==27:
break
cv2.waitKey(0)
cv2.destroyAllWindows()
只取蓝色 eg:
import cv2
import matplotlib.pyplot as plt
import numpy as np
cap = 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'):
break
cap.release()
cv2.destroyAllWindows()
3.效果
一、第二个应用:
参考 https://github.com/Linfeng-Lee/Color_Recognition
# 使用opencv对图片进行特定颜色识别 (使用的图片见底部)
文件1:read_photo.py用于读取图片进行hsv色域转换
import cv2
frame=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 cv2
import numpy as np
if __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 = 0
for 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_SIMPLEX
cv2.putText(Img, str(p), (x - 10, y + 10), font, 1, (0, 0, 255), 2) # 加减10是调整字符位置
p += 1
print('黄色方块的数量是', 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 cv2
import numpy as np
cap = 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 = 0
for 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 :
【如果对您有帮助,交个朋友给个一键三连吧,您的肯定是我博客高质量维护的动力!!!】
更多推荐
已为社区贡献1条内容
所有评论(0)