基于Python与OpenCV的像素距离测量技术求助(树莓派场景)
树莓派摄像头蓝色识别区域底边长度测量实操方案
嘿,作为刚入坑OpenCV和计算机视觉的新手,你能搞定实时蓝色识别已经超厉害了!针对你要测量那个白加黑方形框底边长度的需求,我给你整理了一套实操方案,一步步来就行:
核心思路先理清楚
你说的识别区域是白色矩形加黑色矩形组成的方形框,那我们的核心逻辑就是:先定位这个方形框的轮廓,找到底边的两个端点,最后计算像素距离(如果要真实物理长度,还得做个像素校准)。
具体步骤+代码调整建议
1. 先给二值图做去噪预处理
你已经得到了蓝区变白、其余变黑的二值图,先给它做个去噪,避免小杂点干扰后续的轮廓检测,用高斯模糊就很实用:
# 假设你的二值化识别结果存在mask变量里 blurred_mask = cv2.GaussianBlur(mask, (5,5), 0)
2. 检测方形框的目标轮廓
用OpenCV的轮廓检测函数找出图像里的轮廓,然后筛选出我们要的方形框——毕竟方形框的轮廓应该是4个顶点,再配合面积阈值过滤掉小噪点:
# 提取轮廓,只找最外层的 contours, hierarchy = cv2.findContours(blurred_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) target_contour = None # 遍历所有轮廓,找到我们要的方形框 for cnt in contours: area = cv2.contourArea(cnt) # 这里的面积阈值你可以根据实际场景调整,过滤掉太小的噪点 if area > 1000: # 把轮廓近似成多边形,方形的话应该是4个点 epsilon = 0.02 * cv2.arcLength(cnt, True) approx = cv2.approxPolyDP(cnt, epsilon, True) if len(approx) == 4: target_contour = approx break
3. 提取底边端点并计算长度
找到方形框的4个顶点后,我们通过y坐标判断底边(图像里y值越大越靠下),取y值最大的两个点就是底边端点,然后计算两点间的距离:
if target_contour is not None: # 把轮廓里的顶点转换成(x,y)坐标列表 points = [pt[0] for pt in target_contour] # 按y坐标从大到小排序,取前两个就是底边的两个端点 points_sorted = sorted(points, key=lambda p: p[1], reverse=True) bottom_points = points_sorted[:2] # 计算像素长度 import math bottom_length = math.hypot(bottom_points[0][0] - bottom_points[1][0], bottom_points[0][1] - bottom_points[1][1]) print(f"底边像素长度: {bottom_length:.2f}") # 如果需要真实物理长度,得先做校准:比如拿个已知长度的物体放在摄像头前,记录它的像素长度,算出比例 # 比如已知10cm的物体对应200像素,那比例就是0.05cm/像素,真实长度=bottom_length*0.05
4. 可视化验证(可选但很实用)
可以把检测到的轮廓和底边画在画面上,直观确认是不是找对了:
if target_contour is not None: # 画绿色轮廓 cv2.drawContours(frame, [target_contour], -1, (0,255,0), 2) # 画红色底边 cv2.line(frame, tuple(bottom_points[0]), tuple(bottom_points[1]), (0,0,255), 3) # 显示长度数值 cv2.putText(frame, f"Length: {bottom_length:.2f}", (10,30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,255,0), 2) cv2.imshow('Result', frame)
几个小提醒
- 如果方形框的黑色部分是空心的,轮廓可能断成好几段,可以先用
cv2.dilate()膨胀二值图,让轮廓连起来; - 像素转真实长度的校准一定要做,不同距离下像素对应的物理长度差很多;
- 轮廓检测的参数(面积阈值、近似系数)可以根据你的实际场景微调,直到准确识别方形框。
内容的提问来源于stack exchange,提问作者Billy Morelli




