Tôi đang cố gắng sử dụng chức năng findcontours() trong OpenCV trên hình ảnh bên dưới.OpenCV findcontours trả về 2 đường viền cho mỗi vòng tròn
findContours(img, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_NONE, cvPoint(0,0));
Khi tôi làm truy vấn này: contours.size()
nó sẽ trả về 18, vì vậy mà dường như 2 đường viền cho mỗi vòng tròn. Các vòng tròn là như bạn có thể thấy dày 1 pixel, làm thế nào là 2 đường nét? Nó là một cho bên ngoài và một cho bên trong, nếu như vậy, làm thế nào tôi có thể buộc chức năng này để phát hiện chỉ là một đường viền cho mỗi vòng tròn? Tôi nghĩ rằng một đường viền được định nghĩa là một chuỗi pixel được kết nối, dày 1 pixel.
Nhưng khi tôi xem ví dụ này [ở đây] (http://jmpelletier.com/a-simple-opencv-tutorial/) có vẻ như nó không tính riêng bên trong và bên ngoài. Nhưng ví dụ có phiên bản C của findcontours. Có sự khác biệt giữa triển khai cũ và mới không? –
không, không nên có bất kỳ sự khác biệt nào giữa phiên bản C và C++ sẽ ảnh hưởng đến kết quả cuối cùng. Trong thực tế từ những gì tôi nhớ, một là chỉ là một wrapper cho khác. Tuy nhiên, nhìn vào hình ảnh từ liên kết đó, tôi thấy chính xác những gì bạn nói. có vẻ như đang phát hiện cả đường viền bên trong và bên ngoài cho mỗi vòng tròn, điều này càng có ý nghĩa hơn trên hình ảnh được hiển thị ở đó – Naps62
Thật vậy, việc sử dụng cờ CV_RETR_EXTERNAL sẽ khắc phục nó cho bạn. Xem ở đây để có danh sách đầy đủ các cờ: http://opencv.itseez.com/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html#void findContours (InputOutputArray image, Đường dẫn OutputArrayOfArrays, phân cấp OutputArray, chế độ int, phương thức int, Point offset) –