1. 取边界拟合四线交点取中
这个是个人感觉自由度最大的,应该也是可以达到的精度上限最高的,也支持图像的旋转,如果筛选直线的方法得当对于线的相交角度也没特殊要求,但是手动计算量也较大;本人实现的取四条直线的方法具有局限性,这里只写思路
- 图片转灰度图
- cv::Canny取边界
- cv.HoughLinesP拟合直线
- 筛选符合条件的四条边界直线(筛选直线最为麻烦,若图像清晰且边界平行固然好办,但是低像素低画质直线之间大概率不平行,筛选难度指数上升,但是计算的值也是最好的,对图片边界要求中等)
- 四条直线求交点
- 四交点累加取中心
优势:即使只识别到两条最大不相似直线(例如求十字中心,最长且接近垂直的两条线一定是符合需求的)也可以计算出来一个附近值,偏差大致为线宽/2(假设十字线等宽)
坑处:如果需要低画质高精度,基本达不到,摄像头像素变化严重,边界也会波动,部分直线斜率一直波动
2. 边界像素直方图取四点取中
使用OpenCV自带的库整个流程计算较快,较为简单
- 图片转灰度图
- cv::Canny取边界
- 白色像素映射到X轴,可生成X轴像素分布直方图
- 白色像素映射到Y轴,可生成Y轴像素分布直方图
- 各取最大的两列、第二大的两列
- X轴(X1+X2)/2
- Y轴(y1+y2)/2
- 中心可得
优点:流程简单、计算速度快
缺点:不支持旋转,只支持横向纵向交叉,如果目标太窄、边界毛糙容易有较大误差
3. 图像自动阈值二值化拟合四直线取交点取中
- 图片转灰度图
- 自适应阈值图片二值化cv.adaptiveThreshold
- 可选开闭运算去除噪点
- 图片细化
- 接下来拟合直线类似于取边界拟合四线交点取中
优点:支持旋转等
缺点:筛选直线能气死,不过自适应阈值得到的图片进行拟合直线要比直接灰度图提取边界拟合要规整
4. 图像自动阈值二值化像素直方图最大取四点取中
- 图片转灰度图
- 自适应阈值图片二值化cv.adaptiveThreshold
- 可选开闭运算去除噪点
- 图片细化
- 白色像素映射到X轴,可生成X轴像素分布直方图
- 白色像素映射到Y轴,可生成Y轴像素分布直方图
- 各取最大的两列、第二大的两列
- X轴(X1+X2)/2
- Y轴(y1+y2)/2
- 中心可得
优点:流程简单、计算速度快
缺点:不支持旋转,只支持横向纵向交叉
5. HSV过滤颜色掩膜
- 掩膜获取后可以支持多种操作
- 细化取交点直方图取交点、细化拟合直线取交点、掩膜提取边界拟合直线取交点等
- 缺点也很明显,只支持横纵、图片质量差误差大、计算复杂
6. 这里给出2、4的示例代码
[code]from ast import mainimport cv2 as cvimport osimport numpy as npimport matplotlib.pyplot as plt# 获取文件夹下所有文件def get_file_list(path): file_list = [] for root, dirs, files in os.walk(path): for file in files: file_list.append(os.path.join(root, file)) return file_listdef remove_contours(img,area): contours, _ = cv.findContours(img, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE) n = len(contours) # 轮廓的个数 cv_contours = [] for contour in contours: area = cv.contourArea(contour) if area |