2012-08-16 2 views
9

손의 가장자리를 추출하고 싶지만 다음과 같은 결과가 나타납니다. 낮은 임계 값과 높은 임계 값을 조정하려고했지만 여전히 원하는 출력을 얻을 수 없습니다. 아래에 코드와 그 출력을 포함 시켰습니다. 무슨 문제가있는 것 같습니까?C++의 OpenCV Canny Edge Detection

아래 코드로 생성 된 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은 너무 많아서 주요 문제를 해결하는 데 도움이되지 않습니다. 나는 꽤 좋은 윤곽을

이력서 :: 영리한 (이미지, 윤곽, 35,90)를 추출 할 수 있었다 이러한 임계 값과

편집

;

알고리즘에 대한 약간의 이론을 읽으면 어떤 일이 일어나고 개선해야하는지 이해하는 데 도움이됩니다. 구글

wiki canny 그러나, 개선 위 (당신이 10보다 더 임계 값을 사용하여 제공 (350)에 한번 (40, 120)) 당신에게 더 나은 결과를 얻을 수

+0

대단히 감사합니다! 나는 canny 알고리즘에 대해 더 많이 읽는다. –