2012-08-16 64 views
9

Tôi muốn trích xuất các cạnh của tay nhưng tôi nhận được kết quả sau. Tôi đã thử điều chỉnh ngưỡng thấp và cao nhưng tôi vẫn không thể có được kết quả mong muốn. Tôi đã bao gồm bên dưới mã và đầu ra của nó. Hình như có vấn đề gì thì phải?Phát hiện Canny Edge của OpenCV trong C++

Đây là output image được tạo bởi mã bên dưới.

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

Trả lời

14

Thay đổi dòng này

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

Vấn đề dường như là bàn tay của bạn trong màu xám quy mô là rất gần với nền màu xám. Tôi đã áp dụng Canny trên màu sắc (màu sắc) bởi vì màu da nên đủ khác nhau.

Ngoài ra, ngưỡng ngưỡng trông hơi điên rồ. Các tiêu chuẩn được chấp nhận là một trong những cao hơn nên được 2x đến 3x thấp hơn. 350 là một chút quá nhiều và nó không giúp giải quyết vấn đề chính.

Sửa

với các ngưỡng này tôi đã có thể trích xuất khá một đường viền tốt

cv :: Canny (hình ảnh, đường nét, 35,90);

Đọc một chút lý thuyết về thuật toán sẽ giúp bạn hiểu điều gì sẽ xảy ra và bạn nên làm gì để cải thiện. wiki canny trên google

Tuy nhiên, sự cải thiện trên sẽ cho bạn kết quả tốt hơn nhiều (với điều kiện bạn sử dụng tốt hơn so với ngưỡng 10, 350. Hãy thử (40, 120))

+0

thank you very much! tôi sẽ đọc thêm về thuật toán canny. –