OpenCV水瓶水位线合格检测
时间: 2025-01-01 12:28:53 浏览: 9
### 使用OpenCV实现水瓶水位线的自动检测与合格判定
为了实现这一目标,可以采用类似于车道线检测的方法[^3]。具体来说,整个过程涉及图像预处理、边缘检测以及直线拟合等步骤。
#### 图像采集
首先需要获取待测瓶子的照片或视频流帧作为输入源。确保拍摄角度垂直于水面且光线均匀分布以减少干扰因素影响最终效果。
#### 预处理阶段
对原始图像执行灰度化转换并应用高斯模糊滤波器去除噪声:
```python
import cv2
import numpy as np
def preprocess_image(image_path):
img = cv2.imread(image_path, 1)
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blurred_img = cv2.GaussianBlur(gray_img,(5,5),0)
return blurred_img
```
#### 边缘提取
通过Canny算子计算梯度幅值和方向,并设定合适的高低阈值得到二值化的边界图谱;对于液体表面而言,其轮廓通常较为平滑连续,在此情况下可适当降低低阈值参数以便更好地捕捉细节特征[^4]:
```python
def detect_edges(blurred_img):
edges = cv2.Canny(blurred_img, threshold1=80, threshold2=150)
return edges
```
#### 提取ROI (感兴趣区域)
考虑到实际应用场景中可能存在其他物体遮挡等问题,因此有必要限定一个合理的矩形范围用于后续分析操作。可以通过实验确定最佳裁剪位置从而提高准确性:
```python
def get_roi(edges, roi_coords=(100, 200, 700, 900)):
x_start, y_start, x_end, y_end = roi_coords
cropped_edges = edges[y_start:y_end,x_start:x_end]
return cropped_edges
```
#### Hough变换寻找水平线条
针对已经过筛选后的候选像素点集运用霍夫变换算法识别出最有可能代表液面高度变化趋势的一组平行线段集合。由于容器形状固定不变,则只需关注位于顶部附近符合条件的结果即可完成初步判断工作:
```python
def find_waterline(cropped_edges):
linesP = cv2.HoughLinesP(cropped_edges,rho=1,theta=np.pi/180,minLineLength=10,maxLineGap=5)
water_lines = []
if linesP is not None:
for i in range(0,len(linesP)):
l = linesP[i][0]
# Filter nearly horizontal lines only
angle = abs(np.arctan((l[3]-l[1])/(l[2]-l[0]+1e-5)) * 180 /np.pi )
if(angle<10):
water_lines.append(l)
return water_lines
```
最后一步就是根据所获得的数据制定相应的规则来评估是否满足质量标准。例如当检测到多条接近同一水平位置的短线段时即认为当前样本属于正常状态反之则视为不合格产品。
阅读全文