c++ - 更新图像显示时的QImage和openmp

标签 c++ multithreading qt openmp qimage

在 Qt 5.5 for mac 中,我试图用 QImage 加速计算图像缓冲区及其显示。我正在使用 openMP 指令,但我意识到这会干扰 QImage 显示。

代码如下:

int = 65535    
newPaintImage = new QImage(naxis1, naxis2, QImage::Format_ARGB32 );
#pragma omp parallel for
for ( int ii = 0; ii < nPixels; ++ii )
{
    cred = (int) 255 * red16[ii] / range;
    cgreen = (int) 255 * green16[ii] / range;
    cblue = (int) 255 * blue16[ii] / range;     

    QRgb argb = qRgba( cred, cgreen, cblue, 255);
    QRgb* rowData = (QRgb*) newPaintImage->scanLine(ii/naxis1);
    rowData[ii%naxis1] = argb;
}
newPaintWidget = new PaintWidget(newPaintImage, naxis1, naxis2);

在上面的代码中,nPixels 是图像中的像素总数以及red16green16blue16 是我图像的 3 色 channel 。它们的大小等于 nPixels。值 naxis1naxis2 是宽度和高度(以像素为单位)。

注意用于并行化 for 循环的 pragma 指令。当我使用它时,我的图像中出现乱码,对图像的任何更新都会改变结果。 当我不使用 pragma 指令时,只使用一个线程,我的图像如预期的那样很好。 我用这种并行化改变和更新缓冲区,这会弄乱显示。

有没有更好的方法?就像确保我的线程完成工作然后更新 Qt 对象的 paintEvent 中的显示一样?或者与 QImage 如何在线程之间共享有关的东西?...

谢谢

最佳答案

感谢评论中的建议,我修复了它。需要 pragma 子句 private 来定义要使用的私有(private)变量。

int cred2, cgreen2, cblue2   
#pragma omp parallel for private(cred2, cgreen2, cblue2)
for ( int ii = 0; ii < nPixels; ++ii )
{
    cred2 = (int) 255 * red16[ii] / range;
    cgreen2 = (int) 255 * green16[ii] / range;
    cblue2 = (int) 255 * blue16[ii] / range;
    QRgb argb = qRgba( cred2, cgreen2, cblue2, 255);
    QRgb* rowData = (QRgb*) newPaintImage->scanLine(ii/naxis1);
    rowData[ii%naxis1] = argb;
}
newPaintWidget = new PaintWidget(newPaintImage, naxis1, naxis2);

是的,它要快得多!这与一些执行对比度拉伸(stretch)的 QSlider 信号/插槽一起使用。我在这里简化了代码。事实上,range 是变化的而不是固定的,例如red16[ii](red16[ii] - minValue) 其中 minValue 随一些 QSlider 而变化。

关于c++ - 更新图像显示时的QImage和openmp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33130691/

相关文章:

c++ - 使用 aho-corasick 算法崩溃?

c++ - 如何将 JsonCPP 值作为字符串获取?

c# - 使用 lock(this) 说明死锁的示例代码

java - 在 Java 中每秒执行许多 http 请求的有效方法

multithreading - 将数据并行写入磁盘?

c++ - 如何在 Qt QML 中退出 C++ 应用程序

qt - 如何设置组合框或双旋转框等小部件的背景颜色?

c++ - 将 C++ 类的实例转换为 NSObject,然后添加到 NSMutableArray

c++ - 学习曲线最简单的 C++ GUI 构建选项是什么 - VS/Qt/wxWidgets/等?

C++ ISO 对指向基的解除引用指针的标准解释