在 Qt 中可视化来自 PMD Camboard Nano 的流

Visualize stream from a PMD Camboard Nano in Qt

编辑:诚实的推荐 如果您想实时从 PMD 流式传输,请使用 C#。任何 UI 都易于创建,并且有 os 相当强大的库,MetriCam 由 Metrilus AG 提供,它支持各种 3D 相机的流式传输。我可以用它获得稳定的 45 fps。

原创:

我一直在尝试从 PMD camboard nano 中获取深度信息并在 GUI 中将其可视化。信息以 165x120 浮点数组的形式提供。

由于我还想将数据用于分析 purpose(图像质量、白噪声等),因此我需要以特定的帧率抓取帧。问题是,PMD 随相机提供的 SDK(用于 MATLAB 和 C)仅提供 pos通过调用

抓取单帧的能力
pmdUpdate(hnd);

因此帧速率取决于您轮询图像数据的频率。

我最初尝试在 MATLAB 中进行分析,但我无法从相机中获得超过 30 fps 的数据,并且向循环中添加了一些进一步的代码使得它变得 impos 可以使用 (我至少需要可靠的 25 fps)。

然后我切换到 C,在那里我获得了高达 70 fps 的速率,但无法可视化数据。

然后我用基于 C/C++ 的 Qt 进行了尝试 - 因此它应该可以快速轮询图像数据 - 并且我可以轻松地包含 PMDSDK 的库。不过,由于我是 Qt 的新手,所以我对 UI-Elements 了解不多。

所以我的问题是:
有没有什么高效的方法可以在 Qt-GUI 上可视化二维浮点数组?如果没有,在 Visual Studio 和 C++ 中有用的东西怎么样?

(我知道在 QGraphicsView 上一个一个地绘制每个像素是愚蠢的,但我试过了,我得到了 0.4 fps 的惊人帧率...)

感谢任何有用的建议!

贾尼克

QImage Class 实际上有一个接受 uchar pointer/array 的构造函数。您只需要将我的浮点值映射到 uchar 格式的 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);