2010-06-17 2 views
5

비디오에서 흰색 물체를 감지하려고합니다. 첫 번째 단계는 흰색 픽셀 만 남겨 두도록 이미지를 필터링하는 것입니다. 첫 번째 접근 방식은 HSV 색상 공간을 사용하고 높은 수준의 VAL 채널을 확인하는 것이 었습니다. 코드는 다음과 같습니다.흰색을 감지하는 가장 좋은 방법은 무엇입니까?

//convert image to hsv 
cvCvtColor(src, hsv, CV_BGR2HSV); 
cvCvtPixToPlane(hsv, h_plane, s_plane, v_plane, 0); 

for(int x=0;x<srcSize.width;x++){ 
    for(int y=0;y<srcSize.height;y++){ 
    uchar * hue=&((uchar*) (h_plane->imageData+h_plane->widthStep*y))[x]; 
    uchar * sat=&((uchar*) (s_plane->imageData+s_plane->widthStep*y))[x]; 
    uchar * val=&((uchar*) (v_plane->imageData+v_plane->widthStep*y))[x]; 

    if((*val>170)) 
     *hue=255; 
    else 
     *hue=0; 
    } 
} 

결과가 색조 채널에 남습니다. 불행히도이 접근법은 조명에 매우 민감합니다. 더 좋은 방법이있을 것이라고 확신합니다. 어떤 제안?

답변

2

조명에 민감합니다. 빨간불로 보시면 어떻게됩니까?
비슷한 RGB 값을 찾는 것보다 YUV 공간을 사용하는 것이 훨씬 쉬운지 잘 모르겠습니다.

편집 - 일반적으로 색이 회색 인 항목을 호출합니다 (검색에 도움이 될 수 있음).
선택 사항이있는 경우 장면의 다른 조명을 반사하기 때문에 가장 나쁜 색입니다. 따라서 전반적인 조명 색상을 감지하고이를 조정해야합니다.

그래서 당신이 찾고있는 것은 simlar RGB 값을 가진 픽셀 또는 장면의 오브젝트 평균에 대한 RGB 값입니다.

+0

나는 흰색 = 회색 = 색상 없음을 의미합니다. 실제로 흰색 플라스틱 안경을 감지하려고합니다. 다음은 샘플 이미지입니다. http://tinypic.com/r/14t1p1x/6 – dnul

+0

잘 모르겠지만, 내가 빨간불을 맨 위에 올려 놓으면 안경의 색이 어떻게 든 붉게됩니다. 흰색 픽셀을 찾는 대신 색상과 상관없이 비슷한 픽셀을 찾아야합니다. – dnul

+3

장면에 흰색 물체가 있고 빨간색 표시등이 켜지면 빨간색으로 보입니다. 이 경우 '흰색'물체의 색상을 찾고 해당 색상을 검색해야합니다. –

2

왜 HSV를 사용하고 있습니까? HSL로 변환하고 루미넌스 채널을 사용하는 것이 더 합리적입니다. 물론 흰색 만 얻지는 않지만 모든 색상은 임계 값 이상의 높은 휘도를 갖습니다. 소스 이미지가 노출 과다가되지 않으면 순수한 흰색을 의지 할 수 없습니다.

2

또 다른 방법은 이미지를 회색조로 변환하는 것입니다. 흰색은 매우 높은 값을가집니다 (거의> 225).

또 다른 방법은 AND, R, G 및 B면입니다. 결과 이미지에는 흰색 만 남습니다. 이렇게하면 HSV 색상 공간으로 변환하는 계산에 시간을 낭비 할 필요가 없습니다. 이제 각 픽셀에서 간단한 AND 연산 만 수행하면됩니다.

관련 문제