OpenCV Python 库实现红线寻迹程序:左右拐弯、T型路口和直线
以下是使用 OpenCV 库实现根据红线进行寻迹的 Python 程序示例代码:
import cv2
import numpy as np
# 设置视频文件路径或摄像头索引
video_path = 'path_to_video_file' # 替换为实际的视频文件路径,或者使用摄像头输入时设置为0
cap = cv2.VideoCapture(video_path)
# 设置红色阈值范围
lower_red = np.array([0, 100, 100])
upper_red = np.array([10, 255, 255])
lower_red2 = np.array([160, 100, 100])
upper_red2 = np.array([179, 255, 255])
while True:
# 读取视频帧
ret, frame = cap.read()
if not ret:
break
# 转换颜色空间为HSV
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
# 对红色进行阈值分割
mask1 = cv2.inRange(hsv, lower_red, upper_red)
mask2 = cv2.inRange(hsv, lower_red2, upper_red2)
mask = cv2.bitwise_or(mask1, mask2)
# 进行形态学操作,填充空洞并去除噪声
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)
# 寻找轮廓
contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 寻找最大轮廓
if len(contours) > 0:
max_contour = max(contours, key=cv2.contourArea)
# 计算最大轮廓的质心
M = cv2.moments(max_contour)
if M['m00'] != 0:
cx = int(M['m10'] / M['m00'])
cy = int(M['m01'] / M['m00'])
# 在图像上绘制质心
cv2.circle(frame, (cx, cy), 5, (0, 255, 0), -1)
# 判断质心位置,进行相应的动作
if cx < frame.shape[1] // 2:
print('向左转')
# 执行向左转的动作
elif cx > frame.shape[1] // 2:
print('向右转')
# 执行向右转的动作
else:
print('直行')
# 执行直行的动作
# 显示图像
cv2.imshow('Frame', frame)
cv2.imshow('Mask', mask)
# 按下q键退出程序
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放视频流和关闭窗口
cap.release()
cv2.destroyAllWindows()
请确保安装了 OpenCV 库,并将 path_to_video_file 替换为实际的视频文件路径。如果要使用摄像头输入,请将 video_path 设置为 0。
该程序从视频文件或摄像头读取帧,将帧转换为 HSV 颜色空间,通过设定的红色阈值范围对图像进行阈值分割,然后进行形态学操作以填充空洞并去除噪声。接下来,程序寻找轮廓,并找到最大轮廓的质心。根据质心的位置,程序判断执行相应的动作(向左转、向右转或直行),并在图像上绘制质心。最后,程序显示图像,并通过按下 q 键退出程序。
原文地址: http://www.cveoy.top/t/topic/fOAW 著作权归作者所有。请勿转载和采集!