用opencv 与qt打开raw图,以及四通道输出

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zoulin11111/article/details/78259562

qt做的程序界面

opencv打开raw图

以下为部分须知

1:raw图路径获取 ,此部分为qt内容,此为相对可更改的路径,如果需要绝对路径可直接定义filepath 路径名称

QString filepath=QFileDialog::getOpenFileName();  
FILE *fp = NULL;  
QByteArray byte=filepath.toLatin1();
const char* filename=byte.data();


2:raw 10 ,16为两个byte 一个通道数值,raw 8 为1个byte 一个通道数值

raw 10,raw16 内存定义

unsigned short *pRawData = (unsigned short *)calloc(width*height, sizeof(unsigned short));  

四通道内存定义

unsigned short *R = (unsigned short *)calloc(width*height/2, sizeof(unsigned short)); 

raw 8 内存定义

unsigned char *pRawData = (unsigned char *)calloc(width*height, 1);  

四通道内存定义

unsigned char *R = (unsigned char*)calloc(width*height, 1); 


3:读取raw图

fread(pRawData,sizeof(unsigned short)*width*height,1, fp);  


4:raw图为bayer 单通道,需将其转换为四通道排布

raw图的四个通道有不同的排序方式,要想正常显示图片,需要确认sensor的rgb的排布

IplImage *pBayerData = cvCreateImage(cvSize(width,height),16 , 1);    //定义一个单通道图片
IplImage *pRgbDataInt16 = cvCreateImage(cvSize(width,height),16,3);  //定义一个三通道图片

memcpy(pBayerData->imageData, (char *)pRawData, width*height*sizeof(unsigned short));      //将raw图的信息附到但通道中

cvCvtColor(pBayerData, pRgbDataInt16, CV_BayerRG2RGB);             //单通道转换为三通道  ,需要确认sensor的rgb的排布


4:raw图显示时最后需要转换为0-255rgb范围内显示,所以raw10,raw16转换时需要除以相应倍数,否则画面不能正常显示

IplImage *pRgbDataInt8 = cvCreateImage(cvSize(width,height),8,3);   

cvConvertScale(pRgbDataInt16, pRgbDataInt8, 0.25, 0);                 //0.25为raw10与raw8的数据转换


5:图片显示部分就不讲了


6:raw图数据四个通道输出


for (y=0;y<height;y+=2)
{
for (x=0;x<width;x+=2,e++)
{
Pos1=x+width*y;
Pos2=x+width*(y+1);
//图像rgbg排序

R[e]=pRawData[Pos1];
Gr[e]=pRawData[Pos1+1];
Gb[e]=pRawData[Pos2];
B[e]=pRawData[Pos2+1];

}

}

 


展开阅读全文

没有更多推荐了,返回首页