2012-08-16 8 views
9

Quiero extraer los bordes de la mano, pero obtengo el siguiente resultado. Intenté ajustar el umbral alto y bajo, pero todavía no puedo obtener el resultado deseado. He incluido debajo del código y su salida. ¿Cuál parece ser el problema?Canny Edge Detection de OpenCV en C++

Este es el output image generado por el código siguiente.

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

Respuesta

14

cambiar esta línea

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]; 

El problema parece ser que su mano en escala de grises es muy cerca del fondo gris. He aplicado Canny en el tono (color) porque el color de la piel debe ser lo suficientemente diferente.

Además, los umbrales de Canny parecen un poco locos. La norma aceptada es que la más alta debe ser de 2x a 3x la más baja. 350 es demasiado y no ayuda a resolver el problema principal.

Editar

con estos umbrales I fue capaz de extraer bastante un buen contorno

cv :: Canny (imagen, contornos, 35,90);

Leer un poco de teoría sobre el algoritmo te ayudará a entender qué sucede y qué debes hacer para mejorar. wiki canny en Google

Sin embargo, la mejora de arriba le dará resultados mucho mejores (siempre es mejor utilizar umbrales de 10, 350. Try (40, 120))

+0

muchas gracias! Leeré más sobre el algoritmo astuto. –