How to save an image in Intel RealSense(Visual C++)

后端 未结 2 834
無奈伤痛
無奈伤痛 2021-02-13 04:27

I\'m working on Intel RealSense SDK (R2). I want to save the image from Camera_viewer. I have worked till saving the frame to specific buffers and retrieving from the same. I wa

2条回答
  •  独厮守ぢ
    2021-02-13 05:20

    To save the data I would create a Bitmap from the image data as ThorngardSO said and use the code from http://www.runicsoft.com/bmp.cpp to save it -

    #include 
    #include        // for memset
    
    bool SaveBMP ( BYTE* Buffer, int width, int height, long paddedsize, LPCTSTR bmpfile )
    {
        // declare bmp structures 
        BITMAPFILEHEADER bmfh;
        BITMAPINFOHEADER info;
    
        // andinitialize them to zero
        memset ( &bmfh, 0, sizeof (BITMAPFILEHEADER ) );
        memset ( &info, 0, sizeof (BITMAPINFOHEADER ) );
    
        // fill the fileheader with data
        bmfh.bfType = 0x4d42;       // 0x4d42 = 'BM'
        bmfh.bfReserved1 = 0;
        bmfh.bfReserved2 = 0;
        bmfh.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + paddedsize;
        bmfh.bfOffBits = 0x36;      // number of bytes to start of bitmap bits
    
        // fill the infoheader
    
        info.biSize = sizeof(BITMAPINFOHEADER);
        info.biWidth = width;
        info.biHeight = height;
        info.biPlanes = 1;          // we only have one bitplane
        info.biBitCount = 24;       // RGB mode is 24 bits
        info.biCompression = BI_RGB;    
        info.biSizeImage = 0;       // can be 0 for 24 bit images
        info.biXPelsPerMeter = 0x0ec4;     // paint and PSP use this values
        info.biYPelsPerMeter = 0x0ec4;     
        info.biClrUsed = 0;         // we are in RGB mode and have no palette
        info.biClrImportant = 0;    // all colors are important
    
        // now we open the file to write to
        HANDLE file = CreateFile ( bmpfile , GENERIC_WRITE, FILE_SHARE_READ,
             NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
        if ( file == NULL )
        {
            CloseHandle ( file );
            return false;
        }
    
        // write file header
        unsigned long bwritten;
        if ( WriteFile ( file, &bmfh, sizeof ( BITMAPFILEHEADER ), &bwritten, NULL ) == false )
        {   
            CloseHandle ( file );
            return false;
        }
        // write infoheader
        if ( WriteFile ( file, &info, sizeof ( BITMAPINFOHEADER ), &bwritten, NULL ) == false )
        {   
            CloseHandle ( file );
            return false;
        }
        // write image data
        if ( WriteFile ( file, Buffer, paddedsize, &bwritten, NULL ) == false )
        {   
            CloseHandle ( file );
            return false;
        }
    
        // and close file
        CloseHandle ( file );
    
        return true;
    }
    

    This can then be subsequently loaded using more code from the same link -

    /*******************************************************************
    BYTE* LoadBMP ( int* width, int* height, long* size 
            LPCTSTR bmpfile )
    
    The function loads a 24 bit bitmap from bmpfile, 
    stores it's width and height in the supplied variables
    and the whole size of the data (padded) in 
    and returns a buffer of the image data 
    
    On error the return value is NULL. 
    
      NOTE: make sure you [] delete the returned array at end of 
            program!!!
    *******************************************************************/
    
    BYTE* LoadBMP ( int* width, int* height, long* size, LPCTSTR bmpfile )
    {
        // declare bitmap structures
        BITMAPFILEHEADER bmpheader;
        BITMAPINFOHEADER bmpinfo;
        // value to be used in ReadFile funcs
        DWORD bytesread;
        // open file to read from
        HANDLE file = CreateFile ( bmpfile , GENERIC_READ, FILE_SHARE_READ,
             NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL );
        if ( NULL == file )
            return NULL; // coudn't open file
    
    
        // read file header
        if ( ReadFile ( file, &bmpheader, sizeof ( BITMAPFILEHEADER ), &bytesread, NULL ) == false )
        {
            CloseHandle ( file );
            return NULL;
        }
    
        //read bitmap info
    
        if ( ReadFile ( file, &bmpinfo, sizeof ( BITMAPINFOHEADER ), &bytesread, NULL ) == false )
        {
            CloseHandle ( file );
            return NULL;
        }
    
        // check if file is actually a bmp
        if ( bmpheader.bfType != 'MB' )
        {
            CloseHandle ( file );
            return NULL;
        }
    
        // get image measurements
        *width   = bmpinfo.biWidth;
        *height  = abs ( bmpinfo.biHeight );
    
        // check if bmp is uncompressed
        if ( bmpinfo.biCompression != BI_RGB )
        {
            CloseHandle ( file );
            return NULL;
        }
    
        // check if we have 24 bit bmp
        if ( bmpinfo.biBitCount != 24 )
        {
            CloseHandle ( file );
            return NULL;
        }
    
    
        // create buffer to hold the data
        *size = bmpheader.bfSize - bmpheader.bfOffBits;
        BYTE* Buffer = new BYTE[ *size ];
        // move file pointer to start of bitmap data
        SetFilePointer ( file, bmpheader.bfOffBits, NULL, FILE_BEGIN );
        // read bmp data
        if ( ReadFile ( file, Buffer, *size, &bytesread, NULL ) == false )
        {
            delete [] Buffer;
            CloseHandle ( file );
            return NULL;
        }
    
        // everything successful here: close file and return buffer
    
        CloseHandle ( file );
    
        return Buffer;
    }
    

    You can then load those bitmap files at a later date using the code from Intel https://software.intel.com/sites/landingpage/realsense/camera-sdk/v1.1/documentation/html/manuals_image_and_audio_data.html -

    // Image info
    PXCImage::ImageInfo info={};
    info.format=PXCImage::PIXEL_FORMAT_RGB32;
    info.width=image_width;
    info.height=image_height;
    
    // Create the image instance
    PXCImage image=session->CreateImage(&info);
    
    // Write data
    PXCImage::ImageData data;
    image->AcquireAccess(PXCImage::ACCESS_WRITE,&data);
    ... // copy the imported image to data.planes[0]
    image->ReleaseAccess(&data); 
    

    Using these three sets of code you should easily be able to save Bitmaps in any specified folder using WriteFile then, once loaded you can convert the bitmap back into ImageData.

    Let me know how it goes.

提交回复
热议问题