我程序是基于DIALOG的。可以显示出来设备采集到的视频。比如白色背景前面一个人在做动作。我想能不能把白色背景给去掉,直接显示出来一个人的轮廓在程序上面动。请问这样可以么?要怎么实现?谢谢了~~~还有另外个问题,(目前已经实现)就是在这个白色背景前面人的动作,我设置了个TIMER,在范围内,间隔一定的像素取色,和背景颜色相差较多的颜色就被认为是人在做动作,从而判断出人做了什么样的动作,如果真的能实现透明了,我要怎么判断呢?好象不能根据和背景颜色的差别来判断。因为视频窗口后面是一个正在播放的FLASH。还请高手解答,谢谢了!!!!!
说起来真是很惭愧,这个程序还是我在网上找的例子然后修改了一下。。
那位高手给指点一下呀
我也遇到这样的疑问,看来CSDN高手挺多的,大家交流一下吧。
哈哈
想参阅一下!!出来了给小弟发给消息!谢谢拉
显示之前把数据放到DC上,然后用一点的颜色作为参考,例如左上角,然后transparentblt()到屏幕上,就能消除背景
请问一下,显示之前怎么把数据放到DC呢?谢谢了,还有如果背景色不是很均匀的话,要怎么办呢?
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();
}
}//======这处不规则窗体的建立很类似!
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));另外这样写有问题么?
#include "Wingdi.h"
#pragma comment(lib,"Gdi32.lib" )这个也在CPP的顶端加进去了。
在网上查的,要用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控件,我想先把显示出来的图象把背景去掉显示出来。不知道这样写对不对这个问题很着急,还请高手们尽快回复,谢谢了
另外还想问一下,如何做,才可以不把原始视频显示在程序上,直接放在DC里面,在TransparentBlt到界面上面?谢谢~~
我会继续加分等待解答!!!!!!!!!!!!!!!!!!!!!!!!!
++++++++++++++++++++++
CDC *dcB=new CDC();
dcB.CreatCompatableDC(...);
TransparentBlt(
m_hDCDest,
m_RcDest.TopLeft
里面的m_hDCDest,
换成dcB就可以了
TransparentBlt' : cannot convert parameter 1 from 'class CDC *' to 'struct HDC__ *'另外,能不能麻烦您给我一段完整点的代码呢?万分感激。还想问一下,如何做,才可以不把原始视频显示在程序上,直接放在DC里面,在TransparentBlt到界面上面?谢谢~~
我只能给200分了
TransparentBlt' : cannot convert parameter 1 from 'class CDC *' to 'struct HDC__ *'把dcB前面加&就行了
windcao(风间草) 太感谢你了~~~~~
里面的m_hDCDest,
换成dcB就可以了
dcB->m_hDC
换成dcB->m_hDC
就可以了
试试吧
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] 如果您方便,可否直接指导一下我呢?谢谢了!!!
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;
BITMAPINFO *Bitmap;得到的位图数据应用到TransparentBlt里面了。(想把原始窗口隐藏掉)
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?
msdn里面给的例子里面就没有releaseDC
不用ReleaseDC()了,还有,我这个声明RECT变量的时候,放在全局是不是有助于提高运行速度?,还有GetWindowRect 可以放在InitDialog里吧?