opencv Qt如何有效地创建彩色图像并将其传递给QImage

opencv Qt how to efficiently create and pass color image to QImage?

本文关键字:QImage 彩色图像 Qt 有效地 创建 opencv      更新时间:2023-10-16

这个问题在如何将opencv cv::Mat转换为qimage 时得到了部分回答

我使用Qt 5.5和opencv 2.4,mac yosemite 10.10.5。

我正在寻找一种有效的方法来显示具有QImage的彩色图像,其颜色信息来自3个不同的cv::Mat对象,这些对象包含彩色图像的3个RGB通道。为了我自己的"教育",我需要了解如何在最初的工作中与渠道分离。我还不清楚什么是最有效的方式来结束这3个独立通道的QImage。

cv::Mat对象的声明和分配如下:

imRed = new Mat(Size(naxis1, naxis2), CV_64F);
imGreen = new Mat(Size(naxis1, naxis2), CV_64F);
imBlue = new Mat(Size(naxis1, naxis2), CV_64F);

double* redP = imRed->ptr<double>(0);
double* greenP = imGreen->ptr<double>(0);
double* blueP = imBlue->ptr<double>(0);
for (long i = 0; i < nPixels; i++)
{
    redP[i] = (double) rawProcess.imgdata.image[i][0];;
    greenP[i] = (double) rawProcess.imgdata.image[i][1];
    blueP[i] = (double) rawProcess.imgdata.image[i][2];
}

其中CCD_ 1是来自包含图像数据的Libraw库的对象。正如其名称所示,redPgreenPblueP是指向红色、绿色和蓝色通道的指针,此代码假设(如果我错了,请纠正我)像素值的cv::Mat地址在内存中是连续的。

从这里开始,我应该如何有效地将颜色图像的缓冲区传递给QImage,即最大限度地减少中间副本、循环等…(如果必要,我的系统可以使用openMP,我有4个线程可用)?

感谢

下面的代码正在工作。

从上面的代码开始(用naxis1和naxis2表示图像的宽度和高度):

imRed = new Mat(Size(naxis1, naxis2), CV_64F);
imGreen = new Mat(Size(naxis1, naxis2), CV_64F);
imBlue = new Mat(Size(naxis1, naxis2), CV_64F);

double* redP = imRed->ptr<double>(0);
double* greenP = imGreen->ptr<double>(0);
double* blueP = imBlue->ptr<double>(0);
for (long i = 0; i < nPixels; i++)
{
    redP[i] = (double) rawProcess.imgdata.image[i][0];;
    greenP[i] = (double) rawProcess.imgdata.image[i][1];
    blueP[i] = (double) rawProcess.imgdata.image[i][2];
}

我补充道:

std::vector<cv::Mat> matVector;
matVector.push_back(imRed);
matVector.push_back(imGreen);
matVector.push_back(imBlue);
cv::Mat colorMat32;
cv::merge(matVector, colorMat32);
cv::Mat colorMat888
double alpha = (double) (255 / 65535);
double beta = 0.0;
colorMat32.convertTo(colorMat888, CV_8UC3, alpha, beta);
newPaintImage = new QImage(colorMat888.data, naxis1, naxis2, QImage::Format_RGB888);

谢谢@Micka。