最快的方法是IplImage IPL_DEPTH_32S转换为QImage的Format_RGB32

2019-07-30 07:10发布

什么是IplImage结构IPL_DEPTH_32S转换为QImage的Format_RGB32最快的方法是什么?

我需要从凸轮赶上图片和频率显示它在形式,每秒30帧。 我试图用QImage的构造函数:

QImage qImage((uchar *) image->imageData, image->width, image->height, QImage::Format_RGB32);

但图像在这之后损坏。 所以,我怎么能这样快的(我觉得把逐个像素为QImage的是不是一个很好的决定)?

Answer 1:

在我开始之前,OpenCV的默认使用BGR格式 。 不是RGB! 所以在创建之前QImage您需要将转换IplImage为RGB用:

cvtColor(image, image, CV_BGR2RGB);

然后你可以:

QImage qImage((uchar*) image->imageData, image->width, image->height, QImage::Format_RGB32);

需要注意的是构造上面不会复制数据,你可能会想,作为文档指出:

该缓冲区必须在整个的QImage的生活仍然有效

所以,如果您有性能问题,是不是因为在转换过程中 。 这是最有可能被使用的是(这是不是在这个问题共享)的绘制方法造成的。 总结很多等等等等,你应该呈现QImage到一个OpenGL纹理 ,让显卡做所有的图纸给你。

你的问题是有点误导,因为你的主要目标是不要找最快的转换方法,而是一个实际工作,因为你不知道。

另一个重要的事情要记住,当你说:

图像在此之后损坏

你必须知道,这完全是模糊的,它并不能帮助我们在所有的,因为有很多原因这种效果,并且没有源代码是不可能告诉肯定你在做什么错。 共享原始和损坏的图片可能提供了一些线索,问题出在哪里。

这就是现在它。 祝好运。



Answer 2:

IPL_DEPTH_32S是灰度与32位像素-通常用于深度数据,而不是实际的“形象”,如果你是packign彩色图像到检查像素顺序是什么。

QImage::Format_ARGB32_Premultiplied是最快的QImage的格式,因为它的什么显卡采用-注意,数据的顺序实际上是BGRA和A通道必须至少255,即大的像素,如果你不想使用alpha 。

有一个RGB2BGRA和BGR2RGBA在CV :: cvtColor()



Answer 3:

前段时间我发现怎么做,互联网的一些例子。 我提高了一个例子对位如何将图像,以及更简单的方法复制。 Qt的通常仅适用于字符像素(其它的图像格式通常称为HDR图像)。 我想知道你怎么弄的OpenCV的32个RGB视频缓冲......我从来没有见过的!

如果您在OpenCV的彩色图像,你可以使用这个功能来分配内存:

QImage* allocateqtimagefromcv(IplImage* cvimg)
    {
        //if (cvimg->nChannels==1)
        //  {
        //  return new QImage(cvimg->width,cvimg->height,QImage::Format_Indexed8);
        //  }
        if (cvimg)
            {
            return new QImage(cvimg->width,cvimg->height,QImage::Format_ARGB32);
            }
    }

只是在IplImage结构复制到qt的图像,你可以去简单的方法,利用此功能:

void  IplImage2QImage(IplImage *iplImg,QImage* qimg)
{

char *data = iplImg->imageData;
    int channels = iplImg->nChannels;
int h = iplImg->height;
int w = iplImg->width;
for (int y = 0; y < h; y++, data += iplImg->widthStep)
{
for (int x = 0; x < w; x++)
{
char r, g, b, a = 0;
if (channels == 1)
{
r = data[x * channels];
g = data[x * channels];
b = data[x * channels];
}
else if (channels == 3)
{
r = data[x * channels + 2];
g = data[x * channels + 1];
b = data[x * channels];
}

if (channels == 4)
{
a = data[x * channels + 3];
qimg->setPixel(x, y, qRgba(r, g, b, a));
}

}
}


}

下面的函数可能是一个更快的解决方案:

static QImage IplImage2QImage(const IplImage *iplImage)
{
  int height = iplImage->height;
  int width = iplImage->width;
  if (iplImage->depth == IPL_DEPTH_8U && iplImage->nChannels == 3)
  {
      const uchar *qImageBuffer =(const uchar*)iplImage->imageData;
      QImage img(qImageBuffer, width, height, QImage::Format_RGB888);
      return img.rgbSwapped();
  }else{
    //qWarning() << "Image cannot be converted.";
   return QImage();
  }
} 

希望我的帮助作用。 也许有人知道这样做的更好的方法:)



文章来源: Fastest method to convert IplImage IPL_DEPTH_32S to QImage Format_RGB32