2011-01-09 80 views
13

Tôi đang sử dụng OpenCV để lọc hình ảnh cho một số màu nhất định, vì vậy tôi có một hình ảnh nhị phân của các khu vực được phát hiện.Trích xuất Blob trong OpenCV

Bây giờ tôi muốn làm xói mòn những lĩnh vực và sau đó thoát khỏi những cái nhỏ hơn, và tìm ra x, tọa độ y của 'blob' lớn nhất

tôi đang tìm kiếm các khuyến nghị như những gì thư viện tốt nhất là sử dụng? Tôi đã nhìn thấy cvBlob và cvBlobsLib nhưng tôi không quá chắc chắn làm thế nào để thiết lập chúng. Tôi có muốn biên dịch chúng cùng với dự án hay tôi muốn biên dịch và cài đặt chúng vào hệ thống (như tôi đã làm với OpenCV)?

Tôi hiện đang sử dụng Code :: Blocks IDE trên Ubuntu (mặc dù đó không nên hạn chế việc)

Trả lời

11

Tôi đến muộn với bữa tiệc, nhưng tôi chỉ muốn kêu gọi trong đó có một cách để làm các thành phần kết nối trong opencv, nó chỉ là không được nêu ra.

Cập nhật: Nó được sắp xếp chính xác, nó chỉ bị kẹt chờ đợi bản phát hành 3.0 phát hành trong nhiều năm. Linky to documentation

Xem http://code.opencv.org/issues/1236http://code.opencv.org/attachments/467/opencv-connectedcomponents.patch

Disclaimer - Tôi là tác giả.

+2

Làm việc tốt Jason. Tôi đã tích hợp bản vá của bạn và nó có vẻ hoạt động tốt. Tốc độ cũng tốt. Có lẽ thêm một số tính năng chức năng sẽ là tuyệt vời quá (như khu vực, centroïd vv). Dù sao, cảm ơn cho công việc tuyệt vời. Tôi hy vọng nhóm OpenCV sẽ tích hợp bản vá của bạn sớm. Đây là một thiếu nghiêm trọng của OpenCV IMHO, đặc biệt là kể từ khi thư viện khác là lỗi thời và chỉ sử dụng IplImage * ... –

+0

+1. Làm tốt lắm. Làm cách nào để tích hợp một bản vá vào OpenCV? – Alexey

+0

Đây có phải là api ngay bây giờ không? nếu có một liên kết đến tài liệu sẽ giúp người đọc trong tương lai. – dashesy

10

Thật không may OpenCV không có bất kỳ chức năng ghi nhãn thành phần kết nối, mà có vẻ như một thiếu sót nghiêm trọng đối với một thư viện thị giác máy tính. Dù sao tôi đã có một yêu cầu tương tự gần đây vì vậy tôi thực hiện CCL thường xuyên của riêng tôi - có một vài thuật toán khác nhau được mô tả trên CCL Wikipedia page và chúng đều khá đơn giản để thực hiện.

+1

Điều này có vẻ là lựa chọn tốt nhất, cảm ơn :) Có vẻ như một sự giám sát lớn về phần của OpenCV, bạn nói đúng. – amr

+0

Có thư viện blob của bên thứ ba trên trang web OpenCV (cvBlobsLib hoặc tương tự) nhưng tôi đã xem nó và chất lượng mã không lớn. Tốt hơn là nên tự mình cuộn trong trường hợp này, tôi nghĩ vậy. –

+0

Như đã đề cập trong một câu trả lời khác, không findContours cho tương đương với ghi nhãn thành phần được kết nối? – carnieri

11

Bạn có thể sử dụng findContours để thực hiện việc đó, xem opencv manualTutorial to find connected components.


Chỉnh sửa: Mã từ hướng dẫn (qua Archive.org)

#include <stdio.h> 
#include <cv.h> 
#include <highgui.h> 

int main(int argc, char *argv[]) 
{ 
    IplImage *img, *cc_color; /*IplImage is an image in OpenCV*/ 
    CvMemStorage *mem; 
    CvSeq *contours, *ptr; 
    img = cvLoadImage(argv[1], 0); /* loads the image from the command line */ 
    cc_color = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 3); 

    cvThreshold(img, img, 150, 255, CV_THRESH_BINARY); 
    mem = cvCreateMemStorage(0); 
    cvFindContours(img, mem, &contours, sizeof(CvContour), CV_RETR_CCOMP, 
     CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0)); 


    for (ptr = contours; ptr != NULL; ptr = ptr->h_next) { 
     CvScalar color = CV_RGB(rand()&255, rand()&255, rand()&255); 
     cvDrawContours(cc_color, ptr, color, CV_RGB(0,0,0), -1, CV_FILLED, 8, cvPoint(0,0)); 
    } 

    cvSaveImage("result.png", cc_color); 
    cvReleaseImage(&img); 
    cvReleaseImage(&cc_color); 
    return 0; 
} 
+0

Điều này có vẻ đầy hứa hẹn, chỉ cần tìm cách tìm đường viền/đốm màu lớn nhất - cảm ơn :) – amr

+0

Tôi nghĩ bạn có thể tính diện tích của đường bao. Có một số chức năng cho điều đó. –

+0

Vâng, tôi chỉ tính diện tích của hộp giới hạn của đường bao và nó đã thực hiện công việc – amr

0

Tôi nghĩ rằng lựa chọn tốt nhất và dễ dàng để làm việc với các đốm màu với OpenCV là sử dụng thư viện cvBlob. Thư viện complemntary của nó với OpenCV rất dễ sử dụng.