OpenCV Python使用HoughLinesP()算法测量距离以确定水位

OpenCV Python使用HoughLinesP()算法测量距离以确定水位,python,opencv,image-processing,hough-transform,houghlinesp,Python,Opencv,Image Processing,Hough Transform,Houghlinesp,我正在尝试使用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)

我正在尝试使用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,我发现结果不一致。图像示例以及我选择ROI的位置:

请注意,通道的底部从管道胶带到达的位置开始。看起来我几乎永远也找不到那条准确的线,因为它的底部有多吵。目前,这些没有形态学的阈值似乎给出了更好的结果。我试着用索贝尔导数来代替精明的,但结果更糟


在这种环境下,甚至可以得到精确的测量值吗?这是一个编码或改变我拍照方式的问题,还是两者兼而有之?在未来,我可能需要绘制强湍流期间的水剖面图,我是否应该因为噪音太大而离开OpenCV?非常感谢您的任何帮助。

我不会用这种设置投资任何图像处理

如果您坚持图像处理(如果您只对几个位置的液位感兴趣,则最好使用传统的液位传感器)

在洗脸盆背面添加LED面板或任何其他类型的均匀背景照明。在水中加入染料以获得一些对比度。 消除窗口反射。把玻璃杯擦干净。 或者,将背景调暗,并在水中添加一些东西,使其发出杂散光或荧光


您还可以添加漂浮在表面上的东西,这些东西可以是反光的,也可以是自发光的。这样,你就可以得到一个明亮的表面水平指示器,很容易在图像中检测到。

也许是一个实用的,而不是一个计算性的评论:如果你可以调整你的实验设置,你可以让你的生活更轻松:在几个地方将繁文缛节垂直地贴在试验室的后面。这将允许您通过对红色通道设置阈值并使用水创建的锐利边缘来获取高度数据(请参见框左侧标记roi的垂直光束)是的,我在想类似的事情,也许在底座上放一条深色的胶带,把它变成一个尖锐的水平边缘,再加上从近距离拍摄照片。也许我应该这样做,然后更新帖子,因为看起来我就是不能摆脱噪音,同时保持水边@扭曲水是恒定流动的,这是一个相当大的盆,所以我必须不断地注入染料。这里的水也很硬,所以玻璃不可能变得那么干净。用于反射、LED和反射器;我认为它们根本超出了我们的预算。谢谢你的回复,不过,我会看看我是否可以得到至少一个这些东西@小猪