2015-05-07 2 views
1

EDIT: честная рекомендация Если вы хотите передать из PMD в реальном времени, используйте C#. Любой пользовательский интерфейс прост в создании и существует довольно мощная библиотека, MetriCam от Metrilus AG, которая поддерживает потоковое вещание для различных 3D-камер. Я могу получить стабильные 45 fps с этим.Визуализируйте поток из PMD Camboard Nano в Qt

ORIGINAL:

Я пытался получить информацию о глубине от PMD camboard nano и визуализировать его в графическом интерфейсе. Информация поставляется в виде массива с плавающей точкой 165x120.

Поскольку я также хочу использовать данные для целей анализа (качество изображения, белый шум и т. Д.), Мне нужно захватить кадры с определенной частотой кадров. Проблема заключается в том, что SDK, который PMD обеспечивает с камерой (для MATLAB & C) только дает возможность захватывать отдельные кадры по телефону

pmdUpdate(hnd); 

так фреймрейт зависит от того, как часто вы опрашивать данные изображения.

Первоначально я попытался выполнить анализ в MATLAB, но я не смог получить более 30 кадров в секунду из-за камеры, а добавление какого-то дополнительного кода в цикл затрудняло работу (мне нужно как минимум надежное 25 кадров в секунду).

Затем я переключился на C, где я получил скорость до 70 кадров в секунду, но не смог визуализировать данные.

Затем я попробовал его с Qt, который основан на C/C++ - поэтому он должен быстро проверять данные изображения - и где я мог бы легко включать библиотеки PMDSDK. Однако, поскольку я новичок в Qt, я мало что знаю о пользовательских интерфейсах.

Итак, мой вопрос:
Есть ли какой-либо эффективный способ визуализации 2D-float-массива на Qt-GUI? Если нет, как насчет чего-нибудь полезного в Visual Studio с C++?

(я знаю, что рисование каждого пикселя по одному на QGraphicsView тупо, но я попробовал, и я получаю колоссальную частоту кадров .4 кадров в секунде ...)

Спасибо за любые полезные советы!

Jannik

ответ

1

QImage класса на самом деле имеет конструктор, который принимает Uchar указатель/массив. Вам нужно только сопоставить свои значения float с значениями RGB в формате uchar.

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);

Смежные вопросы