opencv实现将raw图像转换为bmp图像(C++)

在做实验室项目时,需要将打印机扫描得到的raw扫描文件转换成bmp文件,进而对bmp文件进行旋转等处理。所以写了这篇博客,参考了https://blog.csdn.net/zhenhai308/article/details/74906078,但是这篇博客里面的raw图像是14bit的,而我实验室所扫描出来的raw图像是8位深的,一个像素占一个字节,所以就参考这篇博客并改进了。

raw原始图像文件包含从数码相机、扫描器或电影胶片扫描仪的图像传感器所处理数据。之所以这样命名,是因为他们尚未被处理,未被打印或用于编辑。一般raw图像都很大。

打印机扫描得到的raw文件,一般情况下右键属性不能看到它的长和宽,甚至普通的看图软件都没法查看图像,我使用ACDsee和PS可以查看,由于程序中需要知道raw图像的长宽,就使用ps,把raw文件拖进ps看他的长宽和位深,必要的时候进行一下长宽互换

#include 

#include 

#include 

#include


using namespace std;

using namespace cv;


int createBmpFromRaw()

{

    char *rawFileName = "/nfs/QI_test/QI_TEST.raw";

    FILE *fp = NULL;

    int ret = 0;

    int width = 4962;

    int height = 7015;//这个大小就是我拖进ps里面看到的长宽


    //unsigned char pRawData[4962*2800] = { 0 };//不能使用数组来存储,数组会在栈上分配,会报段错误(segment fault)

    unsigned char* pRawData=(unsigned char*)malloc(4962*7015*sizeof(unsigned char));//改为malloc在堆上分配内存

    if (NULL == pRawData)

    {

        printf("Fail to calloc pRawData!\n");

        return -1;

    }

    fp = fopen(rawFileName, "rb");

    if (NULL == fp)

    {

        printf("Fail to read %s!\n", rawFileName);

        return -1;

    }
    ret = fread(pRawData, 4962*7015, 1, fp);//把raw数据读到malloc开辟的内存空间

    if (1 != ret)

    {

        printf("Fail to fread data!\n");

        return -1;

    }

    Mat iMat(height,width,CV_8UC1, pRawData);

    imwrite("/nfs/QI_test/QI_TEST.bmp", iMat);//这块会自动给bmp文件加上信息头,文件头那些东西,不需要自己写,这就是opencv实现raw到bmp的优点

    free(pRawData);//释放malloc开辟的内存
    close(fp);

    return 0;

}

第一次在linux下执行提示段错误(segment fault),百度了之后说是我申请的数组太大,所以在编译的时候就给我报段错误,所以我把代码里面用数组存储内存改为了用malloc分配内存。然后就成功执行了并转换为bmp文件了。

注:我这段代码只适用位深是8bit的raw图像

你可能感兴趣的:(opencv,opencv,raw图像转换为bmp图像)