В основном у меня есть петля, которая проходит через все пиксели глубины кинов. Если они больше 3000 мм, он устанавливает значение пикселя в черный.Openni opencv kinect Плохое выделение памяти
По какой-то причине это работает только с близкого расстояния, когда он направлен к стене. Если я вытащу kinect назад (давая ему большую область для сканирования), я получаю ошибку распределения памяти. Мой код можно найти ниже. Я получаю неправильную ошибку выделения памяти внутри этой команды try catch. Большая часть кода взята из примера opencv kinect here и here.
Я понял проблему, потому что значения глубины хранятся в массиве вместо матрицы, мне нужен лучший способ узнать, какое местоположение в массиве, xy пикселей, которые начинаются с 1,1 точки чтобы вместо (г = х + у * 640)
#include <opencv.hpp>
#include <iostream>
#include <string>
#include <stdio.h>
#include <OpenNI.h>
using namespace std;
using namespace cv;
int main()
{
openni::Device device;
openni::VideoStream depth;
const char* device_uri = openni::ANY_DEVICE;
openni::Status ret = openni::OpenNI::initialize();
// Open
ret =device.open(device_uri);
ret = depth.create(device, openni::SENSOR_DEPTH);
if (ret == openni::STATUS_OK)
{
// Start Depth
depth.start();
}
// Get Depth Stream Min-Max Value
int minDepthValue = depth.getMinPixelValue();
int maxDepthValue = depth.getMaxPixelValue();
//cout << "Depth min-Max Value : " << minDepthValue << "-" << maxDepthValue << endl;
// Frame Information Reference
openni::VideoFrameRef depthFrame;
// Get Sensor Resolution Information
int dImgWidth = depth.getVideoMode().getResolutionX();
int dImgHeight = depth.getVideoMode().getResolutionY();
// Depth Image Matrix
cv::Mat dImg = cv::Mat(dImgHeight, dImgWidth, CV_8UC3);
Mat grey= cvCreateImage(cvSize(640, 480), 8, 1); ;
for(;;)
{
depth.readFrame(&depthFrame);
openni::DepthPixel* depthImgRaw = (openni::DepthPixel*)depthFrame.getData();
for (int i = 0 ; i < (depthFrame.getDataSize()/sizeof(openni::DepthPixel)) ; i++)
{
int idx = i * 3; // Grayscale
unsigned char* data = &dImg.data[idx];
int gray_scale = ((depthImgRaw[i] * 255)/(maxDepthValue - minDepthValue));
data[0] = (unsigned char)~gray_scale;
data[1] = (unsigned char)~gray_scale;
data[2] = (unsigned char)~gray_scale;
}
openni::DepthPixel* depthpixels = (openni::DepthPixel*)depthFrame.getData();
cvtColor(dImg, grey, CV_RGB2GRAY);
int i ;
try{
for(int y =0; y < 480 ; y++){
//getting in to each pixel in a row
for(int x = 0; x < 640; x++){
//getting out the corresponding pixel value from the array
i = x+y*640;
if (depthpixels[i] >3000)
{
grey.at<unsigned char>(x,y) = 0;
}
}
}
}catch(exception e)
{cout << e.what() <<endl ;
cout <<depthpixels[i] <<endl ;
cout << i <<endl ;
}
// cv:imshow("depth", dImg);
imshow("dpeth2", grey);
int k = cvWaitKey(30); // About 30fps
if (k == 0x1b)
break;
}
// Destroy Streams
depth.destroy();
// Close Device
device.close();
// Shutdown OpenNI
openni::OpenNI::shutdown();
return 0;
}