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

问题描述 投票:0回答:1

我正在尝试使用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的位置:

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

请注意,通道的底部从胶带到达的位置开始。看起来我几乎找不到那条确切的线,因为它在底部有多么嘈杂。现在这些没有形态学的阈值似乎可以提供更好的结果。我试图使用sobel衍生物而不是canny,但结果更差。

甚至可以在这个环境中获得精确的测量结果吗?是编码还是改变拍照方式或两者兼而有之?在未来,我可能需要在湍流期间绘制水剖面图,我是否应该简单地离开OpenCV,因为噪声太大了?任何帮助表示赞赏。

python opencv image-processing hough-transform houghlinesp
1个回答
1
投票

我不会投资任何使用该设置的图像处理。

如果您坚持图像处理(如果您只对几个位置的水平感兴趣,那么使用传统水平传感器可能会更好)

在盆的背面添加LED面板或任何其他类型的均匀背景照明。在水中加入染料以获得一些对比。摆脱窗口反射。清洁玻璃。或者将背景变暗并在水中添加一些使其成为杂散光或荧光的东西。

您还可以添加漂浮在表面上的东西,可以是逆向反射或自发光。这样您就可以获得一个明亮的表面水平指示器,可以在图像中轻松检测到。

© www.soinside.com 2019 - 2024. All rights reserved.