請教怎样在扑捉的视频信号上面加十字标 DirectShow高手帮忙

abo77281 2010-11-01 01:23:00
请教兄弟姐妹:

我用Directshow做个视屏采集。

开了两个Surface:
(1)g_pDDSPrimary
// Create the primary surface
memset(&ddsd, 0, sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_VIDEOPORT;
hRet = g_pDD->CreateSurface(&ddsd, &g_pDDSPrimary, NULL);
(2)g_pDDSOverlay
// Create the overlay surface
memset(&ddsd, 0, sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
ddsd.ddsCaps.dwCaps = DDSCAPS_OVERLAY | DDSCAPS_FLIP |
DDSCAPS_VIDEOMEMORY | DDSCAPS_VIDEOPORT;
ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_BACKBUFFERCOUNT |
DDSD_PIXELFORMAT;
hRet = g_pDD->CreateSurface(&ddsd, &g_pDDSOverlay, NULL);

Video的视频放在g_pDDSPrimary上面。
然后在g_pDDSOverlay画上我想要显示的图标,然后覆盖在g_pDDSPrimary上面。
g_pDDSOverlay->UpdateOverlay(&rs, g_pDDSPrimary, &rd, DDOVER_SHOW, NULL);

现在问题是怎样在视屏上显示各十字光标,用透明位图或是其他方法都可以?

请教各位!

...全文
246 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
abo77281 2010-11-02
  • 打赏
  • 举报
回复
uping~
abo77281 2010-11-02
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 dengzikun 的回复:]
引用 16 楼 abo77281 的回复:
引用 15 楼 dengzikun 的回复:
现在手头没有代码。
以前用这种方式做过在OVERLAY表面上叠加文字。

思路很简单,设置OVERLAY色键,把视频窗口背景刷为色键的颜色,
需要叠加的文字等设置为非色键颜色,然后直接画在视频窗口即可。


色键还不是太明白~~


那就放弃DDRAW吧,限制很多,还很麻烦。


用D3……
[/Quote]

是我就是加個透明层而已,呵呵~
dengzikun 2010-11-02
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 abo77281 的回复:]
引用 15 楼 dengzikun 的回复:
现在手头没有代码。
以前用这种方式做过在OVERLAY表面上叠加文字。

思路很简单,设置OVERLAY色键,把视频窗口背景刷为色键的颜色,
需要叠加的文字等设置为非色键颜色,然后直接画在视频窗口即可。


色键还不是太明白~~
[/Quote]

那就放弃DDRAW吧,限制很多,还很麻烦。
用D3D吧。
参考 http://blog.csdn.net/dengzikun/archive/2010/08/19/5824874.aspx
abo77281 2010-11-02
  • 打赏
  • 举报
回复
uping!
abo77281 2010-11-01
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 brianzhuang007 的回复:]
不想加入视频流里面显示的话,在上面盖个透明窗口,在窗口上画。
[/Quote]

g_pDDSPrimary为主表面,我的视频显示在这个上面
g_pDDSOverlay主要是画些标志,现在在个overlay不知道怎么设置才能设成透明的?

您的意思是不是从新创建个Window,这个window是透明的?

brianzhuang007 2010-11-01
  • 打赏
  • 举报
回复
不想加入视频流里面显示的话,在上面盖个透明窗口,在窗口上画。
abo77281 2010-11-01
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 dengzikun 的回复:]
现在手头没有代码。
以前用这种方式做过在OVERLAY表面上叠加文字。

思路很简单,设置OVERLAY色键,把视频窗口背景刷为色键的颜色,
需要叠加的文字等设置为非色键颜色,然后直接画在视频窗口即可。
[/Quote]

色键还不是太明白~~
dengzikun 2010-11-01
  • 打赏
  • 举报
回复
现在手头没有代码。
以前用这种方式做过在OVERLAY表面上叠加文字。

思路很简单,设置OVERLAY色键,把视频窗口背景刷为色键的颜色,
需要叠加的文字等设置为非色键颜色,然后直接画在视频窗口即可。
abo77281 2010-11-01
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 dengzikun 的回复:]
画在窗口上,然后用OVERLAY色键显示。
[/Quote]

有沒有例子?
呵呵!
abo77281 2010-11-01
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 zgl7903 的回复:]
引用 9 楼 zgl7903 的回复:
SetBkMode(hDC, TRANSPARENT)

