vfw获得视频帧的大小出错!
各位大侠:
我的代码如下:
int wIndex=0;//表示第零个摄像头,一般电脑上只有一个摄像头
capDriverConnect(m_hVideo,wIndex);
capPreviewRate(m_hVideo,40);//设置Preview模式的显示速率
capPreview(m_hVideo,TRUE);//启动Preview模式
CAPSTATUS Cap;
capGetStatus(m_hVideo,&Cap,sizeof(Cap));
_width = Cap.uiImageWidth;
m_high = Cap.uiImageHeight;//获得视频帧的大小,
在按钮函数中回调函数:
capSetCallbackOnFrame(m_hVideo,FrameCallbackProc);
其中回调函数对视频灰度处理:
LRESULT CALLBACK FrameCallbackProc(HWND hWnd, LPVIDEOHDR pV)
{
long i,j,size;
BYTE *pIm;
//size = pDial->m_high*pDial->m_width;//pDial调用局部变量m_width、
size=614400;
pIm = (BYTE*)malloc(size*sizeof(BYTE));
j=0;
for(i=0;i<size;i++)
{
//ImGray = 0.114ImR+0.587ImG+0.299ImB
pIm[i] = 0.299*(float)pV->lpData[j+2]+0.587*(float)pV->lpData[j+1]+0.114*(float)pV->lpData[j];
j+=3;
}
j=0;
for(i=0;i<size;i++)
{
pV->lpData[j] = pIm[i];
pV->lpData[j+1] = pIm[i];
pV->lpData[j+2] = pIm[i];
j+=3;
}
free(pIm);
return (LRESULT) TRUE ;
}
问题来了:每次运行回调函数,都出现内存出错问题,望各位大侠帮小弟指出问题所在,不胜感激!!
[解决办法]
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。
判断是否越界访问,可以在数组的最后一个元素之后对应的地址处设置数据读写断点。如果该地址对应其它变量干扰判断,可将数组多声明一个元素,并设置数据读写断点在该多出元素对应的地址上。
[解决办法]
1、确保width和height是正确的数值,我看你的程序中size似乎多乘了2(640x480x2);
2、Camera很少用40fps来预览,可以改为30fps试试;
3、灰度转换并不需要另外开辟内存空间。
LRESULT CALLBACK FrameCallbackProc(HWND hWnd, LPVIDEOHDR pV)
{
long i, j;
BYTE gray;
j = 0;
for(i = 0; i < pDial->m_high * pDial->m_width; i++)
{
gray = (BYTE)(0.299 * (float)pV->lpData[j + 2] + 0.587 * (float) pV->lpData[j + 1] + 0.114 * (float)pV->lpData[j]);
pV->lpData[j] = gray;
pV->lpData[j + 1] = gray;
pV->lpData[j + 2] = gray;
}
return (LRESULT)TRUE;
}
[解决办法]
这个大小和你的摄像头设置的分辨率有关吧,和窗口没关系