c++ - 如何检测测量水位的白色仪表板?

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

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

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

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

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

最佳答案

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

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

enter image description here

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

关于c++ - 如何检测测量水位的白色仪表板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15432896/

相关文章:

opencv - 视频文件和 OpenCV

python-3.x - opencv python3 中 imshow 的段错误

c++ - 使用函数模板将迭代器返回到图节点

c++ - 复制 CCSprite

string - 如何识别和统一字符串中实例的日期格式?

c - 访问存储在 mxArray 中的对象的字符串属性

c++ - 如何在 QWidget 子类之外调用 QMessageBox 静态 API

c++ - 编译器 `constexpr` 一切吗?

matlab - 仅保留间隔内具有最大元素的矩阵行

c++ - 从 UIImage 转换为 cv::Mat,然后返回 UIImage 会降低图像质量