12

ある種の「ホリデープロジェクト」として、私はOpenCVで遊んでいて、ものを検出して測定したいと思っています。

現在のワークフロー(初期段階-検出):

  1. グレースケールに変換(cv :: cvtColor)
  2. アダプティブしきい値を適用します(cv :: adapterThreshold)
  3. キャニーエッジ検出を適用する(cv :: Canny)
  4. 輪郭の検索(cv :: findContours)

私の結果はちょっとくだらないです、そして私は進むべき正しい方向が何であるかわかりません。私はすでにcvBlobを現在のセットアップ(OSX 10.7.2、Xcode 4.2.1)で動作させていますが、それはより良い方法ですか?もしそうなら、どうすればそれを正しい方法で実装できますか?

または、最初にバックグラウンド減算が必要ですか?私はそれを試しましたが、その後輪郭を見つけることができませんでした

これが私の画像です: 測定する画像

これが私の出力です。輪郭を最初の画像に戻します。 出力

アップデート

私はそれを私のプログラムで動作させました、そして私の出力は少し異なって見えます…</ p>

- (IBAction)processImage:(id)sender
{
    cv::Mat forground = [[_inputView image] CVMat];
    cv::Mat result = [self isolateBackground:forground];
    [_outputView setImage:[NSImage imageWithCVMat:result]];
}

- (cv::Mat)isolateBackground:(cv::Mat &)_image
{
    int rh = 255, rl = 100, gh = 255, gl = 0, bh = 70, bl = 0;
    cv::cvtColor(_image, _image, CV_RGB2HSV_FULL);
    cv::Mat element = getStructuringElement(cv::MORPH_RECT, cv::Size(5, 5));
    cv::Mat bgIsolation;
    cv::inRange(_image, cv::Scalar(bl, gl, rl), cv::Scalar(bh, gh, rh), bgIsolation);
    bitwise_not(bgIsolation, bgIsolation);
    erode(bgIsolation, bgIsolation, cv::Mat());
    dilate(bgIsolation, bgIsolation, element);
    return bgIsolation;
}
4

1 に答える 1

11

これは一種のハックかもしれませんが、「ホリデープロジェクト」なので、とにかく投稿します:)

背景を分離してからマスクを反転させてみましたか(これは、背景以外のものがオブジェクトであると想定しますが、希望どおりに機能する可能性があります)。

以下は、OpenCVinRange関数 を使用して得た結果です。ここに画像の説明を入力してください

GuassianBlurを使用して画像を滑らかにし(前処理)、ギザギザを取り除くことができます。ノイズの多いピクセルを取り除くために、侵食カーネルよりも大きな拡張カーネル(5x5対3x3)を使用しました。平滑化は、これがしきい値を微調整するのに役立つ可能性があり、侵食が不要になる可能性があります。しかし、それはあなたが始めるはずです。

最後に、この範囲を見つけるために使用した簡単なコードスニペットを次に示します。

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <vector>

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
    Mat src = imread("test.jpg");


    int rh = 255, rl = 100, gh = 255, gl = 0, bh = 70, bl = 0;

    string windowName = "background";
    namedWindow(windowName);

    createTrackbar("rh", windowName, &rh, 255);
    createTrackbar("rl", windowName, &rl, 255);
    createTrackbar("gh", windowName, &gh, 255);
    createTrackbar("gl", windowName, &gl, 255);
    createTrackbar("bh", windowName, &bh, 255);
    createTrackbar("bl", windowName, &bl, 255);

    // for dilation
    Mat element = getStructuringElement(MORPH_RECT, Size(5, 5));

    Mat bgIsolation;
    int key = 0;
    do
    {
        inRange(src, Scalar(bl, gl, rl), Scalar(bh, gh, rh), bgIsolation);

        bitwise_not(bgIsolation, bgIsolation);

        erode(bgIsolation, bgIsolation, Mat());
        dilate(bgIsolation, bgIsolation, element);

        imshow(windowName, bgIsolation);
        key = waitKey(33);
    } while((char)key != 27);

    waitKey();

    return 0;
}

ホリデープロジェクトをお楽しみください!楽しそうだね :)

于 2011-12-22T00:48:03.360 に答える