2012-08-16 21 views
9

Chcę wyodrębnić krawędzie strony, ale otrzymuję następujący wynik. Próbowałem dostosować niski i wysoki próg, ale nadal nie mogę uzyskać pożądanej wydajności. Zawarłem poniższy kod i jego wynik. Co wydaje się być problemem?Wykrywanie Canny Edge OpenCV w C++

To jest output image wygenerowany przez poniższy kod.

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

Odpowiedz

14

Zmiana ta linia

cvtColor(image, gray_image, CV_RGB2GRAY); 

do

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

problem wydaje się być to, że twoja ręka w skali szarości jest bardzo zbliżony do szarego tła. Zastosowałem Canny na odcień (kolor), ponieważ kolor skóry powinien być wystarczająco inny.

Również progi Canny wyglądają na nieco zwariowane. Zgodnie z przyjętą normą, wyższa powinna być 2x do 3x niższa. 350 jest trochę za dużo i nie pomaga rozwiązać głównego problemu.

Edit

z tych progów udało mi się wydobyć całkiem dobry konturu

cv :: Canny (image, konturów, 35,90);

Czytanie teorii na temat algorytmu pomoże Ci zrozumieć, co się dzieje i co należy zrobić, aby poprawić. wiki canny na google

Jednak poprawa powyżej daje znacznie lepsze wyniki (pod warunkiem korzystania lepsze niż progi 10, 350. Try (40, 120))

+0

dziękuję bardzo! Przeczytam więcej na temat algorytmu sprytnego. –