手のエッジを抽出したいのですが、次のような結果になります。低しきい値と高しきい値を調整しようとしましたが、それでも目的の出力が得られません。以下にコードとその出力を含めました。問題に見えるのは?
これは 出力画像 以下のコードによって生成されます。
#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);
}
この行を変更します
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)を試してください)。