美文网首页OpenCv
基于颜色特性的目标识别方法

基于颜色特性的目标识别方法

作者: Wayne_Dream | 来源:发表于2018-07-14 21:56 被阅读48次

    1.目标识别与定位

    对基于视觉的机械臂控制来说,机器人视觉是一个非常重要的部分。机器人只有在视觉的指引下,才能获取目标的正确信息,从而控制机械臂完成指定任务。视觉系统必须在标定的基础上,识别和跟踪目标对象的位置和姿态。

    在图像中识别目标对象可以基于三个不同的属性,即颜色,纹理,形状。颜色特性是运用最广泛,最容易学习与实现的方式,因此接下来采用基于颜色的物体识别方式。

    2.实现方式

    通过OpenCV的Python接口来实现物体的颜色特性识别。通过提取目标物体的颜色信息进行HSV阈值分割,得到目标物体的三维坐标。


    HSV介绍

    颜色空间转换

    基于彩色图像分割的方法识别目标时,要选择合适的颜色空间,常见的颜色空间有RGB,HSV,CMY等。HSV模型可以在一定程度上避免RGB模型的高分散性和高相关性所带来的阈值划分问题。所以接下来的代码是采用HSV颜色空间进行目标识别,RGB到HSV的转换公式是:


    RGB2HSV

    当然,opencv自身以及集成了各种颜色空间的转换函数,所以在接下来的代码中只需调用其函数即可。

    3.捕获目标代码

    运行环境

    • Python3.6.5
    • Pycharm
    • win10
    import cv2
    import numpy as np
    
    capture = cv2.VideoCapture(0)
    lower_blue = np.array([90, 110, 110])
    upper_blue = np.array([140, 255, 255])
    # 确定目标物体的HSV范围 此范围为蓝色
    while(True):
    
        ret, frame = capture.read()
    
        hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    
        mask = cv2.inRange(hsv, lower_blue, upper_blue)
    
        res = cv2.bitwise_and(frame, frame, mask=mask)
        cv2.imshow('frame', frame)
        cv2.imshow('mask', mask)
        cv2.imshow('res', res)
        if cv2.waitKey(1) == ord('q'):
            break
    

    实现效果

    原图
    处理后图像

    4.锁定目标,并获取目标质心代码

    from collections import deque
    import numpy as np
    import cv2
    import time
    
    Lower = np.array([100, 43, 46])
    Upper = np.array([130, 255, 255])
    # 定义目标颜色HSV的范围
    
    mybuffer = 64
    pts = deque(maxlen=mybuffer)
    camera = cv2.VideoCapture(0)
    time.sleep(2)
    
    while True:
        (ret, frame) = camera.read()
        if not ret:
            print('No Camera')
            break
        # frame = imutils.resize(frame, width=600)
        hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
        # 根据阈值构建掩膜
        mask = cv2.inRange(hsv, Lower, Upper)
        # 腐蚀操作
        mask = cv2.erode(mask, None, iterations=2)
        # 膨胀操作,其实先腐蚀再膨胀的效果是开运算,去除噪点
        mask = cv2.dilate(mask, None, iterations=2)
        # 轮廓检测
        cnts = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]
        # 初始化目标轮廓质心
        center = None
        # 如果存在轮廓
        if len(cnts) > 0:
            # 找到面积最大的轮廓
            c = max(cnts, key=cv2.contourArea)
            # 确定面积最大的轮廓的外接圆
            ((x, y), radius) = cv2.minEnclosingCircle(c)
            # 计算轮廓的矩
            M = cv2.moments(c)
            # 计算质心
            center = (int(M["m10"]/M["m00"]), int(M["m01"]/M["m00"]))
    
            if 80 > radius > 20:
                cv2.circle(frame, (int(x), int(y)), int(radius), (0, 255, 255), 2)
                cv2.circle(frame, center, 5, (0, 0, 255), -1)
                # 把质心添加到pts中,并且是添加到列表左侧
                pts.appendleft(center)
    
        cv2.imshow('Frame', frame)
        # 键盘检测,检测到esc键退出
        k = cv2.waitKey(5)&0xFF
        if k == 27:
            break
    # 摄像头释放
    camera.release()
    # 销毁所有窗口
    cv2.destroyAllWindows()
    

    关于图像处理的膨胀和腐蚀操作:膨胀就是求局部最大值的操作,相反,腐蚀是求局部最小值的操作。
    具体可参考这个Python+OpenCV教程12:腐蚀与膨胀
    先腐蚀后膨胀会分离物体,所以叫开运算,常用来去除小区域物体;
    先膨胀后腐蚀会消除物体内的小洞,所以叫闭运算。
    注意:腐蚀和膨胀是针对图片中的白色部分!

    腐蚀/膨胀 开/闭运算的理解

    实现效果

    图中黄色圈为最大外接圆,红点为质心

    对于环境的要求较高,虽然可以设定捕获物体半径大小,但最好目标颜色为环境中独一无二的颜色。

    参考资料:opencv教程
    基于双目视觉的机器人目标定位与机械臂控制
    python+opencv实践

    相关文章

      网友评论

      • 8416ac9040d9:这个只是。。目标检测吧,,/汗
        Wayne_Dream:@机智的小火箭 谢谢指出,是目标检测。

      本文标题:基于颜色特性的目标识别方法

      本文链接:https://www.haomeiwen.com/subject/nyxupftx.html