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

简介: 1.目标识别与定位对基于视觉的机械臂控制来说,机器人视觉是一个非常重要的部分。机器人只有在视觉的指引下,才能获取目标的正确信息,从而控制机械臂完成指定任务。

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()

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

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

实现效果

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

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

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

目录
相关文章
|
7月前
|
人工智能 Linux API
OpenCV这么简单为啥不学——1.1、图像处理(灰度图、模糊图片、GaussianBlur函数、提取边缘、边缘膨胀、边缘细化)
OpenCV这么简单为啥不学——1.1、图像处理(灰度图、模糊图片、GaussianBlur函数、提取边缘、边缘膨胀、边缘细化)
113 0
|
机器学习/深度学习
深度学习数据增强方法-内含(亮度增强,对比度增强,旋转图图像,翻转图像,仿射变化扩充图像,错切变化扩充图像,HSV数据增强)七种方式进行增强-每种扩充一张实现7倍扩)+ 图像缩放代码-批量
深度学习数据增强方法-内含(亮度增强,对比度增强,旋转图图像,翻转图像,仿射变化扩充图像,错切变化扩充图像,HSV数据增强)七种方式进行增强-每种扩充一张实现7倍扩)+ 图像缩放代码-批量
|
7月前
|
机器学习/深度学习 算法 搜索推荐
【实操】数据扩增:Retinex算法用于图像颜色恢复和对比度增强
【实操】数据扩增:Retinex算法用于图像颜色恢复和对比度增强
141 0
【实操】数据扩增:Retinex算法用于图像颜色恢复和对比度增强
|
图形学
怎么修改模型的表面颜色?
在3D模型中,材质颜色是物体表面外观的重要组成部分。通过手动设置或从纹理图像中提取颜色值,可以为模型赋予丰富多彩的外观。
147 1
|
传感器 编解码 监控
Baumer工业相机堡盟相机如何使用Binning像素合并功能( Binning像素合并功能的优点和行业应用)(C++)(C#)
Baumer工业相机堡盟相机如何使用Binning像素合并功能( Binning像素合并功能的优点和行业应用)(C++)(C#)
269 0
|
机器学习/深度学习 算法 数据挖掘
传统图像处理之颜色特征
传统图像处理之颜色特征
266 0
传统图像处理之颜色特征
|
Web App开发 编解码
生成高精细节,新方法AligNeRF解决NeRF对齐问题
生成高精细节,新方法AligNeRF解决NeRF对齐问题
162 0
|
机器学习/深度学习 数据可视化 计算机视觉
NeurIPS 2022 | 一句话让三维模型生成逼真外观风格,精细到照片级细节
NeurIPS 2022 | 一句话让三维模型生成逼真外观风格,精细到照片级细节
146 0
|
编解码 数据可视化 UED
图像大面积缺失,也能逼真修复,新模型CM-GAN兼顾全局结构和纹理细节(2)
图像大面积缺失,也能逼真修复,新模型CM-GAN兼顾全局结构和纹理细节
334 0
|
机器学习/深度学习 算法 测试技术
图像大面积缺失,也能逼真修复,新模型CM-GAN兼顾全局结构和纹理细节(1)
图像大面积缺失,也能逼真修复,新模型CM-GAN兼顾全局结构和纹理细节
302 0