你放到哪里了 贴完整代码
[/Quote]



if (g_pDDSOverlay->GetDC(&hdc) == DD_OK)
{

SetBkMode(hDC, TRANSPARENT);//写字
//SetBkColor( hdc, RGB( 0, 0, 255 ) );
SetTextColor( hdc, RGB( 255, 255, 0 ) );
DrawText(hdc, szFrontMsg, -1, &m_TextShowRect, DT_WORDBREAK|DT_TOP|DT_LEFT);

//画线
MoveToEx(hdc,20,20,NULL);
LineTo(hdc,50,50);

g_pDDSOverlay->ReleaseDC(hdc);
}
RECT rs,rd;

rs.left = 0;
rs.top = 0;
rs.bottom = 100;
rs.right = 100;

rd.left = 0;//m_iDstX;
rd.top = 0;//m_iDstY;
rd.bottom = rd.top + 100;
rd.right = rd.left + 100;

g_pDDSOverlay->UpdateOverlay(&rs, g_pDDSPrimary, &rd, DDOVER_SHOW|DDOVER_KEYDESTOVERRIDE , NULL);
dengzikun 2010-11-01
  • 打赏
  • 举报
回复
画在窗口上,然后用OVERLAY色键显示。
zgl7903 2010-11-01
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 zgl7903 的回复:]
SetBkMode(hDC, TRANSPARENT)
[/Quote]
你放到哪里了 贴完整代码
abo77281 2010-11-01
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 zgl7903 的回复:]
SetBkMode(hDC, TRANSPARENT)
[/Quote]

还是一样的效果,在那区块,底色还是乱的颜色。
没有把视频显示出来!

是不是配置有问题?

// Get normal mode
hRet = g_pDD->SetCooperativeLevel(m_hWnd, DDSCL_NORMAL);
zgl7903 2010-11-01
  • 打赏
  • 举报
回复
SetBkMode(hDC, TRANSPARENT)
abo77281 2010-11-01
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 xiaohuh421 的回复:]
没有设置成透明吧.
把dc背景设置成透明,
[/Quote]

不知道怎样设置,请指教,呵呵!
我code:

if (g_pDDSOverlay->GetDC(&hdc) == DD_OK)
{
//写字
//SetBkColor( hdc, RGB( 0, 0, 255 ) );
SetTextColor( hdc, RGB( 255, 255, 0 ) );
DrawText(hdc, szFrontMsg, -1, &m_TextShowRect, DT_WORDBREAK|DT_TOP|DT_LEFT);

//画线
MoveToEx(hdc,20,20,NULL);
LineTo(hdc,50,50);

g_pDDSOverlay->ReleaseDC(hdc);
}
RECT rs,rd;

rs.left = 0;
rs.top = 0;
rs.bottom = 100;
rs.right = 100;

rd.left = 0;//m_iDstX;
rd.top = 0;//m_iDstY;
rd.bottom = rd.top + 100;
rd.right = rd.left + 100;

g_pDDSOverlay->UpdateOverlay(&rs, g_pDDSPrimary, &rd, DDOVER_SHOW|DDOVER_KEYDESTOVERRIDE , NULL);

我的overlay区在primary的上面(0,0,100,100)的地方,这样code显示的结果:除了字可以显示出来,而且字的底色是白的,还能画出一条黑线。但是在这个rect下面的其他部分是乱的颜色。
xiaohuh421 2010-11-01
  • 打赏
  • 举报
回复
没有设置成透明吧.
把dc背景设置成透明,
abo77281 2010-11-01
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zgl7903 的回复:]
if(pDDSOverlay)
{
HDC hDC = g_pDDSOverlay->GetDC();

//有了DC句柄应该会玩了吧?

g_pDDSOverlay->ReleaseDC(hDC);
}
[/Quote]

謝謝!
我得到这个句柄,可以在Overlay上面写字,加位图,但是这个指示在Overlay的那个rect上面操作。
中间画个十字叉,那个rect下面的视屏就显示不出来了。

不知道有么有其它的办法?


zgl7903 2010-11-01
  • 打赏
  • 举报
回复
if(pDDSOverlay)
{
HDC hDC = g_pDDSOverlay->GetDC();

//有了DC句柄应该会玩了吧?

g_pDDSOverlay->ReleaseDC(hDC);
}

19,469

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