2015년 7월 16일 목요일

제4장) RGB값을 HSV로 변환하여 빛에따른 오차 줄이기

원검출에는 성공하긴하였지만 바둑알이 빛에 비치면서 흑돌임에도 불구하고 조명위치에따라 흰색이 검출되어 검출이 안될 경우가있다.
1
2
3
4
5
6
7
value = cvGet2D(frame, cvRound(circle[1]), cvRound(circle[0]));        //(원본,y,x)
if (value.val[0< 100 && value.val[1< 100 && value.val[2< 100 && rx4 > 0){
.....
.....
}
cs
실제로 2장 원검출 - 에서 원의중심 point의 RGB값을 100미만으로 설정됬을때만
검출하도록 실시하였는데 그점부분이 빛에따라 검출이 되지 않았다. 

따라서 원하는 색(흑색) RGB값을 HSV로 변환하여 masking 및 모폴로지 후에
흑돌을 추출하도록 하기로하였다.


HSV변환은 공식을 이용하여 사용할 수 있지만 나는 흑돌만 검출하기때문에 
RGB색상표에 따라 범위만 지정하였다.
참고한 (RGB색상표)http://ha927.com.ne.kr/RGB.html
그후에 모폴로지연산으로 정확도를 높였다.
1
2
3
4
5
6
7
8
9
lowH = H * LOW_BOUND; lowS = S * LOW_BOUND; lowV = V * LOW_BOUND;            //RGB - HSV변환
            highH = H * HIGH_BOUND; highS = S*HIGH_BOUND; highV = V * HIGH_BOUND;
            mask = cvCreateMat(size.height, size.width, CV_8UC1);
            cvInRangeS(frame, cvScalar(lowH, lowS, lowV), cvScalar(highH, highS, highV), mask);    //HSV범위내의 이미지를 masking
            cvCopy(mask, gray,NULL);    //gray영상에 복사
            //모폴로지
            cvErode(mask, mask, NULL);        //침식
            cvDilate(mask, mask, NULL);        //팽창
cs
그후의 코드는 smoothing을 (5,5)에서 (3,3)으로 낮춘것밖에 없다.
(5,5)는 너무 많이 스무딩을하여 손가락에있는 바둑돌까지 인식하였는데
(3,3)으로 낮추니까 바둑판에 놓여질때만 인식을 하였다.

댓글 없음:

댓글 쓰기