如何检测透明容器中的水位?

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

我正在使用opencv-python库来进行液位检测。到目前为止,我能够将图像转换为灰度并应用精明的边缘检测来识别容器。

import numpy as np
import cv2
import math
from matplotlib import pyplot as plt
from cv2 import threshold, drawContours


img1 = cv2.imread('botone.jpg')
kernel = np.ones((5,5),np.uint8)
#convert the image to grayscale
imgray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(imgray,120,230)

我需要知道如何从这个阶段找到水位。 我应该尝试机器学习,还是有其他可用的选项或算法?

我采取了一种方法来找出边缘检测图像中的水平线。如果水平线超过某个阈值我可以认为它是水平的。但结果不一致。

我想知道是否还有其他可以采用的方法或白皮书可供参考?

python-2.7 opencv image-processing
2个回答
3
投票

我不知道你会如何使用

numpy
opencv
来做到这一点,因为我使用 ImageMagick(它安装在大多数 Linux 发行版上,并且可用于 OSX 和 Windows),但这个概念应该适用。

首先,我可能会选择旋转索贝尔滤波器以查找水平边缘 - 即方向滤波器。

convert chemistry.jpg -morphology Convolve Sobel:90 sobel.jpg

然后我可能会考虑添加霍夫变换来查找水平边缘检测图像中的线条。所以,我的一行在终端/shell 中看起来像这样:

convert chemistry.jpg -morphology Convolve Sobel:90 -hough-lines 5x5+30 level.jpg

如果我添加一些调试,您可以看到 Sobel 滤波器的系数:

convert chemistry.jpg -define showkernel=1 -morphology Convolve Sobel:90 -hough-lines 5x5+30 sobel.jpg
Kernel "Sobel@90" of size 3x3+1+1 with values from -2 to 2
Forming a output range from -4 to 4 (Zero-Summing)
 0:         1         2         1
 1:         0         0         0
 2:        -1        -2        -1

如果我添加更多调试,您可以看到检测到的线的坐标:

convert chemistry.jpg -morphology Convolve Sobel:90 -hough-lines 5x5+30 -write lines.mvg level.jpg

lines.mvg

# Hough line transform: 5x5+30
viewbox 0 0 86 196
line 0,1.52265 86,18.2394  # 30      <-- this is the topmost, somewhat diagonal line
line 0,84.2484 86,82.7472  # 40      <-- this is your actual level
line 0,84.5 86,84.5  # 40            <-- this is also your actual level
line 0,94.5 86,94.5  # 30            <-- this is the line just below the surface
line 0,93.7489 86,95.25  # 30        <-- so is this
line 0,132.379 86,124.854  # 32      <-- this is the red&white valve(?)
line 0,131.021 86,128.018  # 34
line 0,130.255 86,128.754  # 34
line 0,130.5 86,130.5  # 34
line 0,129.754 86,131.256  # 34
line 0,192.265 86,190.764  # 86
line 0,191.5 86,191.5  # 86
line 0,190.764 86,192.265  # 86
line 0,192.5 86,192.5  # 86

正如我在评论中所说,请考虑一下也许可以更好地照亮你的实验 - 使用不同颜色的光、更多漫射光、不同方向的光。另外,如果您的实验随着时间的推移进行,您可以考虑查看图像之间的差异,看看哪条线正在移动......

以下是原始图像顶部的线条:


0
投票

我已经尝试使用 CV 的多个过滤器,正如 @Mark Setchell 在之前的答案中回答的那样,用于检测水平线的 Sobel 过滤器是方法之一,如果它不能正常工作,请考虑使用带有 Sobel Y 的“cv2.filter2D” (检测水平线)内核。

您的情况使用的正确内核如下:

Kernel= np.array
([
[-1,-2,-1],
[ 0, 0, 0],
[ 1, 2, 1]
]) 
Image_Sobel_Y = cv2.filter2D(Image,-1,Kernel) 
# -1 means that the output will use the same depth(data type, how many bits) 

北邻像素为负,南邻像素为正(顶部较暗,底部较亮)。您可以颠倒极性,看看哪一个适合您。

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