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 に答える