全局函数变量 CCVideoTestDlgDlg *pDial;
注册回调函数capSetCallbackOnFrame(m_hWndVideo,myProcessing);
实现一边采集视频,一边灰度化视频每一帧,然后显示,下面是从一个网友那转的灰度化的回调,个人感觉加粗的那句有问题,应该是获得视频每一帧的图像宽和高的乘积,这个m_high和m_width怎么获得??????LRESULT CALLBACK myProcessing(HWND h, LPVIDEOHDR pV)
{
// ====== rgb2gray ========
int i,j,size;
BYTE *pIm;
size = m_high*m_width;
pIm = (BYTE*)malloc(size*sizeof(BYTE));
j=0;
for(i=0;i<size;i++)
{
//Gray = 0.2126 R + 0.7152 G + 0.0722 B ->
pIm[i] = 0.2216*(float)pV->lpData[j+2]+0.7152*(float)pV->lpData[j+1]+0.0722*(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 true;
}

解决方案 »

  1.   

    http://topic.csdn.net/u/20070822/13/70875095-b9de-4fdd-927c-11b4232d6f06.html
    我参考的帖子我安照下面过程做,一点击灰度化的按钮,程序就卡死了,怎么回事?
    工程名:CapDemo
    1.在CapDemoDlg.cpp里建一个全局变量
    CCapDemoDlg *pDial;
    2.初始化设置
    BOOL CCapDemoDlg::OnInitDialog()
    {
     // TODO: Add extra initialization here
     pDial = this;
     //以下这些你应该都知道了
     hWndC=capCreateCaptureWindow ("CapVideo",WS_CHILD|WS_VISIBLE,10,10,320,240,m_hWnd,0);
     capDriverConnect (hWndC,0);
     capPreviewRate(hWndC,40);  
    capPreview(hWndC,TRUE);
     CAPSTATUS Cap;
     capGetStatus(hWndC,&Cap,sizeof(Cap));
     m_high = Cap.uiImageWidth;
     m_width = Cap.uiImageHeight;
     // 等等...
     return TRUE;
    }
    3.建一个按钮
    void CCapDemoDlg::OnButtonRunProcessing()  
    {
     // TODO: Add your control notification handler code here
     capSetCallbackOnFrame(hWndC,CCapDemoDlg::myProcessing);
    }
    4.完成回调函数
    LPVOID CALLBACK CCapDemoDlg::myProcessing(HWND h, LPVIDEOHDR pV)
    {
     // ====== rgb2gray ========
     int i,j,size;
     BYTE *pIm;
     size = pDial->m_high*pDial->m_width;
     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);
     // 建议你自己建个库用来进行图像运算,会方便很多
    }
      

  2.   

    size, LPVIDEOHDR pV 里面有的,
      

  3.   

    你好,pv力量是有视频数据的大小pv->dwBufferLength,这个是长*宽*每像素的大小,按需求,我需要的像素个数,也就是长*宽,用size = (pv->dwBufferLength)/3,替换也不能运行
      

  4.   

    长*宽,是在 Capturexxx, 我忘了函数名了,在一个函数里取出来的,
      

  5.   

    我这个摄像头采集的视频图像格式不是RGB,是yuy2,怎么办呢,苦恼死我了,yuy2不知道怎么处理了,数据帧大小知道了,yuy2每个像素占2个字节,怎么处理????
      

  6.   

    长 宽 你代码中不是已经有了么?
     CAPSTATUS Cap;
     capGetStatus(hWndC,&Cap,sizeof(Cap));
     m_high = Cap.uiImageWidth;
     m_width = Cap.uiImageHeight;YUV2转RGB 有以前的帖子 
    http://topic.csdn.net/u/20120709/11/076dfa88-85bd-49dd-ab9e-16b7fcf8e335.html?seed=2021325937&r=79084628
      

  7.   


    这个帖子的问题源自视频格式是yuy2,我当成RGB了,所有各种数据存储,转换都出问题了~~现在已经找到问题的起因,正在搞定中,谢谢你的提醒