在 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);
编辑:诚实的推荐 如果您想实时从 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);