图像保存为二进制文件及二进制文件读出图像数据

该博客介绍了一种在不同平台下验证编解码对深度模型推理影响的方法,通过将图像转换为二进制数据并在多个环境中加载。文章详细展示了如何保存和读取RGB-A图像的二进制数据,确保跨平台的一致性。
  • 前言:很多时候为了验证不同平台下编解码方式不同对深度模型推理的干扰,这时需要使用加载2进制数据的方式在不同平台上对齐数据,这是用到了图像转二进制和加载二进制数据为图像数据。下面直接上代码:
  • 图像保存二进制数据
[先在循环外定义static int save_count]
save_count++;
        std::string ssave_cnt = std::to_string(save_count);
        std::string file_name =  ssave_cnt+".bin";
        //保存rgba数据--------------------------
            FILE *fpw = fopen(file_name.c_str(), "wb");
            if ( fpw == NULL )
            {
                std::cout << "Open error!" << std::endl;
                fclose(fpw);
                return;
            }
            if ( !img_rgba.data || img_rgba.channels() != 4 )
            {
                std::cout << "Image read failed or image channels isn‘t equal to 3."
                << std::endl;
                return;
            }
            
            int labelw = 1;
            int rows = img_rgba.rows;
            int cols = img_rgba.cols;
            
            fwrite( &labelw, sizeof(char), 1, fpw );
            
            char* dp = (char*)img_rgba.data;
            for ( int i=0; i<rows*cols; i++ )
            {
                fwrite( &dp[i*4],   sizeof(char), 1, fpw );
                fwrite( &dp[i*4+1], sizeof(char), 1, fpw );
                fwrite( &dp[i*4+2], sizeof(char), 1, fpw );
                fwrite( &dp[i*4+3], sizeof(char), 1, fpw );
            }
            fclose(fpw);
  • 对应地从二进制数据中解析出图像
        save_count++;
        std::string ssave_cnt = std::to_string(save_count);
        std::string file_name =  "/Users/gd-npc-701/Desktop/bin_files/"+ssave_cnt+".bin";
        
        
        int rows = 1920;
        int cols = 1080;
        FILE *fpr = fopen( file_name.c_str(), "rb" );
        if ( fpr == NULL )
        {
            std::cout << "Open error!" << std::endl;
            fclose(fpr);
            return;
        }
        
        int labelr(0);
        fread( &labelr, sizeof(char), 1, fpr );
        
        std::cout << "label: " << labelr << std::endl;
        
        cv::Mat img_rgba_from_bin( rows, cols, CV_8UC4, cv::Scalar::all(0) );
        
        unsigned char* pData = (unsigned char*)img_rgba_from_bin.data;
        for ( int i=0; i<rows*cols; i++ )
        {
            fread( &pData[i*4],   sizeof(char), 1, fpr );
            fread( &pData[i*4+1], sizeof(char), 1, fpr );
            fread( &pData[i*4+2], sizeof(char), 1, fpr );
            fread( &pData[i*4+3], sizeof(char), 1, fpr );

        }
        fclose(fpr);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值