2012-08-16 25 views
9

Voglio estrarre i bordi della mano ma ottengo il seguente risultato. Ho provato a regolare la soglia bassa e alta ma non riesco ancora a ottenere l'output desiderato. Ho incluso sotto il codice e la sua uscita. Quello che sembra essere il problema?Canny Edge Detection di OpenCV in C++

Questo è il output image generato dal codice di seguito.

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

risposta

14

Modificare questa linea

cvtColor(image, gray_image, CV_RGB2GRAY); 

a

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

Il problema sembra essere che la mano in scala di grigi è molto vicino al fondo grigio. Ho applicato Canny sulla tonalità (colore) perché il colore della pelle dovrebbe essere sufficientemente diverso.

Inoltre, le soglie Canny sembrano un po 'pazze. La norma accettata è che il valore più alto dovrebbe essere da 2x a 3 volte inferiore. 350 è un po 'eccessivo e non aiuta a risolvere il problema principale.

Modifica

con queste soglie sono stato in grado di estrarre abbastanza un buon contorno

cv :: Canny (immagine, contorni, 35,90);

Leggere un po 'di teoria sull'algoritmo ti aiuterà a capire cosa succede e cosa dovresti fare per migliorare. wiki canny su google

Tuttavia, il miglioramento di cui sopra vi darà risultati molto migliori (a condizione di utilizzare le soglie meglio di 10, 350. Prova (40, 120))

+0

vi ringrazio molto! leggerò di più sull'algoritmo astuto. –