将IplImage IPL_DEPTH_32S转换为QImage Format_RGB32的最快方法
Fastest method to convert IplImage IPL_DEPTH_32S to QImage Format_RGB32
将IplImage IPL_DEPTH_32S转换为QImage Format_RGB32的最快方法是什么?
我需要捕捉来自摄像头的图片,并以每秒30帧的频率在表格上显示。我尝试使用QImage构造函数:
QImage qImage((uchar *) image->imageData, image->width, image->height, QImage::Format_RGB32);
但图像在此之后被损坏。那么,我该如何快速做到这一点(我认为将逐像素放入QImages不是一个好决定)?
在开始之前,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纹理,并让视频卡为你绘制所有的图形。
你的问题有点误导,因为你的主要目标不是找到最快的转换方法,而是一种真正有效的方法,因为你没有。
当你说:时,另一件需要记住的重要事情
此之后图像已损坏
你必须知道,这是完全模糊的,它对我们没有任何帮助,因为这种影响有很多原因,如果没有源代码,就不可能确切地说出你做错了什么。共享原始图像和损坏的图像可能会为问题所在提供一些线索。
现在就这样。祝你好运
IPL_DEPTH_32S
是带有32位像素的灰度级-通常用于深度数据,而不是实际的"图像",如果您要将彩色图像打包以检查像素顺序。
QImage::Format_ARGB32_Premultiplied
是最快的QImage格式,因为它是图形卡使用的格式-请注意,数据顺序实际上是BGRA,A通道必须至少与像素一样大,即255,如果你不想使用alpha。
cv::cvtClor()中有一个RGB2BGRA和BGR2RGBA
不久前,我在互联网上发现了一些如何做到这一点的例子。我对如何以更简单的方式复制图像的示例进行了一些改进。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();
}
}
希望我的功能有所帮助。也许有人知道更好的方法:)
- Httpfile sendrequest -> format requestbody?
- Clang-Format 不能正确分配函数参数
- 编译器给出错误:format 指定类型 'float *',但参数的类型'double' [-Wformat]
- 什么 clang-format 相当于 rustfmt 的 indent_style=Block?
- <format> 找不到标头 (C++)
- clang-format:IncludeIsMainRegex不起作用
- NV12 至 RGB32,带Microsoft媒体基础
- 如何获得 fmt::format 与wchar_t一起使用?
- 为什么我从 gdbserver 获得"not in executable format: Success",但在 gdb 中一切正常?
- 如何在 C++ 中从 python 做 string.format()
- Clang-Format:重新组合字符串文字
- 特征"Sparse matrix format"示例是否包含错误?
- q致命参数:将 QString 转换为常量字符* 会导致警告"format string is not a string literal"
- 如何将非可变参数值传递给 fmt::format?
- 有没有办法强制对 clang-format/clang-tidy 中的类成员/方法使用 "this->"?
- 告诉Clang-Format忽略布拉格马斯
- 在 CString::Format 中使用 CString 对象
- Microsoft 编辑默认工具栏时的 Visual Studio 'Unknown Bitmap Format'
- QT 创建器:无法添加 OpenCV dll 库 ( "File format not recognized" )
- clang format函数和错误检查在同一行