我正在尝试使用OpenCV和Python测量玻璃通道中的水位。我决定在选定的ROI中使用HaughLines,并找到所述线的中点,这样我就可以计算出想要的线之间的差,然后将其乘以设定的参考尺寸,稍后再进行参考。到目前为止,我发现线条的部分看起来像这样:
import cv2
import numpy as np
def midpoint(ptA, ptB, ptC, ptD):
return ((ptA + ptC) * 0.5, (ptB + ptD) * 0.5)
img = cv2.imread("b2924.JPG")
img = cv2.resize(img, None, fx=3/10, fy=3/10)
r = cv2.selectROI("main", img, False, False)
cropped = img[r[1]:(r[1]+r[3]), r[0]:(r[0]+r[2])]
cv2.destroyWindow("main")
imgray = cv2.cvtColor(cropped, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(imgray, 35, 75)
lines = cv2.HoughLinesP(edges, 1, np.pi/180, 75, maxLineGap=1000)
midPoint = []
for line in lines:
x1, y1, x2, y2 = line[0]
cv2.line(cropped, (x1, y1), (x2, y2), (0, 0, 255), 1)
mP = midpoint(x1, y1, x2, y2)
midPoint.append(mP)
midPoint.sort(key = lambda x: x[1])
img[r[1]:(r[1]+r[3]), r[0]:(r[0]+r[2])] = cropped
print(lines)
print(midPoint)
cv2.imshow("img", img)
cv2.waitKey()
cv2.destroyAllWindows()
根据图像和ROI,我发现不一致的结果。图片示例以及选择投资回报率的位置:
请注意,通道的底部从管道胶带到达的位置开始。看来我几乎永远找不到那条确切的线,因为它的噪音到底有多大。目前,这些没有形态的阈值似乎可以提供更好的结果。我也尝试使用sobel
而不是canny
的导数,但结果却更糟。
在这种环境下甚至有可能获得准确的测量结果吗?是编码还是更改我拍摄照片的方式或者两者兼而有之?将来我可能需要绘制湍流期间的水廓线图,为此我是否应该简单地离开OpenCV,因为噪声太大了?任何帮助表示赞赏。
答案 0 :(得分:1)
使用该设置,我不会投资任何图像处理。
如果您坚持要进行图像处理(如果您只对几个位置的水位感兴趣,那么使用传统的水位传感器可能会更好)
在水池的后部添加LED面板或任何其他种类的均匀背景照明。将染料加到水中以形成对比。 摆脱窗口反射。清洁玻璃。 或者,使背景变暗并在水中添加一些使其成为杂散光或荧光的东西。
您还可以添加漂浮在表面上的材料,这些材料可以是反光的或自发光的。这样,您将获得可以在图像中轻松检测到的明亮的表面液位指示器。