2015-06-03 22 views
7

Tôi gặp vấn đề với opencv 3: Tôi muốn sử dụng bộ dò tìm tính năng, SimpleBlobDetector, sắp sử dụng bộ lọc theo lồi và tròn. Nhưng khi tôi cố gắng thực thi mã, lỗi sau được theo dõi:opencv 3, blobdetection, Chức năng/tính năng không được thực hiện() trong detectAndCompute

Sau đó, ứng dụng gặp sự cố.

Tôi đã tìm kiếm thông tin trên internet mà không có bất kỳ câu trả lời có liên quan nào. Tôi nghĩ rằng phiên bản thứ 3 của Opencv có thể chịu trách nhiệm về lỗi này, bởi vì tôi biết tôi sử dụng máy dò một cách tốt (tôi đã thử chính xác như hướng dẫn opencv chính thức) và tôi nhận thấy hơn SimpleBlobDector đã được sửa đổi cho phiên bản thứ ba.

Sử dụng breakpoint, tôi biết rằng dòng sau treo:

detector.detect(gray, keypoints);

Các SimpleBlobDetector đã được tạo ra (bằng cách sử dụng chức năng tạo) và cấu hình, hình ảnh màu xám là không có sản phẩm nào và vector keypoint không cần được lấp đầy trước khi phát hiện.

Tôi sử dụng opencv 3.0.0, được biên dịch trong MinGW với QtCreator. Việc điều trị opencv không được đưa ra từ chủ đề chính.

Có ai khác có cùng vấn đề không? Tôi sẽ rất biết ơn nếu tôi có thể có một bản vá hoặc giải pháp khác sử dụng một lớp khác. Tôi thực sự cần sử dụng lồi để lọc các đốm màu của mình và các thiết bị dò tìm khác (FeatureDetector hoặc Brisk) không thể cấu hình được và chỉ trả về các điểm chính, không có các thông số vùng hoặc độ đầy đủ để tính lồi.

Cảm ơn trước

+0

Bạn có thể chia sẻ một số mã không? Hình ảnh của bạn lớn đến cỡ nào? Đối với tôi, nó hoạt động trong OpenCV 3.0.0 - Bạn đã xây dựng phiên bản nào? Github hoặc Beta? – Viatorus

Trả lời

0

Chỉ cần sử dụng phát hiện (...) và không phát hiệnAndCompute (...). Không có bộ mô tả tính năng được xác định để phát hiện blob.

Xem ở đây: https://stackoverflow.com/a/11079868/1611317

+0

Đây không phải là trường hợp - như OP tiểu bang, vụ tai nạn là trên dòng 'detector.detect (...)'. –

1

Cảm ơn đã phản ứng.

Tôi sử dụng phát hiện (như tôi đã nói trong thông báo trước của mình). Tôi nghĩ rằng chức năng phát hiện có thể sử dụng detectAndCompute. Việc thiếu bộ mô tả có thể là vấn đề thực sự, bởi vì tôi đã có một vấn đề tương đương với Emgu (phiên bản C# của opencv) cho đến khi tôi tìm thấy ghi chú của nhà phát triển nói rằng phương pháp đó chưa được sửa và bộ mô tả là nguyên nhân.

Đối với những người khác có cùng vấn đề, cuối cùng tôi đã sử dụng cv :: findContours thay vì trình phát hiện blob. Nó hoạt động tốt hơn nhiều, không có vấn đề gì. Để thay thế phát hiện lồi, bạn có thể đánh giá nó bằng cách sử dụng tính đầy đủ (khu vực hình dạng/vùng hộp giới hạn). Để thay thế thông tư, hãy sử dụng công thức sau:

circle area/bounding box area = PI/4

Tôi hy vọng điều này sẽ hy vọng người khác.

11

điều này có vẻ như nó được giải quyết, nhưng có lẽ nó giúp người khác. Tôi đã từng gặp vấn đề tương tự.Tôi đã tạo ra máy dò đốm màu như sau:

cv::SimpleBlobDetector detector; 
detector.create(params); 
detector.detect(img, keypoints); 

Điều này kết thúc với lỗi: The function/feature is not implemented() in detectAndCompute.

Nhưng khi tôi thử nó như thế này:

cv::Ptr<cv::SimpleBlobDetector> detector = cv::SimpleBlobDetector::create(params); 
detector->detect(img, keypoints); 

Bây giờ mọi thứ hoạt động như mong đợi.

Điều này thực sự kỳ lạ và nếu có ai biết tại sao hoạt động như thế lại cho tôi biết.

11

Điều này là do bạn đang sử dụng OpenCV 3.X, trong đó (theo văn bản này) tất cả các ví dụ bạn sẽ tìm thấy trực tuyến sử dụng OpenCV 2.X.

Nếu bạn đào xung quanh, tuy nhiên, bạn sẽ tìm thấy hướng dẫn chuyển: http://docs.opencv.org/master/db/dfa/tutorial_transition_guide.html#tutorial_transition_hints_headers

nào nói rằng bạn cần phải sử dụng:

Ptr<SomeAlgo> algo = makePtr<SomeAlgo>(...); 
Ptr<SomeAlgo> algo = SomeAlgo::create(...); 

Thay vì:

SomeAlgo algo(); // bad 

Vì vậy, trong trường hợp này, bạn sẽ cần phải sử dụng:

Ptr<SimpleBlobDetector> d = SimpleBlobDetector::create(); 

Hoặc:

Ptr<SimpleBlobDetector> d = SimpleBlobDetector::create(params); 

params Nếu bạn đã có.

+1

bạn cần sử dụng 'Ptr ', một con trỏ thô sẽ "tự sát" ngay lập tức – berak

+0

Rất tiếc, cảm ơn - đã được sửa. –

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