web-dev-qa-db-ja.com

C ++でのOpenCVのキャニーエッジ検出

手のエッジを抽出したいのですが、次のような結果になります。低しきい値と高しきい値を調整しようとしましたが、それでも目的の出力が得られません。以下にコードとその出力を含めました。問題に見えるのは?

これは 出力画像 以下のコードによって生成されます。

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

int main(){

    cv::Mat image= cv::imread("open_1a.jpg");
    cv::Mat contours;
    cv::Mat gray_image;

    cvtColor( image, gray_image, CV_RGB2GRAY );

    cv::Canny(image,contours,10,350);

    cv::namedWindow("Image");
    cv::imshow("Image",image);

    cv::namedWindow("Gray");
    cv::imshow("Gray",gray_image);

    cv::namedWindow("Canny");
    cv::imshow("Canny",contours);
    cv::waitKey(0);
}
9
Og Namdik

この行を変更します

cvtColor( image, gray_image, CV_RGB2GRAY );

std::vector<cv::Mat> channels;
cv::Mat hsv;
cv::cvtColor( image, hsv, CV_RGB2HSV );
cv::split(hsv, channels);
gray_image = channels[0];

問題は、グレースケールの手が灰色の背景に非常に近いことであるようです。肌の色が十分違うはずなので、色相(色)にキャニーを塗りました。

また、キャニーのしきい値は少しおかしいように見えます。受け入れられている基準は、高い方が2倍から3倍低いはずであるということです。 350は少し多すぎて、主な問題の解決には役立ちません。

編集

これらのしきい値を使用して、非常に良い輪郭を抽出することができました

cv :: Canny(image、contours、35,90);

アルゴリズムに関する理論を少し読むと、何が起こり、改善するために何をすべきかを理解するのに役立ちます。 wiki cannyグーグルで

ただし、上記の改善により、はるかに優れた結果が得られます(10、350よりも優れたしきい値を使用する場合。(40、120)を試してください)。

14
Sam