OpenCV Python激光点追踪:提取并存储x、y坐标至独立变量
提取激光点的X、Y坐标并存储到独立变量
嘿,我来帮你搞定这个激光点坐标提取的问题!你的基础代码已经做好了颜色掩码的部分,接下来只需要加上几步就能拿到激光点的坐标啦。
核心思路是:在生成的掩码(mask)里找到激光点的轮廓,然后通过计算轮廓的质心来得到它的中心坐标,这样就能把坐标存到独立变量里了。下面是修改后的完整代码,我加了详细注释:
import cv2 import numpy as np cap = cv2.VideoCapture(0) while (1): # 读取每一帧 ret, frame = cap.read() if not ret: break # 如果没读到帧,直接跳出循环 # 转换到HSV颜色空间 hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) # 定义红色的HSV范围(你可以根据实际激光颜色微调这个范围) lower_red = np.array([0, 0, 255]) upper_red = np.array([255, 255, 255]) # 创建颜色掩码 mask = cv2.inRange(hsv, lower_red, upper_red) # -------------------------- 新增部分:提取激光点坐标 -------------------------- # 从掩码中查找轮廓 contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 初始化坐标变量(默认值,防止没检测到激光时报错) cx, cy = -1, -1 if contours: # 找到面积最大的轮廓(激光点应该是画面中最亮的区域,面积最大) largest_contour = max(contours, key=cv2.contourArea) # 计算轮廓的矩,用来求质心 moments = cv2.moments(largest_contour) # 避免除以0的情况(当轮廓面积为0时跳过) if moments['m00'] != 0: # 计算质心的X、Y坐标 cx = int(moments['m10'] / moments['m00']) cy = int(moments['m01'] / moments['m00']) # 可选:在帧上画个小圆圈标记激光点位置,方便可视化 cv2.circle(frame, (cx, cy), 5, (0, 255, 0), -1) # 现在cx和cy就是激光点的X、Y坐标啦,你可以直接用这两个变量做后续处理 print(f"激光点坐标:X={cx}, Y={cy}") # --------------------------------------------------------------------------- # 显示窗口 cv2.imshow('mask', mask) cv2.imshow('Track Laser', frame) # 按q退出 if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows()
关键步骤说明:
cv2.findContours:从掩码图像中识别所有的轮廓,我们只取最外层的轮廓(RETR_EXTERNAL),并用简化的方式存储轮廓点(CHAIN_APPROX_SIMPLE)。- 筛选最大轮廓:因为激光点通常是画面中最显眼的高亮区域,所以面积最大的轮廓大概率就是我们要找的激光点。
- 计算矩与质心:通过轮廓的矩信息,我们可以算出它的中心位置,这就是激光点的坐标,最终存到
cx(X坐标)和cy(Y坐标)两个独立变量里。 - 异常处理:加了
moments['m00'] != 0的判断,防止当没有有效轮廓时出现除以0的错误;同时初始化坐标为-1,方便你判断是否检测到了激光点。
这样修改后,你就能随时调用cx和cy来获取激光点的实时坐标啦!
内容的提问来源于stack exchange,提问作者jomsamago
相关产品推荐
相关产品推荐

