关于图形缩放,请大家指点迷津....

loseme915 2010-04-16 10:29:52
我现在遇到一个问题,输入端为视频采集卡,输出画面大小为1920*1080,RGB32.帧率为25FPS
我现在想把这个画面缩小,缩小时按照整数倍来处理,比如缩小2倍,3倍,4倍....有没有一个效率非常高的算法可以完成这个工作....
另外采集卡过来以后,是一个内存块,我不想把内存块放在DC上,或者DIRECT DRAW平面上来缩放,那样会经过两次内存的复制,严重影响效率。我希望直接在内存中完成。这样可以减少内存复制的次数.
希望大家提供一些帮助......
效率第一位.......质量第二位......
谢谢大家....
...全文
162 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangyingyingqq 2010-04-23
  • 打赏
  • 举报
回复
我也想知道这位神仙的BLOG哎,麻烦楼主分享下不
Fireway2008 2010-04-17
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 loseme915 的回复:]
结帖咯。找到一位神仙....他的BLOG上有SSE优化过的二次线性算法.....感谢各位提供的帮助
[/Quote]

LZ,能否把这位神仙的BLOG贴出来让大伙分享一下?
loseme915 2010-04-17
  • 打赏
  • 举报
回复
结帖咯。找到一位神仙....他的BLOG上有SSE优化过的二次线性算法.....感谢各位提供的帮助
xiuxianshen 2010-04-17
  • 打赏
  • 举报
回复
晕,你就是要个缩放算法而已,我还以为多大的问题
你可以网上搜索下近邻插值、线性、双线性、立方插值等等,一般都有优化过的代码的
当然你还可以根据自己的要求再用合并函数优化,减少内存拷贝
根据不同的缩放倍率选择不同的算法是最好的,毕竟有时不同的算法在一定倍率下结果会很近似,而时间消耗却大不相同
loseme915 2010-04-17
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 gamedragon 的回复:]
引用 8 楼 loseme915 的回复:
先谢谢LongLongAgoImBoy兄弟。
明天测试一下效果.呵呵.

你到底想要效率还是质量啊。
[/Quote]
我想要各种各样的算法.......最好DEMO代码的。我想测试一下性能...最后选择一个合适的。
gamedragon 2010-04-16
  • 打赏
  • 举报
回复
如果为了显示的话,用StretchBlt就有系统帮你搞定,说不定还是硬件加速的。

如果一定要自己搞,这种整数倍的还不要质量就隔点抽取呗。
原始内存->(隔点抽取)->目的内存->显示。
xiuxianshen 2010-04-16
  • 打赏
  • 举报
回复
去看看CUDA,直接显存处理
缩放算法遍地都是
loseme915 2010-04-16
  • 打赏
  • 举报
回复
郁闷...............
soswaidao 2010-04-16
  • 打赏
  • 举报
回复
友情帮顶,友情帮顶
SullenSun 2010-04-16
  • 打赏
  • 举报
回复
顶一下。。
gamedragon 2010-04-16
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 loseme915 的回复:]
先谢谢LongLongAgoImBoy兄弟。
明天测试一下效果.呵呵.
[/Quote]
你到底想要效率还是质量啊。
mjh1021 2010-04-16
  • 打赏
  • 举报
回复
自己写缩放程序效率可能不高,可以考虑用OPENCV,貌似是有优化过的。如果不想内存复制,可以让他的图像数据结构中的数据指针指向你自己的内存,不过用完记得指回去。
loseme915 2010-04-16
  • 打赏
  • 举报
回复
先谢谢LongLongAgoImBoy兄弟。
明天测试一下效果.呵呵.
Jimmy_Xia 2010-04-16
  • 打赏
  • 举报
回复
隔点抽取/简单,快速,但是有误差
多点平均值/平滑较好,取样的点越多越慢。最好的是取周围上下左右斜角的8个点。
=================================================================
帮你从网上找了一个线性插值算法:
http://www.chinaitpower.com/A/2002-02-17/14223.html

int __fastcall TResizeDlg::Stretch_Linear(Graphics::TBitmap * aDest, Graphics::TBitmap * aSrc)

{

int sw = aSrc->Width - 1, sh = aSrc->Height - 1, dw = aDest->Width - 1, dh = aDest->Height - 1;

int B, N, x, y;

int nPixelSize = GetPixelSize( aDest->PixelFormat );

BYTE * pLinePrev, *pLineNext;

BYTE * pDest;

BYTE * pA, *pB, *pC, *pD;

for ( int i = 0; i <= dh; ++i )

{

pDest = ( BYTE * )aDest->ScanLine[i];

y = i * sh / dh;

N = dh - i * sh % dh;

pLinePrev = ( BYTE * )aSrc->ScanLine[y++];

pLineNext = ( N == dh ) ? pLinePrev : ( BYTE * )aSrc->ScanLine[y];

for ( int j = 0; j <= dw; ++j )

{

x = j * sw / dw * nPixelSize;

B = dw - j * sw % dw;

pA = pLinePrev + x;

pB = pA + nPixelSize;

pC = pLineNext + x;

pD = pC + nPixelSize;

if ( B == dw )

{

pB = pA;

pD = pC;

}

for ( int k = 0; k < nPixelSize; ++k )

*pDest++ = ( BYTE )( int )(

( B * N * ( *pA++ - *pB - *pC + *pD ) + dw * N * *pB++

+ dh * B * *pC++ + ( dw * dh - dh * B - dw * N ) * *pD++

+ dw * dh / 2 ) / ( dw * dh )

);

}

}

return 0;

}
gamedragon 2010-04-16
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 loseme915 的回复:]
不是为了显示.如果显示的话就不用缩放了。我是进行一些特技处理然后再编码成视频..
隔点抽取的话,好象太随意了吧!至少也得取个权什么的....不知道谁……
[/Quote]
那就算区域内平均值啊,2468四个点缩一倍就变成37两个点。
loseme915 2010-04-16
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 gamedragon 的回复:]
如果为了显示的话,用StretchBlt就有系统帮你搞定,说不定还是硬件加速的。

如果一定要自己搞,这种整数倍的还不要质量就隔点抽取呗。
原始内存->(隔点抽取)->目的内存->显示。
[/Quote]
不是为了显示.如果显示的话就不用缩放了。我是进行一些特技处理然后再编码成视频..
隔点抽取的话,好象太随意了吧!至少也得取个权什么的....不知道谁有好的算法

19,468

社区成员

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

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