接下来是我的总代码:
import cv2 import numpy as np import re #颜色RBG取值 color = { "blue": {"color_lower": np.array([100, 43, 46]), "color_upper": np.array([124, 255, 255])}, "red": {"color_lower": np.array([156, 43, 46]), "color_upper": np.array([180, 255, 255])}, "yellow": {"color_lower": np.array([26, 43, 46]), "color_upper": np.array([34, 255, 255])}, "green": {"color_lower": np.array([35, 43, 46]), "color_upper": np.array([77, 255, 255])}, "purple": {"color_lower": np.array([125, 43, 46]), "color_upper": np.array([155, 255, 255])}, "orange": {"color_lower": np.array([11, 43, 46]), "color_upper": np.array([25, 255, 255])} } def title(): print("*"*50+"颜色识别"+"*"*50) imge = input("请输入你图片的路径:") print('识别颜色种类有:"blue","red","yellow","green","purple","orange"') color_0 = input("请输入你想要识别的颜色:") return color_0,imge def cv_show(name, img): cv2.imshow(name, img) cv2.waitKey(0) cv2.destroyAllWindows() def content(color_0, imge): imge = cv2.imread(imge) # imge = cv2.imread('D:Picturenetworkcolor.jpg') cv_show("img", imge) #展示原图 # print(img.shape) img = cv2.cvtColor(imge, cv2.COLOR_BGR2HSV) #转成HSV img = cv2.GaussianBlur(img, (5, 5), 0) #高斯滤波降噪,模糊图片 # img = cv2.threshold(img, 127,255, cv2.THRESH_BINARY)[1] color_img = cv2.inRange(img, color[color_0]["color_lower"], color[color_0]["color_upper"])#筛选出符合的颜色 kernel = np.ones((3, 3), np.uint8) #核定义 color_img = cv2.erode(color_img, kernel, iterations=2) #腐蚀除去相关性小的颜色 color_img = cv2.GaussianBlur(color_img, (5, 5), 0) #模糊图像 cnts = cv2.findContours(color_img.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[1] #找出轮廓 for cnt in cnts: #遍历所有符合的轮廓 x, y, w, h = cv2.boundingRect(cnt) cv2.rectangle(imge, (x, y), (x+w, y+h), (0, 0, 255), 2) #cv2.drawContours(imge.copy(), cnt, -1, (0, 0, 255), 2) cv_show("img", imge) #展示处理后的图片 color_0, imge= title() content(color_0, imge)
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647颜色的可以根据自己的需求增加下边界和上边界的数组或标量
2.读入图像imge = cv2.imread(imge) # imge = cv2.imread('D:Picturenetworkcolor.jpg') cv_show("img", imge) #展示原图 123
读入本地图片
3.图像转成HSVimg = cv2.cvtColor(imge, cv2.COLOR_BGR2HSV) #转成HSV 1
由于计算机对于RGB图像的饱和度不是很直观,所以需要转成HSV图像进行操作。
第一个参数是需要转换的图像;第二个参数是cv2中的内置参数。
img = cv2.GaussianBlur(img, (5, 5), 0) #高斯滤波降噪,模糊图片 1
图像可能带有噪音点,需要用高斯滤波进行降噪处理,模糊图像使识别的范围更广更准确。
第一个参数是读入的图像;第二个参数是高斯核的大小,一般取奇数;第三个参数取标准差为0。
color_img = cv2.inRange(img, color[color_0]["color_lower"], color[color_0]["color_upper"])#筛选出符合的颜色 1
通过已经定好的颜色下边界的数组和上边界的数组,来识别出相应的颜色。
第一个参数是读入的图像;第二,三个参数是下上边界的数组。
kernel = np.ones((3, 3), np.uint8) #核定义 color_img = cv2.erode(color_img, kernel, iterations=2) #腐蚀除去相关性小的颜色 12
因为筛选出来的颜色有些可能在图片的毛刺部分,不是我们想要的结果,会导致误差,因此需要用腐蚀操作进行处理。
先自定义一个核kernel,第一个参数是传入的图像;第二个参数是核;第三个参数是腐蚀的次数。
cnts = cv2.findContours(color_img.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[1] #找出轮廓 1
找出上面所操作的图像的轮廓。
第一个参数是传入的是copy()上述操作过后的图像,不加copy的话会直接在原图操作;第二个参数是cv2的内置函数,找出满足条件的外轮廓;第三个参数是cv2的内置函数,找出对应轮廓拐点信息。
for cnt in cnts: #遍历所有符合的轮廓 x, y, w, h = cv2.boundingRect(cnt) cv2.rectangle(imge, (x, y), (x+w, y+h), (0, 0, 255), 2) #cv2.drawContours(imge.copy(), cnt, -1, (0, 0, 255), 2) 1234
在原图画出矩形轮廓。
这里用到cv2.boundingRect,传入上述轮廓信息,找出矩形在图像中的位置和长宽值,接下来用到cv2.rectangle画出相应的矩形,第一个参数是原图图像;第二个参数是矩形左上角的坐标值;第三个参数是矩形右下脚的坐标值;第四个参数是线条的颜色;第五个参数是线条的粗细程度。
实际检测可能有所误差…需要做进一步改进。
相关知识
利用OpenCV根据图片识别环境的亮度
深入浅出:利用OpenCV实现手写数字识别之旅
python 手写字识别
基于OpenCV的鲜花的图像分类系统详细设计与具体代码实现
opencv
opencv深度学习昆虫识别系统图像识别 python
基于STM32的农业病虫害检测检测系统:OpenCV、MQTT、Flask框架、MySQL(代码示例)
基于深度学习YOLOv8\YOLOv5的花卉识别鲜花识别检测分类系统设计
深度学习机器学习卷积神经网络的花卉识别花种类识别
基于Python机器视觉的远程害虫种类识别和数量检测系统 报告+项目源码及数据
网址: Opencv之颜色识别 https://m.huajiangbk.com/newsview1099054.html
上一篇: 枣花蜜怎么辨别真假,从色泽、味道 |
下一篇: 形容各种花颜色的词语 |