Python图像处理:利用OpenCV识别物体并获取位置信息
这段代码使用 Python 和 OpenCV 库来识别图像中的特定物体并获取其位置信息。
def find_box(img, color_name):
global chest_circle_x, chest_circle_y
if Chest_img is None:
print('等待获取图像中...')
time.sleep(0.3)
else:
box_img = img
box_img_bgr = cv2.cvtColor(box_img, cv2.COLOR_RGB2BGR) # 将图片转换到BRG空间
box_img_hsv = cv2.cvtColor(box_img, cv2.COLOR_BGR2HSV) # 将图片转换到HSV空间
box_img = cv2.GaussianBlur(box_img_hsv, (3, 3), 0) # 高斯模糊
box_img_mask = cv2.inRange(box_img, color_range[color_name][0], color_range[color_name][1]) # 二值化
box_img_closed = cv2.erode(box_img_mask, None, iterations=2) # 腐蚀
box_img_opened = cv2.dilate(box_img_mask, np.ones((4, 4), np.uint8), iterations=2) # 膨胀 先腐蚀后运算等同于开运算
(contours, hierarchy) = cv2.findContours(box_img_opened, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
if len(contours) != 0:
area = []
for cn in contours:
contour_area = math.fabs(cv2.contourArea(cn))
area.append(contour_area)
max_index = np.argmax(area)
(chest_circle_x, chest_circle_y), chest_radius = cv2.minEnclosingCircle(contours[max_index])
cv2.circle(img, (int(chest_circle_x), int(chest_circle_y)), int(chest_radius), (0, 0, 255))
print('A', 'x=', chest_circle_x, 'y=', chest_circle_y)
if Debug:
# cv2.imwrite('image.png',img)
cv2.imshow("Box", img)
cv2.waitKey(2000)
else:
print('正在寻找目标')
# box_img 是什么
box_img 是一个代表图像的变量,在这段代码中,它被赋值为 img,并且被用于进行颜色空间转换、高斯模糊、二值化、腐蚀和膨胀等一系列操作。这样做是为了从原始图像中提取出我们需要的信息,以便后续处理。
# contours 有什么用
contours 是指找到的轮廓信息,它包含了所有被识别出来的物体的封闭边界。在这段代码中,通过使用 OpenCV 中的 findContours() 函数,可以在经过一系列图像处理操作后得到所有的轮廓信息,从而提取出包含我们需要的物体的轮廓信息。具体来说,我们可以利用 contours 中的数据来计算物体的面积、周长、重心等属性,并且在图像上标记出这些物体的位置和形状。通过这些操作,我们可以更加方便地对物体进行跟踪和识别。
# area 是什么内容:
area 是一个列表变量,用于存储所有轮廓的面积信息。在这段代码中,我们利用 cv2.contourArea() 函数计算每个轮廓的面积,并将其存储在 area 列表中。最终,我们可以通过比较不同轮廓的面积大小,找到包含目标物体的轮廓,并从中提取出需要的信息。
### 代码分析
1. **颜色空间转换**: 代码首先将图像从 RGB 颜色空间转换为 HSV 颜色空间,因为 HSV 颜色空间更容易进行颜色识别。
2. **高斯模糊**: 接着,代码对图像进行高斯模糊处理,以平滑图像,去除噪声。
3. **二值化**: 代码使用 cv2.inRange() 函数对图像进行二值化处理,将符合指定颜色范围的像素设置为白色,其他像素设置为黑色,从而得到一个二值化的图像。
4. **腐蚀和膨胀**: 代码使用 cv2.erode() 和 cv2.dilate() 函数对二值化图像进行腐蚀和膨胀操作,以去除图像中的细小噪声,并使目标物体更明显。
5. **轮廓提取**: 代码使用 cv2.findContours() 函数提取图像中的轮廓信息。
6. **面积计算**: 代码计算每个轮廓的面积,并将其存储在 area 列表中。
7. **最大轮廓提取**: 代码找到面积最大的轮廓,并将其作为目标物体。
8. **坐标获取**: 代码使用 cv2.minEnclosingCircle() 函数计算目标物体的最小外接圆,并得到目标物体的圆心坐标。
9. **绘制圆形**: 代码使用 cv2.circle() 函数在图像上绘制目标物体的圆形,并显示其坐标。
### 总结
这段代码使用 OpenCV 库,通过一系列图像处理操作,识别图像中的目标物体并获取其位置信息。这在许多应用场景中都非常有用,例如自动驾驶、机器人视觉、目标跟踪等。
原文地址: https://www.cveoy.top/t/topic/ga7G 著作权归作者所有。请勿转载和采集!