如何检测用于测量水位的白色仪表板?
Posted
技术标签:
【中文标题】如何检测用于测量水位的白色仪表板?【英文标题】:How to detect the white gauge board for measuring the level of the water? 【发布时间】:2013-03-15 12:46:24 【问题描述】:我从事一个需要使用白色仪表板测量水位的项目。目前我的做法是:
-
分割白色仪表板。
对照仪表板测量水位。
但我在分割仪表板时遇到了困难。我避免使用基于颜色的分割,因为我需要它不受光线变化的影响,所以我使用形态学操作来检测边缘。我有这张图片:
形态学运算的结果似乎很有希望。白色量规板上的边缘比其他的更锋利。但我仍然不知道如何正确分割电路板。你能推荐一种算法来分割电路板吗?或者请建议您是否有不同的算法来测量水位。
这是我的代码:
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
int main()
cv::Mat src = cv::imread("image.jpg");
if (!src.data)
return -1;
cv::Mat bw;
cv::cvtColor(src, bw, CV_BGR2GRAY);
cv::medianBlur(bw, bw, 3);
cv::Mat dilated, eroded;
cv::dilate(bw, dilated, cv::Mat());
cv::erode(bw, eroded, cv::Mat());
bw = dilated - eroded;
cv::imshow("src", src);
cv::imshow("bw", bw);
cv::waitKey();
return 0;
我正在使用 C++,但我对 Matlab/Mathematica 中的其他实现持开放态度。
【问题讨论】:
您的相机是否在固定位置?仪表的图像有多大不同? @DCS 是的,我们可以假设相机位于固定位置。也许图像的颜色会有所不同,例如:早上、晚上等。 如果摄像头在固定位置,就不能硬编码仪表板分段吗? @FlorianBrucker:这就是我问的原因...... :) 图片上的水位在哪里? 【参考方案1】:如果相机确实是静止的,您可以使用这种快速而肮脏的方法:
im= rgb2gray(imread('img.jpg'));
imr=imrotate(im,1);
a=imr(100:342,150);
plot(a)
图中显示的最小值在指标范围内从 10(左)到 1(右)。您可以使用峰值检测器来定位它们的位置并插入它们之间的水位。 所以,没有真正需要花哨的图像处理......
【讨论】:
imr
函数是什么?你能指出我的文档页面吗?我试图用谷歌搜索它,但我找不到它。
imr
是我给imrotate
输出的名字,见mathworks.com/help/images/ref/imrotate.html【参考方案2】:
你为什么要分割仪表板?您只想在图像中找到它,仅此而已。您无需查找段的相对位置。 5 总是介于 4 和 6 之间。
您可能已经注意到,您可以通过寻找具有高对比度级别的区域来找到仪表板的大致位置。使用matchTemplate
,您可以找到确切的位置。 (考虑到摄像头是固定的,可以跳过第一步直接拨打matchTemplate
)。
【讨论】:
以上是关于如何检测用于测量水位的白色仪表板?的主要内容,如果未能解决你的问题,请参考以下文章
无法在包含测量的 influxDB 点上创建 Grafana 动态仪表板