编辑:诚实的建议如果您想实时从PMD流式传输,请使用C#。任何UI都很易于创建,并且OS非常强大的库Metrilus AG的Metricam,它支持各种3D-Cameras的流媒体。我能够得到稳定的45 fps。
原始:
我一直在努力从PMD扫描板纳米中获取深度信息,并将其形象化为GUI。该信息以165x120浮点数为单位传递。
我也想将数据用于分析目的(图像质量,白噪声等),所以我需要在特定的帧率上抓住框架。问题是,PMD使用相机提供的SDK(用于Matlab& c)仅提供了通过调用
抓住单个帧的可能性pmdUpdate(hnd);
因此,帧率取决于您对图像数据进行轮询的频率。
我最初尝试在MATLAB中进行分析,但是我无法从相机中获得超过30 fps,并在循环中添加了一些进一步的代码,因此无法使用(我需要至少可靠的25 fps)。
然后,我切换到C,在那里我获得了高达70 fps的速率,但无法可视化数据。然后,我尝试使用基于C/C 的QT进行了尝试 - 因此,它应该快速轮询图像数据,并且可以轻松地包括PMDSDK的库。但是,由于我是QT的新手,我对UI元素的了解不多。
所以我的问题:
是否有任何表现方式可以在QT-GUI上可视化2D-浮动阵列?如果不是,那么在带有C 的Visual Studio中有用的东西如何?
(我知道在qgraphicsview上绘制每个像素是愚蠢的,但是我尝试了,我得到的帧速率为.4 fps ...)
)感谢您的任何有用建议!
jannik
qimage类实际上具有接受UCHAR指针/数组的构造函数。您只需要将我的浮点值映射到UCHAR-FORMAT中的RGB值。
pmdGetDistances(hnd, dist, dd.img.numColumns*dd.img.numRows*sizeof(float));
uchar *imagemap = new uchar[dd.img.numColumns*dd.img.numRows*3];
int i,j;
for (i = 0; i < 165; i++){
for (j = 0; j < 120; j++){
uchar value = (uchar)std::floor(40*dist[j*165+i]);
if(value > 255 || value < 0){
value = 0;
}
//colorscaling integrated
imagemap[3*(j*165+i)] = floor((255-value)*(255-value)/255.0);
imagemap[3*(j*165+i)+1] = abs(floor((value-127)/1.5));
imagemap[3*(j*165+i)+2] = floor(value*value/255.0);
}
}
然后可以将qimage转换为pixmap并显示在qgraphicsview中。这对我有用,但是帧率似乎并不是真的稳定。
QImage image(imagemap, 165, 120, 165*3, QImage::Format_RGB888);
QPixmap pmap(QPixmap::fromImage(image));
scene->addPixmap(pmap.scaled(165,120));
ui->viewCamera->update();
可能值得一试,直到所需的时间经过。QThread::msleep(msec);