实验环境

(1)硬件环境

机械臂一台:具备视觉引导抓取功能的机械臂设备
摄像头:与机械臂联动的视觉采集设备,用于颜色识别
颜色样本:红、绿、蓝、黄四种颜色的待抓取物体

(2)软件环境

Vmware虚拟环境:运行Ubuntu系统的虚拟化平台
Python 3.x 环境:支持OpenCV和视觉识别库运行
OpenCV库:用于图像处理和颜色识别的计算机视觉库
Jupyter Notebook:用于运行和调试颜色识别代码的交互式环境

实验步骤

注意:请确保摄像头视觉范围内出现待测颜色(红、绿、蓝、黄)。
  1. 启动虚拟机,在Windows电脑中,使用Vmware运行Ubuntu系统。
  2. 找到路径 /Home/Dofbot/6.AI_Visual/3.color_grab.ipynb,右击选择用Jupyter Notebook启动,输入密码 shujia
  3. 按照代码单元顺序逐步执行(不可一次性运行全部),最后一个单元用于退出线程。
  4. 观察颜色识别效果,确保机械臂能正确识别并定位目标颜色物体。

实验结果

红色方块
蓝色方块
绿色方块
黄色方块

主要代码

代码路径:/Home/Dofbot/6.AI_Visual/3.color_grab.ipynb
说明:以下代码内容需要根据实际每一步执行,不能一次性运行全部,运行最后一个单元会直接退出线程。

1. BGR8转JPEG格式:

import enum
import cv2
def bgr8_to_jpeg(value, quality=75):
    return bytes(cv2.imencode('.jpg', value)[1])

2. 摄像头组件显示:

import traitlets
import ipywidgets.widgets as widgets
import time
# 线程功能操作库
import threading
import inspect
import ctypes
origin_widget = widgets.Image(format='jpeg', width=320, height=240)
mask_widget = widgets.Image(format='jpeg',width=320, height=240)
result_widget = widgets.Image(format='jpeg',width=320, height=240)
# 创建一个水平框容器,将图像小部件相邻放置
image_container = widgets.HBox([origin_widget, mask_widget, result_widget])
display(image_container)

3. 获取颜色的HSV值:

def get_color(img):
    H = []
    color_name={}
    img = cv2.resize(img, (640, 480), )
    # 将彩色图转成HSV
    HSV = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    # 画矩形框
    cv2.rectangle(img, (280, 180), (360, 260), (0, 255, 0), 2)
    # 依次取出每行每列的H值放入容器中
    for i in range(280, 360):
        for j in range(180, 260): 
            H.append(HSV[j, i][0])
    # 分别计算出H的最大最小
    H_min = min(H);H_max = max(H)
    # 判断颜色
    if H_min >= 0 and H_max <= 10 or H_min >= 156 and H_max <= 180:
        color_name['name'] = 'red'
    elif H_min >= 26 and H_max <= 34: 
        color_name['name'] = 'yellow'
    elif H_min >= 35 and H_max <= 78: 
        color_name['name'] = 'green'
    elif H_min >= 100 and H_max <= 124: 
        color_name['name'] = 'blue'
    return img, color_name

4. 主进程:识别红绿蓝黄颜色

import cv2
import numpy as np
import ipywidgets.widgets as widgets
cap = cv2.VideoCapture(0)
cap.set(3, 640)
cap.set(4, 480)
cap.set(5, 30) #设置帧率
cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter.fourcc('M', 'J', 'P', 'G'))
# 默认选择红色,程序会自动根据方框中检测到的颜色切换
# 红色区间
color_lower = np.array([0, 43, 46])
color_upper = np.array([10, 255, 255])

def Color_Recongnize():
    while(1):
        # 获取视频帧并处理
        ret, frame = cap.read()
        frame, color_name = get_color(frame)
        
        if len(color_name)==1:
            global color_lower
            global color_upper
            # 根据识别到的颜色更新HSV阈值
            if color_name['name'] == 'yellow':
                color_lower = np.array([26, 43, 46])
                color_upper = np.array([34, 255, 255])
            elif color_name['name'] == 'red':
                color_lower = np.array([0, 43, 46])
                color_upper = np.array([10, 255, 255])
            elif color_name['name'] == 'green':
                color_lower = np.array([35, 43, 46])
                color_upper = np.array([77, 255, 255])
            elif color_name['name'] == 'blue':
                color_lower=np.array([100, 43, 46])
                color_upper = np.array([124, 255, 255])
        
        # 更新原始图像显示
        origin_widget.value = bgr8_to_jpeg(frame)
        
        # 转换为HSV格式
        hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
        
        # 获取颜色掩码
        mask = cv2.inRange(hsv, color_lower, color_upper)
        mask_widget.value = bgr8_to_jpeg(mask)
        
        # 获取识别结果
        res = cv2.bitwise_and(frame, frame, mask=mask)
        result_widget.value = bgr8_to_jpeg(res)
        
        time.sleep(0.01)

cap.release()
#cv2.destroyAllWindows()
代码说明:本实验通过HSV颜色空间实现颜色识别,核心是将BGR图像转换为HSV格式后,利用颜色阈值范围提取目标颜色。程序在图像中心绘制绿色采样框,通过分析框内像素的H值(色相)判断颜色类型,并动态调整识别阈值。三个图像窗口分别展示原始图像、颜色掩码(目标颜色为白色)和识别结果(仅保留目标颜色),为机械臂抓取提供视觉定位依据。