2011-01-09 2 views
13

OpenCV를 사용하여 특정 색상의 이미지를 필터링하므로 감지 된 영역의 이진 이미지가 있습니다.OpenCV에서 블롭 추출

은 지금은 X를 그 지역을 침식하고 작은 것들 없애 및 찾으려면, 내가 최고의 라이브러리가 어떻게 될지에 관한 권고를 찾고 있었다 가장 큰 '덩어리'

의 y 좌표 사용? cvBlob 및 cvBlobsLib를 본 적이 있지만 설정 방법이 너무 명확하지 않습니다. 프로젝트와 함께 컴파일하고 싶습니까? (OpenCV에서했던 것처럼) 컴파일하고 시스템에 설치하고 싶습니까?

저는 현재 코드 우분투 :: 블록 IDE (즉, 일을 제한하지 말아야 있지만) 사용하고

답변

11

나는 파티에 늦었지만 opencv에서 연결된 구성 요소를 수행하는 방법이 있다는 점에서 차임을하고 싶습니다. 아직 개설되지 않았습니다.

업데이트 : 3.0 버전이 여러 해 동안 출시 될 때까지 대기 중입니다. Linky to documentation

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

면책 조항을 참조하십시오 - 나는 저자입니다.

+2

잘 작동합니다. Jason. 나는 당신의 패치를 통합했고, 잘 작동하는 것 같다. 속도도 좋습니다. 어쩌면 일부 속성을 추가하는 기능이 너무 좋을 것입니다 (예 : 영역, centroïd 등). 어쨌든 위대한 일에 감사드립니다. OpenCV 팀이 곧 귀하의 패치를 통합하기를 바랍니다. 이것은 OpenCV IMHO의 심각한 부족입니다. 특히 다른 도서관이 오래되어 IplImage * 만 사용하기 때문에 ... –

+0

+1. 잘 했어. OpenCV에 패치를 통합하는 방법은 무엇입니까? – Alexey

+0

이제 API에 있나요? 그렇다면 문서에 대한 링크가 향후 독자에게 도움이 될 것입니다. – dashesy

10

불행하게도 OpenCV의은에 대한 심각한 누락 것 같아 연결된 모든 구성 요소 라벨링 기능을 가지고 있지 않습니다 컴퓨터 비전 라이브러리. 어쨌든 나는 비슷한 요구 사항을 가지고 있었기 때문에 내 자신의 CCL 루틴을 구현했습니다. CCL Wikipedia page에 설명 된 몇 가지 알고리즘이 있으며 구현하기가 매우 간단합니다.

+1

이것이 가장 좋은 옵션 인 것 같습니다. 감사합니다. OpenCV의 부분에 대한 방대한 감시가있는 것처럼 보입니다. – amr

+0

OpenCV 사이트 (cvBlobsLib 또는 이와 유사한)에 제 3 자 blob 라이브러리가 있지만 그 코드 품질은 좋지 않았습니다. 이 경우에 자신을 굴리는 것이 더 좋을 것이라고 생각합니다. –

+0

다른 대답에서 언급했듯이, 연결된 구성 요소 레이블링과 동등한 것을 제공하는 FindContours가 없습니까? – carnieri

11

findContours을 사용하면 opencv manualTutorial to find connected components을 참조 할 수 있습니다.


편집 : 코드 튜토리얼에서

#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

이것은 최대의 컨투어/blob - 감사를 찾는 방법을 찾고 너무 유망 보인다 :) 감사합니다 – amr

+0

당신이 윤곽선의 면적을 계산할 수있을 것 같아요. 이를위한 몇 가지 기능이 있습니다. –

+0

그래, 방금 윤곽 테두리 상자의 면적을 계산했고 그 일을 했어 – amr

0

(Archive.org를 통해이) 내가 OpenCV의이 cvBlob 라이브러리를 사용하는 것입니다와 함께 최고의 쉬운 옵션은 모양과 작동 생각합니다. OpenCV가있는 보완 라이브러리는 사용하기가 쉽습니다.

관련 문제