实验环境
(1)硬件环境
机械臂一台:具备视觉引导抓取功能的机械臂设备
摄像头:与机械臂联动的视觉采集设备,用于颜色识别
颜色样本:红、绿、蓝、黄四种颜色的待抓取物体
(2)软件环境
Vmware虚拟环境:运行Ubuntu系统的虚拟化平台
Python 3.x 环境:支持OpenCV和视觉识别库运行
OpenCV库:用于图像处理和颜色识别的计算机视觉库
Jupyter Notebook:用于运行和调试颜色识别代码的交互式环境
实验步骤
注意:请确保摄像头视觉范围内出现待测颜色(红、绿、蓝、黄)。
- 启动虚拟机,在Windows电脑中,使用Vmware运行Ubuntu系统。
- 找到路径
/Home/Dofbot/6.AI_Visual/3.color_grab.ipynb,右击选择用Jupyter Notebook启动,输入密码shujia。 - 按照代码单元顺序逐步执行(不可一次性运行全部),最后一个单元用于退出线程。
- 观察颜色识别效果,确保机械臂能正确识别并定位目标颜色物体。
实验结果
-
- 红色方块
-
- 蓝色方块
-
- 绿色方块
-
- 黄色方块
主要代码
代码路径:/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值(色相)判断颜色类型,并动态调整识别阈值。三个图像窗口分别展示原始图像、颜色掩码(目标颜色为白色)和识别结果(仅保留目标颜色),为机械臂抓取提供视觉定位依据。
