我程序是基于DIALOG的。可以显示出来设备采集到的视频。比如白色背景前面一个人在做动作。我想能不能把白色背景给去掉,直接显示出来一个人的轮廓在程序上面动。请问这样可以么?要怎么实现?谢谢了~~~还有另外个问题,(目前已经实现)就是在这个白色背景前面人的动作,我设置了个TIMER,在范围内,间隔一定的像素取色,和背景颜色相差较多的颜色就被认为是人在做动作,从而判断出人做了什么样的动作,如果真的能实现透明了,我要怎么判断呢?好象不能根据和背景颜色的差别来判断。因为视频窗口后面是一个正在播放的FLASH。还请高手解答,谢谢了!!!!!

解决方案 »

  1.   

    另外说一下,是用的VFW得到视频的。
    说起来真是很惭愧,这个程序还是我在网上找的例子然后修改了一下。。
      

  2.   

    显示之前把数据放到DC上,然后用一点的颜色作为参考,例如左上角,然后transparentblt()到屏幕上,就能消除背景
      

  3.   

    关注此问题
    那位高手给指点一下呀
    我也遇到这样的疑问,看来CSDN高手挺多的,大家交流一下吧。
    哈哈
      

  4.   

    用DirectX9里面的Video Mix Render
      

  5.   

    智慧的鱼--李强大哥!你的AVI文章什么时候能出来啊???
    想参阅一下!!出来了给小弟发给消息!谢谢拉
      

  6.   

    回复人: DoItFreely(Freely) ( ) 信誉:95  2005-12-5 18:17:49  得分: 0  
     
     
       
    显示之前把数据放到DC上,然后用一点的颜色作为参考,例如左上角,然后transparentblt()到屏幕上,就能消除背景  
     
    请问一下,显示之前怎么把数据放到DC呢?谢谢了,还有如果背景色不是很均匀的话,要怎么办呢?
      

  7.   

    我刚开始做关于avi这方面的,想多认识这方面朋友,互相交流,我的qq是32651238
      

  8.   

    for(int x=0; x<m_pdib->m_nWidth-1; x+=1){//m_pdib就是整张位图,m_nWidth,m_nHeight,位图的宽和高。
       for(int y=0; y<m_pdib->m_nHeight-1; y+=2){
    col = m_pdib->GetPixel(x,y);
    if(col == COLOR_WHITE){
    rgnTemp.CreateRectRgn(x, y, x+2, y+2);
    m_area.CombineRgn(&m_area, &rgnTemp, RGN_XOR);//m_area就是整幅图的Rgn
    rgnTemp.DeleteObject();
    }
    }//======这处不规则窗体的建立很类似!
      

  9.   

    error LNK2001: unresolved external symbol __imp__TransparentBlt@44怎么出现了这个错误? HDC m_hDC;
    CRect rect,rectShow;
    m_Source.GetWindowRect(rect);
    m_Show.GetWindowRect(rectShow);
    m_hDC=this->GetDC()->m_hDC; TransparentBlt(m_hDC,rect.TopLeft().x,rect.TopLeft().y,m_FrameX,m_FrameY,m_hDC,
    rectShow.TopLeft().x,rectShow.TopLeft().y,
    m_FrameX,m_FrameY,RGB(m_BackR,m_BackG,m_BackB));另外这样写有问题么?
      

  10.   

    #include "Windows.h"
    #include "Wingdi.h"
    #pragma comment(lib,"Gdi32.lib" )这个也在CPP的顶端加进去了。
      

  11.   

    上面的问题已经解决了,我用的是MSDN2001,里面提示我Library: Use Gdi32.lib.
    在网上查的,要用Msimg32.lib现在我把代码这样写的,可是没有反映 HDC m_hDCDest;//目标DC
    HDC m_hDCSrc;//源DC
    CRect m_RcDest,m_RcSrc;
    m_VideoDisplay.GetWindowRect(m_RcSrc);//这里是源,视频窗口显示在这里
    m_VideoShow.GetWindowRect(m_RcDest);//目标RC
    m_hDCDest=m_VideoShow.GetDC()->m_hDC;//获得DC不知道是不是应该这样写
    m_hDCSrc=m_VideoDisplay.GetDC()->m_hDC;
    TransparentBlt(
    m_hDCDest,
    m_RcDest.TopLeft().x,
    m_RcDest.TopLeft().y,
    m_FrameX,//视频区域的尺寸
    m_FrameY,//视频区域的尺寸
    m_hDCSrc,
    m_RcSrc.TopLeft().x,
    m_RcSrc.TopLeft().y,
    m_FrameX,//视频区域的尺寸
    m_FrameY,//视频区域的尺寸
    RGB(255,255,255));
    我执行着段代码好象没有任何反映
    程序是在一个DIALOG有两个STATIC控件,我想先把显示出来的图象把背景去掉显示出来。不知道这样写对不对这个问题很着急,还请高手们尽快回复,谢谢了
      

  12.   

    ++++++++++++++++++++++
    另外还想问一下,如何做,才可以不把原始视频显示在程序上,直接放在DC里面,在TransparentBlt到界面上面?谢谢~~
    我会继续加分等待解答!!!!!!!!!!!!!!!!!!!!!!!!!
    ++++++++++++++++++++++
      

  13.   

    你可以新建个CDC 
    CDC *dcB=new CDC();
    dcB.CreatCompatableDC(...);
    TransparentBlt(
    m_hDCDest,
    m_RcDest.TopLeft
    里面的m_hDCDest,
     换成dcB就可以了
      

  14.   

    感谢楼上的回复,我照做了,不过出现了错误提示
    TransparentBlt' : cannot convert parameter 1 from 'class CDC *' to 'struct HDC__ *'另外,能不能麻烦您给我一段完整点的代码呢?万分感激。还想问一下,如何做,才可以不把原始视频显示在程序上,直接放在DC里面,在TransparentBlt到界面上面?谢谢~~
    我只能给200分了
      

  15.   

    感谢楼上的回复,我照做了,不过出现了错误提示
    TransparentBlt' : cannot convert parameter 1 from 'class CDC *' to 'struct HDC__ *'把dcB前面加&就行了
      

  16.   

    cannot convert parameter 1 from 'class CDC ** ' to 'struct HDC__ *-_-!!
      

  17.   

    呵呵,不是直接赋值,是bitblt 楼主先别着急,我先做个东西试试啊
      

  18.   

    T_T
    windcao(风间草) 太感谢你了~~~~~
      

  19.   

    不好意思我弄错了,
    里面的m_hDCDest,
     换成dcB就可以了
    dcB->m_hDC
      

  20.   

    m_hDCDest,
     换成dcB->m_hDC
    就可以了
    试试吧
      

  21.   

    HDC m_hDCDest;//目标DC
    HDC m_hDCSrc;//源DC
    CRect m_RcDest,m_RcSrc;
    m_VideoDisplay.GetWindowRect(m_RcSrc);//这里是源,视频窗口显示在这里
    m_VideoShow.GetWindowRect(m_RcDest);//目标RC

    m_hDCDest=m_VideoShow.GetDC()->m_hDC;//获得DC不知道是不是应该这样写
    m_hDCSrc=m_VideoDisplay.GetDC()->m_hDC;
      
    CDC *m_cDC=new CDC();
    m_cDC->CreateCompatibleDC(GetDC());

    TransparentBlt(
    m_cDC->m_hDC,//目标HDC
    m_RcDest.TopLeft().x,
    m_RcDest.TopLeft().y,
    m_FrameX,//视频区域的尺寸
    m_FrameY,//视频区域的尺寸
    m_hDCSrc,//源HDC
    m_RcSrc.TopLeft().x,
    m_RcSrc.TopLeft().y,
    m_FrameX,//视频区域的尺寸
    m_FrameY,//视频区域的尺寸
    RGB(255,255,255));我编译通过,不过执行了好象没有什么反映。不知道是不是逻辑错误。我的QQ334517927  MSN:[email protected] 如果您方便,可否直接指导一下我呢?谢谢了!!!
      

  22.   

    // m_VideoShow.GetWindowRect(m_RcDest);//目标RC
    m_VideoShow.GetClientRect(m_RcDest);//目标RC

    m_FrameX=m_RcSrc.Width();
    m_FrameY=m_RcSrc.Height(); m_hDCDest=m_VideoShow.GetDC()->m_hDC;//获得DC
    m_hDCSrc=m_VideoDisplay.GetDC()->m_hDC;
      

  23.   

    呵呵,我自己稍微测试了一下,已经可以使用了,太感谢你了,,关于闪烁目前已经解决的查不多了。几乎看不出来闪烁,现在最后的问题就是,如何才能使用
    BITMAPINFO *Bitmap;得到的位图数据应用到TransparentBlt里面了。(想把原始窗口隐藏掉)
      

  24.   

    //*
    HDC m_hDCDest;//目标DC
    HDC m_hDCSrc;//源DC
    CRect m_RcDest,m_RcSrc;//RECT m_VideoDisplay.GetClientRect(m_RcSrc);//源RC
    m_VideoShow.GetWindowRect(m_RcDest);//目标RC
    ScreenToClient(m_RcDest);

    m_hDCDest=m_VideoShow.GetDC()->m_hDC;//获得DC
    m_hDCSrc=m_VideoDisplay.GetDC()->m_hDC;

    CDC* dc=this->GetDC();
    CDC * m_cDC=new CDC();
    m_cDC->CreateCompatibleDC(dc);

    CBitmap bmp;
    bmp.CreateCompatibleBitmap(dc,m_FrameX,m_FrameY);
    m_cDC->SelectObject(bmp);
    TransparentBlt(
    dc->m_hDC,
    m_RcDest.TopLeft().x,
    m_RcDest.TopLeft().y,
    m_FrameX,//视频区域的尺寸
    m_FrameY,//视频区域的尺寸
    m_hDCSrc,//源HDC
    m_RcSrc.TopLeft().x,
    m_RcSrc.TopLeft().y,
    m_FrameX,//视频区域的尺寸
    m_FrameY,//视频区域的尺寸
    RGB(255,255,255)); DeleteDC(m_hDCDest);
    DeleteDC(m_hDCSrc);
    ReleaseDC(dc);
    ReleaseDC(m_cDC);我这样释放DC可以么?或者有其他方法?还是直接delete?
      

  25.   

    The application must call the ReleaseDC function for each call to the GetWindowDC function and for each call to the GetDC function that retrieves a common DC.by calling the CreateDC function; instead, it must use the DeleteDC functionGetDC 和 ReleaseDC 是一对CreateDC 和 DeleteDC 是一对new 和delete 是一对,你就配对吧CDC CreateCompatibleDC 后不用 release
    msdn里面给的例子里面就没有releaseDC
      

  26.   

    哦, 也就是说我这代码里,先new了,后CreateCompatibleDC ,直接delete就可以了?
    不用ReleaseDC()了,还有,我这个声明RECT变量的时候,放在全局是不是有助于提高运行速度?,还有GetWindowRect 可以放在InitDialog里吧?