1. 프로젝트 방향
- 한 학기 동안 습득한 영상처리 기술의 종합을 종합하고 웹캠이 사람처럼 손가락의 개수를 인식한다.
2. 개발환경
- Visual Studio 2005 C++
- 스나이퍼 프로 cam
3. 연관 기술
- 컬러 영상의 처리(HSI,YCbCr)
- 처리된 컬러 영상의 변화(라벨링, 노이즈 제거)
4. 알고리즘
5. 소스
가. 컬러영역변환
펼쳐두기..
r= *(lpVHdr->lpData + (i*3) + 2);
g= *(lpVHdr->lpData + (i*3) + 1);
b= *(lpVHdr->lpData + (i*3) );
double Y = 0.299 * r + 0.587 * g + 0.114 * b;
double Cr = ((r - Y) * 0.713 + 128);
double Cb = ((g - Y) * 0.564 + 128);
if(Cr >= 133 && Cr <= 173 && Cb >= 77 && Cb <= 127 )
// 살색은 흰색으로
else
// 살색이외의 값은 검정으로
나. 모폴로지(노이즈제거)
펼쳐두기..
for(int a=0; a<8; a++){
if(m_InImg[i+BmInfo.bmiHeader.biWidth*a]==255) count1++;
if(m_InImg[i+BmInfo.bmiHeader.biWidth*a+1]==255) count1++;
if(m_InImg[i+BmInfo.bmiHeader.biWidth*a+2]==255) count1++;
if(m_InImg[i+BmInfo.bmiHeader.biWidth*a+4]==255) count1++;
if(m_InImg[i+BmInfo.bmiHeader.biWidth*a+5]==255) count1++;
if(m_InImg[i+BmInfo.bmiHeader.biWidth*a+6]==255) count1++;
if(m_InImg[i+BmInfo.bmiHeader.biWidth*a+7]==255) count1++;
}
if(count1<32) m_InImg[i]=0;
} //침식연산
for(int a=0; a<2; a++){
if(m_InImg[i+BmInfo.bmiHeader.biWidth*a]==255) count1++;
if(m_InImg[i+BmInfo.bmiHeader.biWidth*a+1]==255) count1++;
}
if(count1>0) m_InImg[i]=255;
} // 팽창연산
다. 손가락 카운트
펼쳐두기..
float radius = 0; // 반지름
int k=0; // 각도값(0~360도)
int count = 0; // 손가락 카운트
int x=0,y=0,qx=0,qy=0; // 원그리기할때 현재좌표값과 다음좌표값
if(xCenter>0 && yCenter>0){
for(incr=50; incr<BmInfo.bmiHeader.biHeight/2; incr++){
for(k=0; k<360; k++){
y = cos(k*3.141592654/180)*incr+xCenter;
x = sin(k*3.141592654/180)*incr+yCenter;
qy = cos((k+1)*3.141592654/180)*incr+xCenter;
qx = sin((k+1)*3.141592654/180)*incr+yCenter;
if(x>=0 && y>=0 && x<BmInfo.bmiHeader.biWidth
&& y<BmInfo.bmiHeader.biHeight){
if(m_InImg[BmInfo.bmiHeader.biWidth*y+x]==0
&& m_InImg[BmInfo.bmiHeader.biWidth*qy+qx]==255){
radius=incr;
break; // 손바닥의 반지름에 도달하면 브레이크
}
}
}
if(radius==incr) break;
// 손바닥의 반지름에 도달해서 나오면 브레이크
}
}
6. 실행화면
한학기 동안 배운 기술을 모두 써서 만들어낸 손가락 인식하는 프로그램이다.
인터페이스는 볼품없을지 몰라도 2주동안 이것을 완성하기 위해서
잠을 못잤다.
역시 영상처리 영역에서 빛이란 공공의 적이였다.
0 개의 댓글:
댓글 쓰기