2010-03-04 6 views
7

내 iSight 카메라를 내 MacBook에서 적외선 카메라로 바꾸고, 변환하고, 임계 값 등을 설정하고, 이제는 다음과 같은 이미지가 있습니다.OpenCV 화이트 픽셀 그룹화

alt text

내 문제는 지금 있습니다. 흰색 픽셀을 그룹화하여 이미지에 얼마나 많은 얼룩이 있는지 알아야합니다. cvBlob/cvBlobsLib을 사용하고 싶지 않습니다. 이미 OpenCV에있는 것을 사용하고 싶습니다.

픽셀을 반복하고 흰색 픽셀을 터치하여 그룹화합니다.하지만 OpenCV에서이 작업을 수행하는 가장 쉬운 방법은 무엇입니까?

cvFindContours을 사용하면 하나의 큰 배열에있는 모든 흰색 픽셀을 "그룹"으로 분리하지 않고 검색 할 수 있습니다. 누구든지 추천 할 수 있을까요? (이 LED는 원이 아니며 작은 IR LED에서 방출되는 빛임을 유의하십시오.)

많은 분들께 미리 감사드립니다!
덤드

답변

8

흰색 픽셀을 찾는 이미지를 반복합니다. 하나를 만날 때 그 픽셀과 함께 cvFloodFill을 시드로 사용하십시오. 그런 다음 각 영역의 채우기 값을 각 영역의 색상이 서로 다르게 증가시킵니다. 이를 레이블링이라고합니다.

+1

+1 그리고 @tommed : 이것은 cvBlob의 cvlabel.cpp에서 일어난 일입니다. 그렇다면 왜 다시 구현해야합니까? – AVB

+0

완벽하게 작동합니다! 많은 감사합니다 !! – tommed

+0

@AB : cvBlob을 사용하고 싶지 않은 이유는 그것이 여전히 별도의 라이브러리라고 생각했기 때문입니다. (분명히 최근에 v 2.0과 통합되었습니다.) 내 프로그램에 필요한 전제 조건을 제한하려고했습니다. – tommed

4

예, cvFindContours()으로 처리 할 수 ​​있습니다. 발견 된 첫 x 째 순서에 대한 포인터를 리턴합니다. 해당 포인터를 사용하면 발견 된 모든 시퀀스를 탐색 할 수 있습니다.

// your image converted to grayscale 
    IplImage* grayImg = LoadImage(...); 

    // image for drawing contours onto 
    IplImage* colorImg = cvCreateImage(cvGetSize(grayImg), 8, 3); 

    // memory where cvFindContours() can find memory in which to record the contours 
    CvMemStorage* memStorage = cvCreateMemStorage(0); 

    // find the contours on image *grayImg* 
    CvSeq* contours = 0; 
    cvFindContours(grayImg, memStorage, &contours); 

    // traverse through and draw contours 
    for(CvSeq* c = contours; c != NULL; c = c->h_next) 
    { 
     cvCvtColor(grayImg, colorImg, CV_GRAY2BGR); 
     cvDrawContours(
         colorImg, 
         c, 
         CVX_RED, 
         CVX_BLUE, 
         0, // Try different values of max_level, and see what happens 
         2, 
         8 
     ); 
    } 

이 방법 외에, 나는 cvBlobs 또는 cvBlobsLib 살펴보고 조언을 것입니다. 최신 버전은 공식 BLOB 감지 lib로 OpenCV 2.0에 통합되어 있습니다.

+0

아 아아, 그게 내가 잘못한거야! 그 점에 대해 많은 감사드립니다. – tommed