2010-10-27 123 views
4

我遇到了将Image对象(使用Point Grej FlyCapture2 SDK捕获)传递给QImage对象的问题。我正在通过与功能的图像数据相关联的指针:从unsigned char构造QImage * data

virtual unsigned char* FlyCapture2::GetData ( ) 

,然后通过加载数据:

两个图像对象的数据的
QImage::QImage (uchar * data, int width, int height, int bytesPerLine, Format format) 

格式是8位单色。 BytesPerLine参数应该等于图像的宽度(我已经通过将FlyCapture2 :: Image保存为.bmp并将其加载到QImage中来检查它)。

你的问题是从无符号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; 

我也试图挽救图到文件,却得到了未处理的异常即可。我尝试过其他的像素格式对(FlyCapture2::PIXEL_FORMAT_RGB - 24位RGB与与QImage::RGB32

还值得一提的是QImage的constuctor,我现在用的,不设置colorTable(我得到异常时检查QImage是否在grayScale中)。 我想我需要多一点帮助。

+0

你遇到什么问题? – hmuelner 2010-10-27 10:31:39

+0

图像传递不正确。在QGraphicsView上设置场景时,我收到空白图片。 – Marcin 2010-10-27 10:40:37

+0

uchar是一个unsigned char,所以不应该是问题。您可能需要发布一些实际的代码,以便进一步确定。 – 2010-10-27 13:54:31

回答

5

第一件事 - QImage不支持原生灰度图像,这听起来就像是作为输出一样 - 所以我会好奇你使用的是什么Format参数。可能最简单的解决方案,虽然内存不足,但将通过将每个值复制三次(到新的QByteArray)来将灰度图像扩展为RGB。

另外一个问题是,你使用特定的QImage构造,确实复制的基础数据,因此你需要确保从的GetData()返回的指针会超越的QImage的 - 或强制的QImage作复制内部,使用,例如,QImage :: copy。

正如其他受访者指出的那样,看到更多的代码会有所帮助。

+0

我会在绘制之前对自己的数据进行赌注。 – 2010-10-27 19:42:09

+0

我正在使用QImage :: Format_Indexed8。我昨天发现这不是原生灰度格式。你认为QImage :: setColorCount和setColorTable会解决这个问题吗? – Marcin 2010-10-28 08:11:55

+0

您可以创建一个颜色表,将每个色调值映射到一个等效的RGB值,但考虑到RAM很便宜,并且索引图像对于系统来说要稍微复杂些,所以我建议将每个像素值扩展到RGB之前建立QImage。 (QImage确实应该支持灰度图像,但这是另一个问题)。任何一种方法都应该可以工作,所以如果填充颜色表对您来说更容易,那就去做吧。 – 2010-10-28 08:30:02

1

非常感谢您的帮助,您对图像格式是正确的。不幸的是,主要问题与在函数之间传递指针有关。在PGR :: SnapShot()中,我创建了FlyCapture2 :: Image,然后我得到了指向数据的指针。 FlyCapture2 :: Image在退出函数时被破坏,所以返回的指针是BadPtr。

相关问题