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


    • 前言:很多时候为了验证不同平台下编解码方式不同对深度模型推理的干扰,这时需要使用加载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);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 对应地从二进制数据中解析出图像
            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);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
  • 相关阅读:
    uniapp 自定义tabbar页面不刷新
    计算机网络 | 03.[HTTP篇] HTTP缓存技术
    centos7安装mysql8.0
    ClickHouse 复制粘贴多行sql语句报错
    谷粒学苑_第八天
    C. Swap Game(简单博弈)
    【Vue3 源码解析】nextTick
    网络编程入门介绍:TCP 和 UDP
    OD华为机试 32
    ROS学习笔记07、机器人系统仿真(URDF、Xacro、Arbotix、Gazebo)
  • 原文地址:https://blog.csdn.net/wonengguwozai/article/details/127795266