概述
OpenCV 颜色检测
1.导入必要的包并初始化相机
import cv2
import numpy as np
# Reading the image
img = cv2.imread('test.jpg')
# Showing the output
cv2.imshow("Image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
2. 从输入图像中检测颜色并创建MASK
# convert to hsv colorspace
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# lower bound and upper bound for Green color
lower_bound = np.array([25, 52, 72])
upper_bound = np.array([100, 255, 255])
# find the colors within the boundaries
mask = cv2.inRange(hsv, lower_bound, upper_bound)
3. 从MASK中去除不必要的噪音
np.ones((7,7),np.uint8) 创建一个 5×5 8 位整数矩阵。
cv2.MORPH_CLOSE 从白色区域中去除不必要的黑噪声。
cv2.MORPH_OPEN 从遮罩的黑色区域去除白噪声。
#define kernel size
kernel = np.ones((7,7),np.uint8)
# Remove unnecessary noise from mask
mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)
mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)
4. 在图像上应用mask
# Segment only the detected region
segmented_img = cv2.bitwise_and(img, img, mask=mask)
5. 绘制检测到的对象的边界
# Find contours from the mask
contours, hierarchy = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
output = cv2.drawContours(segmented_img, contours, -1, (0, 0, 255), 3)
# Showing the output
imgs = np.hstack([img, output])
cv2.imshow("Image", imgs)
6. 用矩形方框画颜色区域 (忽略4到5步骤)
找到区域面积大于300的,加入到color_bounding_rect链表里
# For greencolor
mask = cv2.dilate(mask, kernel)
# Creating contour to track red color
contours, hierarchy = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
print('contours', contours)
# print('hierarchy', hierarchy)
color_bounding_rect = list()
min_area = 300
for pic, contour in enumerate(contours):
area = cv2.contourArea(contour)
if (area > min_area):
color_bounding_rect.append(cv2.boundingRect(contour))
7. 画绿色颜色的方框,并且标上Green
for x, y, w, h in color_bounding_rect:
print('x, y, w, h', x, y, w, h)
img = cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 2)
cv2.putText(img, "green", (x, y), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 0, 255))
cv2.imshow("Image", img)
相关函数解释
1. cv2.dilate(A, B)
- 此操作包括将图像 A 与一些内核 (B) 进行卷积,该内核可以具有任何形状或大小,通常是正方形或圆形。
- 内核 B 有一个定义的锚点,通常是内核的中心。
- 当内核 B 在图像上扫描时,我们计算与 B 重叠的最大像素值,并将锚点位置的图像像素替换为该最大值。 正如您可以推断的那样,这种最大化操作会导致图像中的明亮区域“增长”(因此称为膨胀)。
- 膨胀运算为:
效果如下:
2. cv2.erode(A, B)
和Dilate函数差不多,不一样的地方是用B做卷机后取最小值
效果如下:
3. image,contours,hierarchy = cv2.findContours(contour,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
输入:
contour:带有轮廓信息的图像;
cv2.RETR_TREE:提取轮廓后,输出轮廓信息的组织形式,除了cv2.RETR_TREE还有以下几种选项:
- cv2.RETR_EXTERNAL:输出轮廓中只有外侧轮廓信息;
- cv2.RETR_LIST:以列表形式输出轮廓信息,各轮廓之间无等级关系;
- cv2.RETR_CCOMP:输出两层轮廓信息,即内外两个边界(下面将会说到contours的数据结构);
- cv2.RETR_TREE:以树形结构输出轮廓信息。
cv2.CHAIN_APPROX_SIMPLE:指定轮廓的近似办法,有以下选项:
- cv2.CHAIN_APPROX_NONE:存储轮廓所有点的信息,相邻两个轮廓点在图象上也是相邻的;
- cv2.CHAIN_APPROX_SIMPLE:压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标;
- cv2.CHAIN_APPROX_TC89_L1:使用teh-Chinl chain 近似算法保存轮廓信息。
输出:
python3里返回三个值:image,contours,hierarchy
image:可能是跟输入contour类似的一张二值图;
contours:list结构,列表中每个元素代表一个边沿信息。每个元素是(x,1,2)的三维向量,x表示该条边沿里共有多少个像素点,第三维的那个“2”表示每个点的横、纵坐标;
注意:如果输入选择cv2.CHAIN_APPROX_SIMPLE,则contours中一个list元素所包含的x点之间应该用直线连接起来,这个可以用cv2.drawContours()函数观察一下效果。
hierarchy:返回类型是(x,4)的二维ndarray。x和contours里的x是一样的意思。如果输入选择cv2.RETR_TREE,则以树形结构组织输出,hierarchy的四列分别对应下一个轮廓编号、上一个轮廓编号、父轮廓编号、子轮廓编号,该值为负数表示没有对应项。
参考资料
OpenCV: Eroding and Dilating
最后
以上就是直率裙子为你收集整理的OpenCV 颜色检测| color detectionOpenCV 颜色检测相关函数解释的全部内容,希望文章能够帮你解决OpenCV 颜色检测| color detectionOpenCV 颜色检测相关函数解释所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复