OpenCV从二进制创建浮点数

时间:2014-07-02 22:56:24

标签: opencv floating-point binary byte mat

我有一个256字节的二进制Mat(1x256)( CV_8UC1 )。我需要创建另一个具有1x64维度的浮点数( CV_32F )。这意味着每4个字节在结果矩阵中构造一个浮点值。

在OpenCV中有没有办法做到这一点?或者任何其他C ++方式?

1 个答案:

答案 0 :(得分:4)

#include "opencv2/opencv.hpp"
using namespace cv;
#include <assert.h>

int main()
{
    Mat floatOrig = Mat::zeros(1,64,CV_32FC1);
    Mat ucharConverted = Mat::zeros(1,256,CV_8UC1);
    Mat floatConverted = Mat::zeros(1,64,CV_32FC1);

    //construct some data
    RNG rng = theRNG();
    for(int i=0;i<floatOrig.cols;++i)
    {
        floatOrig.at<float>(0,i)=rng.gaussian(1.);
    }

    //save them into uchar first
    for(int i=0;i<ucharConverted.cols;++i)
    {
        ucharConverted.at<uchar>(0,i)= floatOrig.at<uchar>(0,i);
    }

    //now convert them back into float
    //uchar b[4] = {0}; uncomment for big endian data
    for(int i=0;i<floatConverted.cols;++i)
    {
        /* uncomment for big endian ordering
        b[0]=ucharConverted.at<uchar>(0,i*4+3);
        b[1]=ucharConverted.at<uchar>(0,i*4+2);
        b[2]=ucharConverted.at<uchar>(0,i*4+1);
        b[3]=ucharConverted.at<uchar>(0,i*4+0);
        memcpy(&floatConverted.at<float>(0,i),&b, sizeof(float));
        */
        memcpy(&floatConverted.at<float>(0,i),&ucharConverted.at<uchar>(0,i*4), sizeof(float));
    }

    //verify
    for(int i=0;i<floatConverted.cols;++i)
    {
        assert(floatConverted.at<float>(0,i)-floatOrig.at<float>(0,i)==0.);
    }

    // now lets try saving that to file
    FILE* fp = fopen("c:/data/float64.bin","wb");
    for(size_t i=0;i<floatConverted.cols;++i)
    {
        fwrite( &floatConverted.at<float>(0,i),sizeof(float),1,fp);
    }
    fclose(fp);

    floatConverted=0;//we gonna try to load it back

    fp = fopen("c:/data/float64.bin","rb");
    for(size_t i=0;i<floatConverted.cols;++i)
    {
        fread(  &floatConverted.at<float>(0,i),sizeof(float),1,fp);
    }
    fclose(fp);

    //verify data read from file
    for(int i=0;i<floatConverted.cols;++i)
    {
        assert(floatConverted.at<float>(0,i)-floatOrig.at<float>(0,i)==0.);
    }
    getchar();
}