更新图像显示时的QImage和openmp

时间:2015-10-14 16:23:43

标签: c++ multithreading qt openmp qimage

在Mac的Qt 5.5中,我试图加速计算图像缓冲区及其显示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色通道。它们的大小等于nPixels。值naxis1naxis2是宽度和高度(以像素为单位)。

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

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

由于

1 个答案:

答案 0 :(得分:1)

感谢评论中的建议,我修复了它。需要pragma子句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);

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