4

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

  1. 分割白色仪表板。
  2. 对着仪表板测量水位。

但我被困在分割仪表板。我避免使用基于颜色的分割,因为我需要它不受光线变化的影响,所以我使用形态学操作来检测边缘。我有这张图片:

在此处输入图像描述 在此处输入图像描述

形态学运算的结果似乎很有希望。白色量规板上的边缘比其他的更锋利。但我仍然不知道如何正确分割电路板。你能推荐一种算法来分割电路板吗?或者请建议您是否有不同的算法来测量水位。

这是我的代码:

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

4

2 回答 2

0

你为什么要分割仪表板呢?您只想在图像中找到它,仅此而已。您无需查找段的相对位置。5 总是介于 4 和 6 之间。

您可能已经注意到,您可以通过寻找具有高对比度级别的区域来找到仪表板的大致位置。使用matchTemplate您可以找到确切的位置。(考虑到摄像头是固定的,或许可以跳过第一步matchTemplate直接调用)。

于 2013-03-15T14:47:31.237 回答
0

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

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

在此处输入图像描述

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

于 2013-03-15T17:45:08.623 回答