OpenCV 从二进制创建浮点 Mat

标签 opencv floating-point binary byte mat

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

在 OpenCV 中有什么办法可以做到这一点吗?或者任何其他 C++ 方式?

最佳答案

#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();
}

关于OpenCV 从二进制创建浮点 Mat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24542381/

相关文章:

c# - 如何读取字节和字符串的混合文件

python - OpenCV 在 Raspberry Pi 上单击鼠标关闭窗口

python - 如何在OpenCV中检测数独网格板

c++ - 黑屏视频采集opencv

c# - 浮点精度和物理计算

java - 如何使用 return true 语句创建 boolean 方法

python - 在 Tkinter GUI 中显示 Python 脚本的输出

floating-point - HP 2114/15/16 浮点转换

python - json.loads在python中将小数点转换为 'e'

linux - 节头列表指向哪个字符串表?