import cv2 import numpy as np # 定义颜色范围(以蓝色为例) lower_blue = np.array([100, 50, 50]) upper_blue = np.array([130, 255, 255]) # 初始化摄像头 cap = cv2.VideoCapture(0) while True: # 读取摄像头画面 ret, frame = cap.read() # 将画面转换到HSV颜色空间 hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) # 根据颜色范围创建掩膜 mask = cv2.inRange(hsv, lower_blue, upper_blue) # 对掩膜进行形态学操作,以去除噪点 mask = cv2.erode(mask, None, iterations=2) mask = cv2.dilate(mask, None, iterations=2) # 在掩膜中查找圆形轮廓 contours, hierarchy = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 初始化圆盘中心坐标 center = None # 如果找到了轮廓 if len(contours) > 0: # 找到最大的轮廓 c = max(contours, key=cv2.contourArea) # 计算最小外接圆 ((x, y), radius) = cv2.minEnclosingCircle(c) # 计算圆心坐标 M = cv2.moments(c) center = (int(M["m10"] / M["m00"]), int(M["m01"] / M["m00"])) # 绘制圆形和圆心 cv2.circle(frame, (int(x), int(y)), int(radius), (0, 255, 255), 2) cv2.circle(frame, center, 5, (0, 0, 255), -1) # 显示画面 cv2.imshow("Frame", frame) # 按下q键退出循环 if cv2.waitKey(1) & 0xFF == ord('q'): break # 释放摄像头和关闭窗口 cap.release() cv2.destroyAllWindows()
时间: 2024-04-10 22:30:00 浏览: 14
这段代码使用OpenCV库进行实时颜色识别和圆形检测。下面是代码的主要步骤:
1. 导入必要的库:cv2和numpy。
2. 定义颜色范围:使用lower_blue和upper_blue来定义蓝色的颜色范围。
3. 初始化摄像头:创建一个VideoCapture对象,打开默认的摄像头。
4. 进入主循环:不断读取摄像头的画面。
5. 转换颜色空间:将读取到的画面转换为HSV颜色空间,方便进行颜色识别。
6. 创建掩膜:根据颜色范围创建一个掩膜,将符合颜色范围的部分设为白色,其他部分设为黑色。
7. 形态学操作:对掩膜进行腐蚀和膨胀操作,以去除噪点。
8. 查找轮廓:使用findContours()函数在掩膜中查找轮廓。
9. 处理轮廓:找到最大的轮廓,并计算最小外接圆和圆心坐标。
10. 绘制结果:在原始画面上绘制检测到的圆形和圆心。
11. 显示画面:将处理后的画面显示出来。
12. 退出循环:按下q键退出循环。
13. 释放资源:释放摄像头对象和关闭窗口。
这段代码可以实时检测摄像头中的蓝色圆形,并在画面上显示检测结果。
相关问题
#!/usr/bin/env python # -*- coding: utf-8 -*- import cv2 import numpy as np import rospy from sensor_msgs.msg import Image from cv_bridge import CvBridge, CvBridgeError # 定义要识别的颜色范围 lower_color = np.array([19, 78, 44]) upper_color = np.array([74, 202, 129]) # 初始化cv_bridge bridge = CvBridge() # 定义回调函数,处理订阅到的图像 def image_callback(msg): # 将ROS图像格式转换为OpenCV图像格式 try: cv_image = bridge.imgmsg_to_cv2(msg, 'bgr8') except CvBridgeError as e: print(e) return # 转换颜色空间 hsv = cv2.cvtColor(cv_image, cv2.COLOR_BGR2HSV) # 根据颜色范围进行二值化 mask = cv2.inRange(hsv, lower_color, upper_color) # 寻找轮廓 _, contours, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) # 遍历轮廓 for contour in contours: # 计算轮廓面积 area = cv2.contourArea(contour) # 忽略面积较小的轮廓 if area < 100: continue # 计算轮廓的外接矩形 x, y, w, h = cv2.boundingRect(contour) # 在原图上绘制外接矩形 cv2.rectangle(cv_image, (x, y), (x + w, y + h), (0, 255, 0), 2) # 显示图像 cv2.imshow('frame', cv_image) cv2.waitKey(1) # 初始化节点 rospy.init_node('color_detection') # 订阅摄像头图像 image_sub = rospy.Subscriber('/usb_cam/image_raw', Image, image_callback) # 进入循环 rospy.spin() # 关闭窗口 cv2.destroyAllWindows() 帮我改成检测多种色值的
好的,以下是修改后的代码:
```python
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import cv2
import numpy as np
import rospy
from sensor_msgs.msg import Image
from cv_bridge import CvBridge, CvBridgeError
# 定义要识别的颜色范围
colors = {
'red': ([0, 50, 50], [10, 255, 255]),
'green': ([36, 25, 25], [86, 255, 255]),
'blue': ([100, 50, 50], [130, 255, 255])
}
# 初始化cv_bridge
bridge = CvBridge()
# 定义回调函数,处理订阅到的图像
def image_callback(msg):
# 将ROS图像格式转换为OpenCV图像格式
try:
cv_image = bridge.imgmsg_to_cv2(msg, 'bgr8')
except CvBridgeError as e:
print(e)
return
# 转换颜色空间
hsv = cv2.cvtColor(cv_image, cv2.COLOR_BGR2HSV)
# 遍历所有颜色范围,进行二值化和轮廓检测
for color_name, color_range in colors.items():
lower_color = np.array(color_range[0])
upper_color = np.array(color_range[1])
mask = cv2.inRange(hsv, lower_color, upper_color)
_, contours, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# 遍历轮廓,绘制外接矩形
for contour in contours:
area = cv2.contourArea(contour)
if area < 100:
continue
x, y, w, h = cv2.boundingRect(contour)
cv2.rectangle(cv_image, (x, y), (x + w, y + h), (0, 255, 0), 2)
# 显示图像
cv2.imshow('frame', cv_image)
cv2.waitKey(1)
# 初始化节点
rospy.init_node('color_detection')
# 订阅摄像头图像
image_sub = rospy.Subscriber('/usb_cam/image_raw', Image, image_callback)
# 进入循环
rospy.spin()
# 关闭窗口
cv2.destroyAllWindows()
```
在上述代码中,我们定义了一个字典 `colors`,其中包含要识别的多种颜色的范围。然后我们遍历所有颜色范围,进行二值化和轮廓检测,并在原图上绘制外接矩形。
import numpy as np import cv2 Key_Esc = 27 cap = cv2.VideoCapture(0) lower_blue = np.array([110, 50, 50]) upper_blue = np.array([130, 255, 255]) while True: ret, frame = cap.read() # hsv变换 hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) mask = cv2.inRange(hsv, lower_blue, upper_blue) res = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) if len(res) == 2: # python3 写法 contours, hierarchy = res elif len(res) == 3: # python2 写法 _, contours, hierarchy = res # 用黄色绘制出轮廓(BGR 0,255,255) cv2.drawContours(frame, contours, -1, (0, 255, 255), thickness=2) # 显示处理结果 cv2.imshow('detected', np.rot90(cv2.resize(frame, (320, 240)))) # cv2.imshow('mask', np.rot90(cv2.resize(mask,(320,240))) ) # 按q键退出,不加这一句可能无法正常显示图像 if cv2.waitKey(1) == Key_Esc: break cap.release() cv2.destroyAllWindows()
这段代码是使用Python语言编写的,主要是导入了numpy和cv2两个库。定义了一个常量Key_Esc等于27,表示按下Esc键退出程序。通过cv2.VideoCapture(0)打开电脑的摄像头,lower_blue和upper_blue是蓝色区间的下限和上限。在while循环中,不断读取摄像头的画面,并进行处理。