我遇到了将Image对象(使用Point Grej FlyCapture2 SDK捕获)传递给QImage对象的问题。我按功能获得了与图像数据相关的指针:
virtual unsigned char* FlyCapture2::GetData ( )
然后通过以下方式加载数据:
QImage::QImage ( uchar * data, int width, int height, int bytesPerLine, Format format )
两个Image对象的数据格式都是8位单色。 BytesPerLine参数应该等于Image的宽度(我已经通过将FlyCapture2 :: Image保存到.bmp并将其加载到QImage来检查它)。
问题是从unsigned char *转换为uchar *吗? 你还有其他建议吗?逐像素复制图像太慢了。
编辑:我正在将FlyCapture捕获的图像转换为FlyCapture2::PIXEL_FORMAT_RGB8
,其中:R = G = B = 8位,在PGR::SnapShot()
函数内。 SnapShot()返回unsigned char
* const。
这是我的Qt显示功能的一部分:
unsigned char *const img = PGRSystem->SnapShot();
QImage Img(img, 1024, 768, QImage::Format_RGB888);
QGraphicsScene *Scene = new QGraphicsScene();
Scene->addPixmap(QPixmap::fromImage(Img));
ui.ImageView->setScene(Scene);
ui.ImageView->fitInView(ui.ImageView->itemAt(100,100));
delete [] Scene;
我也尝试将Img保存到文件中,但是后来得到了未处理的异常。我尝试了其他像素格式对(FlyCapture2::PIXEL_FORMAT_RGB
- 24位RGB与QImage::RGB88
8和FlyCapture2::PIXEL_FORMAT_RGBU32
与QImage::RGB32
)
值得一提的是,我使用的QImage构造函数没有设置colorTable(我在检查QImage是否为grayScale时遇到异常)。 我猜我需要一些帮助。
答案 0 :(得分:5)
第一件事 - QImage不支持原生灰度图像,这听起来好像你正在输出 - 所以我很想知道你正在使用什么格式参数。可能最简单的解决方案,虽然内存无效,但是通过将每个值复制三次(进入新的QByteArray)将灰度图像扩展为RGB。
另外一个问题是你正在使用的特定QImage构造函数不复制底层数据,所以你需要确保从GetData()返回的指针超过QImage - 或强制QImage在内部制作副本,比如使用QImage :: copy。
正如其他受访者所述,查看更多代码会有所帮助。
答案 1 :(得分:1)
非常感谢您的帮助,您对图像格式的看法是正确的。不幸的是,主要问题与在函数之间传递指针有关。在PGR :: SnapShot()中我创建了FlyCapture2 :: Image,然后我得到了指向数据的指针。 FlyCapture2 ::图像在退出函数时被破坏,因此返回的指针是BadPtr。