1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > opencv实现将raw图像转换为bmp图像(C++)

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

时间:2023-01-06 09:47:40

相关推荐

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

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

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

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

#include <cv.h>#include <highgui.h>#include <iostream>#include<stdio.h>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图像

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。