|
다음은 VC++에서 콜백함수를 불러와 영상처리를 한함수입니다.(질문은 뒤쪽에...)
//콜백함수
LRESULT CALLBACK capCallbackOnFrame(HWND HWnd,LPVIDEOHDR lpVHdr)
{
BYTE pixel;
int i,j,index,counter=0;
if(pImageBuffer == NULL) pImageBuffer=(LPBYTE)new BYTE[BmInfo.bmiHeader.biHeight*BmInfo.bmiHeader.biWidth];
for(i=0;i<BmInfo.bmiHeader.biHeight*BmInfo.bmiHeader.biWidth;i++)
{
pixel=(*(lpVHdr->lpData+(i*3))+*(lpVHdr->lpData+(i*3)+1)+*(lpVHdr->lpData+(i*3)+2))/3;
if(pixel>200) *(pImageBuffer+i) = 255;
else *(pImageBuffer+i) = 0;
}
int xCenter=0,yCenter=0;
for(i=0;i<BmInfo.bmiHeader.biHeight;i++)
{
index = i*BmInfo.bmiHeader.biWidth;
for(j=0;j<BmInfo.bmiHeader.biWidth;j++)
{
if(*(pImageBuffer+index+j)==255)
{
xCenter+=i;
yCenter+=j;
counter++;
}
}
}
xCenter=(int)((float)xCenter/(float)counter);
yCenter=(int)((float)yCenter/(float)counter);
for(i=xCenter-15;i<=xCenter+15;i++)
{
if(i<0 || i>=BmInfo.bmiHeader.biHeight) continue;
index = i*BmInfo.bmiHeader.biWidth;
*(lpVHdr->lpData+3*(index+yCenter))=0;
*(lpVHdr->lpData+3*(index+yCenter)+1)=0;
*(lpVHdr->lpData+3*(index+yCenter)+2)=255;
}
index=xCenter*BmInfo.bmiHeader.biWidth;
for(j=yCenter-15;j<=yCenter+15;j++)
{
if(j<0 || j>=BmInfo.bmiHeader.biWidth) continue;
*(lpVHdr->lpData+3*(index+j))=0;
*(lpVHdr->lpData+3*(index+j)+1)=0;
*(lpVHdr->lpData+3*(index+j)+2)=255;
}
CString strTitle;
strTitle.Format("Binary Tracker(%d,%d)",xCenter,yCenter);
AfxGetMainWnd()->SetWindowText(strTitle);
return (LRESULT)TRUE;
}
//////////////////////////////////////////////////////////
//매 frame이 캡처될때마다 호출될 callback function지정(VC++에서...)
if(capSetCallbackOnFrame(m_hWndCap,capCallbackOnFrame)==FALSE) return FALSE;
※m_hWndCap는 Capture Window의 핸들입니다.
//질문입니다.
위 형식을 보시면 매 플레임마다 capCallbackOnFrame함수가 실행되게 되어 영상을 처리하게 되는데...
BCB에서 저형식을 그대로 사용하면 될것 같아서 사용했는데 안되는군요.
에러의 이유가 제 생각에는 callback함수를 저런식으로 BCB에서는 저렇게 사용하는게 아닌것 같은데...
사용하는 방법을 자세히좀 설명해주세요.
|