2012-07-02 40 views
5

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.

Says there are 18 contours!!

Trả lời

4

tôi không thể xác nhận điều này, nhưng tôi nghĩ rằng các thuật toán được sử dụng bởi chức năng này làm điều gì đó tương đương với máy tính gradient cho từng chức năng. Điều đó có nghĩa là sẽ có một đường viền được tìm thấy ở mép ngoài và một đường viền ở cạnh bên trong, giống như bạn gợi ý. Để khẳng định điều này, Bạn có thể cố gắng sử dụng một hình ảnh đầu vào nơi các vòng tròn đã được lấp đầy với màu trắng (elimininating đường viền bên trong)

bạn cũng có thể thử nghiệm với các thông số khác nhau trên findContours hoạt

Ví dụ, hãy thử sử dụng CV_RETR_EXTERNAL thay vì CV_RETR_TREE tôi giả sử các vòng tròn bên trong được lồng trong một bên ngoài, vì thế này nên buộc nó trở lại chỉ những người bên ngoài

+0

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? –

+0

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

+1

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) –

0

Bạn có thể đã figured này ra nhưng ...

findContours chỉ quan tâm đến các đối tượng màu trắng và do đó nhận ra từng vòng tròn rỗng như một dải, do đó tạo ra hai đường bao.

Cách tốt nhất là tạo một hình ảnh khác với các vòng tròn được lấp đầy và áp dụng findContoours cho hình ảnh đó. Nó sẽ cung cấp cho bạn những gì bạn muốn.

Các vấn đề liên quan