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

时间:2015-11-05 08:26:57

标签: c++ qt opencv colors

how to convert an opencv cv::Mat to 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];

}

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

从这里开始,我如何有效地颜色图像的缓冲区传递给QImage,即最小化中间复制,循环等...(如果有必要,我的系统可以使用openMP,我有4个线程可用)?

由于

1 个答案:

答案 0 :(得分:0)

以下代码正常运行。

从上面的代码开始(使用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。