2013-07-10 3 views
0

В основном у меня есть петля, которая проходит через все пиксели глубины кинов. Если они больше 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; 
    } 

ответ

0

решил проблему просто путем замены моего х и у около

for( y =0; y < 480 ; y++) 
       { 
       //getting in to each pixel in a row 
        for(x = 0; x < 640; x++) 
        { 



         if (depthpixels[i]>1500) 
         { 
          grey.at<unsigned char >(y,x) = 0; 
         } 

         if (depthpixels[i] <500) 
         { 
          grey.at<unsigned char >(y,x) = 0; 
         } 
         i++; 
         } 
       } 
Смежные вопросы