OpenCV 实时识别赛道边缘线并计算黑色赛道中点
要实时识别赛道的两边线并找出标记灰度处理下黑色赛道的中点,可以使用OpenCV库进行图像处理和计算。
首先,读取实时视频流或者打开一个视频文件:
import cv2
cap = cv2.VideoCapture(0) # 读取实时视频流
# 或者
cap = cv2.VideoCapture('video.mp4') # 打开视频文件
然后,使用循环逐帧处理视频:
while True:
ret, frame = cap.read() # 读取视频帧
if not ret:
break
# 对帧进行灰度处理
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 对灰度图像进行二值化处理,将赛道标记为白色,背景标记为黑色
_, binary = cv2.threshold(gray, 100, 255, cv2.THRESH_BINARY)
# 进行边缘检测
edges = cv2.Canny(binary, 50, 150)
# 进行霍夫直线检测,找出赛道的两边线
lines = cv2.HoughLinesP(edges, 1, np.pi/180, threshold=100, minLineLength=100, maxLineGap=50)
if lines is not None:
for line in lines:
x1, y1, x2, y2 = line[0]
cv2.line(frame, (x1, y1), (x2, y2), (0, 255, 0), 2)
# 找出黑色赛道中点
contours, _ = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
if contours:
# 找出最大的轮廓
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, 0, 255), -1)
cv2.imshow('frame', frame)
if cv2.waitKey(1) == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
在以上代码中,我们首先将每一帧的图像转换为灰度图像,然后通过二值化将赛道标记为白色,背景标记为黑色。接着进行边缘检测,以便后续的霍夫直线检测。找到赛道的两边线后,使用cv2.findContours函数找出黑色赛道的轮廓,并从中计算出中点坐标。最后,在原始图像上显示出找到的线和中点。
请注意,以上代码仅提供了一个大致的实现思路,具体参数的设置可能需要根据实际情况进行调整。此外,为了获得更好的效果,你可能需要进行一些预处理操作,如图像增强、噪声去除等。
原文地址: https://www.cveoy.top/t/topic/bUHe 著作权归作者所有。请勿转载和采集!