Я хочу прочитать кадр глубины в разрешении 640x480.
Я использую 64-разрядную версию Windows 8.1, 32-разрядную версию openni2, kinect: PSMP05000, PSCM04900 (PrimeSense).
Я беру ссылку на код отсюда:
не может установить разрешение VGA
Простое чтение
В сочетании с этим кодом:
main.cpp
OniSampleUtilities.h
SimpleRead.vcxproj
должен быть скомпилирован, если вы устанавливаете openni2 32bit отсюда:
OpeniNI 2
#include "iostream"
#include "OpenNI.h"
#include "OniSampleUtilities.h"
#define SAMPLE_READ_WAIT_TIMEOUT 2000 //2000ms
using namespace openni;
using namespace std;
int main()
{
Status rc = OpenNI::initialize();
if (rc != STATUS_OK)
{
cout << "Initialize failed:" << endl << OpenNI::getExtendedError() << endl;
return 1;
}
Device device;
rc = device.open(ANY_DEVICE);
if (rc != STATUS_OK)
{
cout << "Couldn't open device" << endl << OpenNI::getExtendedError() << endl;
return 2;
}
VideoStream depth;
if (device.getSensorInfo(SENSOR_DEPTH) != NULL)
{
rc = depth.create(device, SENSOR_DEPTH);
if (rc != STATUS_OK)
{
cout << "Couldn't create depth stream" << endl << OpenNI::getExtendedError() << endl;
return 3;
}
}
rc = depth.start();
if (rc != STATUS_OK)
{
cout << "Couldn't start the depth stream" << endl << OpenNI::getExtendedError() << endl;
return 4;
}
VideoFrameRef frame;
// set resolution
// depth modes
cout << "Depth modes" << endl;
const openni::SensorInfo* sinfo = device.getSensorInfo(openni::SENSOR_DEPTH); // select index=4 640x480, 30 fps, 1mm
const openni::Array< openni::VideoMode>& modesDepth = sinfo->getSupportedVideoModes();
for (int i = 0; i<modesDepth.getSize(); i++) {
printf("%i: %ix%i, %i fps, %i format\n", i, modesDepth[i].getResolutionX(), modesDepth[i].getResolutionY(),
modesDepth[i].getFps(), modesDepth[i].getPixelFormat()); //PIXEL_FORMAT_DEPTH_1_MM = 100, PIXEL_FORMAT_DEPTH_100_UM
}
rc = depth.setVideoMode(modesDepth[0]);
if (openni::STATUS_OK != rc)
{
cout << "error: depth fromat not supprted..." << endl;
}
system("pause");
while (!wasKeyboardHit())
{
int changedStreamDummy;
VideoStream* pStream = &depth;
rc = OpenNI::waitForAnyStream(&pStream, 1, &changedStreamDummy, SAMPLE_READ_WAIT_TIMEOUT);
if (rc != STATUS_OK)
{
cout << "Wait failed! (timeout is " << SAMPLE_READ_WAIT_TIMEOUT << " ms)" << endl << OpenNI::getExtendedError() << endl;
continue;
}
rc = depth.readFrame(&frame);
if (rc != STATUS_OK)
{
cout << "Read failed!" << endl << OpenNI::getExtendedError() << endl;
continue;
}
if (frame.getVideoMode().getPixelFormat() != PIXEL_FORMAT_DEPTH_1_MM && frame.getVideoMode().getPixelFormat() != PIXEL_FORMAT_DEPTH_100_UM)
{
cout << "Unexpected frame format" << endl;
continue;
}
DepthPixel* pDepth = (DepthPixel*)frame.getData();
int middleIndex = (frame.getHeight()+1)*frame.getWidth()/2;
printf("[%08llu] %8d\n", (long long)frame.getTimestamp(), pDepth[middleIndex]);
}
depth.stop();
depth.destroy();
device.close();
OpenNI::shutdown();
return 0;
}
Существует 6 режимов работы:
0: 320x240, 30 fps, 100 format
1: 320x240, 30 fps, 101 format
2: 320x240, 60 fps, 100 format
3: 320x240, 60 fps, 101 format
4: 640x480, 30 fps, 100 format
5: 640x480, 30 fps, 101 format
Он может читать только из режимов = 0-3.
В режиме 4,5 я получаю тайм-аут.
Как я могу прочитать кадр глубины в 640x480?
Спасибо за помощь,
Таль.
================================================== ==
новая информация:
Я также использую эту строку и получаю те же результаты:
const openni::SensorInfo* sinfo = &(depth.getSensorInfo());
Эта строка никогда не выполняется ни в каком режиме:
cout << "error: depth fromat not supprted..." << endl;
В режиме 4,5 я всегда выполняю эту строку:
cout << "Wait failed! (timeout is " << SAMPLE_READ_WAIT_TIMEOUT << " ms)" << endl << OpenNI::getExtendedError() << endl;
Я думаю, что это ошибка в openni2.
На openni1 я могу читать изображение глубины с разрешением 640x480 на том же компьютере, ОС и устройстве.
device.getSensorInfo(openni::SENSOR_DEPTH);
попробуйтеdepth.getSensorInfo();
и снова посмотрите данные о режимахDepth. - person Mehdi Saman Booy   schedule 23.07.2014openni::VideoMode depth_videoMode = depth.getVideoMode(); depth_videoMode.setResolution(width, height); depth_videoMode.setFps(fps); depth.setVideoMode(depth_videoMode);
и заполните ширину, высоту, fps подходящими значениями - person Mehdi Saman Booy   schedule 23.07.2014cout << "error: depth fromat not supprted..." << endl;
- person Mehdi Saman Booy   schedule 23.07.2014