我是靠谱客的博主 直率裙子,最近开发中收集的这篇文章主要介绍OpenCV 颜色检测| color detectionOpenCV 颜色检测相关函数解释,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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 颜色检测相关函数解释所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(64)

评论列表共有 0 条评论

立即
投稿
返回
顶部