如何检测白色测量板以测量水位?

时间:2013-03-15 12:46:24

标签: c++ matlab opencv image-processing wolfram-mathematica

我在一个需要使用白色仪表板测量水位的项目上工作。目前我的方法是:

  1. 分割白色仪表板。
  2. 测量仪表板上的水位。
  3. 但是我被困在分割仪表板上。我避免使用基于颜色的分割,因为我需要它与光变化不变,所以我使用形态学操作来检测边缘。我有这个形象:

    enter image description here enter image description here

    形态学操作的结果似乎很有希望。白色仪表板上的边缘比其他更锋利。但我仍然无法正确划分董事会。你能建议一种算法来分割电路板吗?或者请建议您是否有不同的测量水位的算法。

    这是我的代码:

    #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中的其他实现持开放态度。

2 个答案:

答案 0 :(得分:0)

为什么要对仪表板进行分段?你只想在图像中找到它,就是这样。您无需查找段的相对位置。 5总是在4到6之间。

您可能已经注意到,通过寻找具有高对比度的区域,您可以找到仪表板的粗略位置。使用matchTemplate,您就可以找到确切的位置。 (考虑到相机已修复,您可以跳过第一步并直接拨打matchTemplate。)

答案 1 :(得分:0)

如果相机确实静止不动,您可以使用这种快速而肮脏的方法:

im= rgb2gray(imread('img.jpg'));
imr=imrotate(im,1);
a=imr(100:342,150);
plot(a)

enter image description here

图中显示的最小值是指标刻度中的10(左)到1(右)。您可以使用峰值检测器定位它们的位置并插入它们之间的水位。 所以,没有真正需要花哨的图像处理......