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)으로 낮추니까 바둑판에 놓여질때만 인식을 하였다.
댓글 없음:
댓글 쓰기