2012-08-16 6 views
9

私は手のエッジを抽出したいが、私は次の結果を得る。私は低いと高いしきい値を調整しようとしましたが、私はまだ希望の出力を得ることができません。私は以下のコードとその出力を含んでいます。問題であると想定されるのは?C++でのOpenCVのCanny Edge検出

これは、以下のコードで生成されたoutput imageです。

#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); 
} 

答えて

14

変更

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

問題へこのライン

cvtColor(image, gray_image, CV_RGB2GRAY); 

はグレースケールであなたの手が灰色の背景に非常に近いということのようです。私は肌の色が十分に異なっている必要があるため、色合い(カラー)にCannyを適用しました。

また、Cannyのしきい値は少し狂っています。許容される基準は、高い方が2倍から3倍低くなければならないということです。 350が多すぎると主な問題を解決するのに役立たない。

編集

Iは

CVかなり良い輪郭を抽出することができたこれらの閾値::キャニー(画像、輪郭、35,90)を有します。

アルゴリズムについての少しの説明を読んで、何が起こり、何を改善するべきかを理解するのに役立ちます。グーグル

wiki cannyは、しかし、上記の改善は、あなたに多くの、より良い結果(あなたが10よりも優れたしきい値を使用して、350トライ(40、120))

+0

を与えるどうもありがとうございました!私はcannyのアルゴリズムについてもっと読むつもりです。 –

関連する問題