• OpenCV 颜色检测| color detection


    OpenCV 颜色检测

    1.导入必要的包并初始化相机

    1. import cv2
    2. import numpy as np
    3. # Reading the image
    4. img = cv2.imread('test.jpg')
    5. # Showing the output
    6. cv2.imshow("Image", img)
    7. cv2.waitKey(0)
    8. cv2.destroyAllWindows()

    2. 从输入图像中检测颜色并创建MASK

    1. # convert to hsv colorspace
    2. hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    3. # lower bound and upper bound for Green color
    4. lower_bound = np.array([25, 52, 72])
    5. upper_bound = np.array([100, 255, 255])
    6. # find the colors within the boundaries
    7. 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 从遮罩的黑色区域去除白噪声。

    1. #define kernel size
    2. kernel = np.ones((7,7),np.uint8)
    3. # Remove unnecessary noise from mask
    4. mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)
    5. mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)

    4. 在图像上应用mask

    1. # Segment only the detected region
    2. segmented_img = cv2.bitwise_and(img, img, mask=mask)

    5. 绘制检测到的对象的边界

    1. # Find contours from the mask
    2. contours, hierarchy = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
    3. output = cv2.drawContours(segmented_img, contours, -1, (0, 0, 255), 3)
    4. # Showing the output
    5. imgs = np.hstack([img, output])
    6. cv2.imshow("Image", imgs)

     6. 用矩形方框画颜色区域 (忽略4到5步骤)

    找到区域面积大于300的,加入到color_bounding_rect链表里

    1. # For greencolor
    2. mask = cv2.dilate(mask, kernel)
    3. # Creating contour to track red color
    4. contours, hierarchy = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    5. print('contours', contours)
    6. # print('hierarchy', hierarchy)
    7. color_bounding_rect = list()
    8. min_area = 300
    9. for pic, contour in enumerate(contours):
    10. area = cv2.contourArea(contour)
    11. if (area > min_area):
    12. color_bounding_rect.append(cv2.boundingRect(contour))

    7. 画绿色颜色的方框,并且标上Green

    1. for x, y, w, h in color_bounding_rect:
    2. print('x, y, w, h', x, y, w, h)
    3. img = cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 2)
    4. cv2.putText(img, "green", (x, y), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 0, 255))
    5. 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

     

  • 相关阅读:
    Leetcode 637. 二叉树的层平均值
    【分析笔记】Linux input 子系统原理分析
    重复的DNA序列[hash判定重复+滑动窗口+二进制编码之位运算]
    洛谷C++简单题小练习day11—字母转换,分可乐两个小程序
    路由器ipsec|vpn实验分析
    JavaSE——异常
    超越任务调度的极致:初探分布式定时任务 XXL-JOB 分片广播
    Nginx请求强制缓存设置
    错误 0x800700DF 文件大小超出允许的限制,无法保存
    高速公路智能管理系统:构建安全畅通的数字大动脉
  • 原文地址:https://blog.csdn.net/keeppractice/article/details/126183527