• 19035阅读
  • 15回复

Qt 图像处理速度 [复制链接]

上一主题 下一主题
离线guanxu
 

只看楼主 倒序阅读 楼主  发表于: 2008-08-30
— 本帖被 XChinux 执行加亮操作(2008-08-30) —
我最近想编一个图像查看软件,1.能查看图像的 RGB 通道强度,2.能调整图像亮度

基本思路是这样的:用QImage 读取图像,接下来
1.查看图像的 RGB 通道强度:用一个循环遍历所有像素,用QImage::pixel取出像素颜色值,
用 QImage::setPixel 将红色通道的值赋予绿色和蓝色通道,这样就得到一个红色通道的图像。
2.调整图像亮度,基本思路和上面的一样,只是QImage::setPixel 时乘以一个系数就行了,
用一个 QSlider 来调整亮度数值

编出来了,虽然最后能达到效果,但是速度奇慢,调整亮度时,没操作一下基本都要反应一两秒。
我用过其他图像处理软件,比如 photoshop, shake, fusion 查看通道值和调整亮度完全没有反应时间,
很快,就算是计算量很大的 “模糊”操作也可以实时调整。这些软件是如何做到的呢???

用 Qt  能不能实现高效率的图像处理呢??还需要哪些知识呢??

这是我学习 Qt 中最大的一个困惑!
如果哪位高手能解决我的问题,我真是万分感谢!!
离线yysr

只看该作者 1楼 发表于: 2008-08-30
photoshop等图像处理软件的核心处理部分可能是用汇编语言编写的。而且针对CPU进行了优化处理,比如一次同时执行4个浮点数的运算。
离线duduqq

只看该作者 2楼 发表于: 2008-08-31
听说用QImage的速度是很慢的,试试用QPixmap,还有一个叫svg的,看看可不可以用这些类
离线mumutouv

只看该作者 3楼 发表于: 2008-09-01
算法问题
离线grissiom
只看该作者 4楼 发表于: 2008-09-21
什么样的算法比较好?我这里也遇到同样的问题了,遍历一个664×507的png都要三秒……
离线optphantom

只看该作者 5楼 发表于: 2008-09-21
QImage提供了scanLine方法,可以提高图像处理速度
离线grissiom
只看该作者 6楼 发表于: 2008-09-21
引用第5楼optphantom于2008-09-21 17:27发表的  :
QImage提供了scanLine方法,可以提高图像处理速度

这个 scanline 怎么用呢……
离线guanxu

只看该作者 7楼 发表于: 2008-10-27
知道怎么办了!用 GPU 加速。
用 OpenGL + GLSL 就能实现很高的速度。
apple 的 motion 就是用这种方法编的(当然了,不使用 Qt 编的)
不过这涉及到很多知识,我就不多说了,介绍几个相关的网站吧。

Qt 中配置 OpenGL      http://www.qiliang.net/nehe_qt/
OpenGL 官方网站    http://opengl.org/
NeHe 的OpenGL 教程  http://nehe.gamedev.net/
GLSL 教程      http://www.ozone3d.net/tutorials/index_glsl.php

还有几本好书, OpenGL Red Book, OpenGL shading language
离线nmiirq

只看该作者 8楼 发表于: 2008-10-27
顶楼主的分享精神~
离线priestmoon

只看该作者 9楼 发表于: 2008-10-28
对QPainter的若干问题感到困惑不解的菜鸟飘过…………
离线fandeyao
只看该作者 10楼 发表于: 2009-11-04
有用QImage作图像处理算法的吗   大家一起建个群讨论讨论    QQ:309721476
离线mecland
只看该作者 11楼 发表于: 2009-11-04
算法优化问题。我在开发板上实时显示视频,在显示函数中将一个行列循环改为单循环,结果显示速度提高了2帧。
离线jiulai
只看该作者 12楼 发表于: 2009-11-04
调整亮度bright,一般是这样做吧。
int width = image.width();
int height = image.height();
uchar *line = image.bits();
uchar *pixel = 0;
for (int y = 0; y < height; y++) {
    pixel = line;
    for (int x = 0; x < width; x++) {
        *pixel = qBound(0, *pixel + bright, 255);
        *(pixel + 1) = qBound(0, *(pixel + 1) + bright, 255);
        *(pixel + 2) = qBound(0, *(pixel + 2) + bright, 255);;
        pixel += 4;
    }
    line += image.bytesPerLine();
}
应该是很快的呀。
离线voidbroken

只看该作者 13楼 发表于: 2011-04-25
感谢分享
离线cc_guodong
只看该作者 14楼 发表于: 2013-01-21
做图象处理,建议看一下OpenCV图形库。
离线orafy

只看该作者 15楼 发表于: 2013-01-21
都是硬件加速的。。。
你可以看下QtQuick2里面的QtGraphicalEffecs,全是用的shader,在显卡上算的,如果你想转换回QImage,最后把图像从fbo读出来即可。
如果想做得更好,不受限于显卡支持的几种格式的话,就用Cuda,OpenCL自己写算法算额。用Qt5的话,花几分钟就可以弄个演示了:

qml例子 ImageEffect.rar (19 K) 下载次数:7

快速回复
限100 字节
 
上一个 下一个