0

基本上我有一个循环遍历所有 kinects 深度像素。如果它们大于 3000mm,它将像素值设置为黑色。

由于某种原因,这仅在指向墙壁时在近距离内有效。如果我将 kinect 拉回来(给它更大的扫描区域),我会收到错误的内存分配错误。我的代码可以在下面找到。我在 try catch 语句中得到错误的内存分配错误。大部分代码来自 opencv kinect 示例herehere

我发现了问题,因为深度值存储在数组而不是矩阵中,我需要一种更好的方法来找出数组中的哪个位置,从 1,1 开始的像素的 xy 指向而不是(i = x+y*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;
    }
4

1 回答 1

0

只需交换我的 x 和 y 即可解决问题

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++;
                      }
                 }
于 2013-07-10T20:05:05.470 回答