使用OpenCV打开RAW文件

首先来介绍一下关于相机的基础知识:

1.CCD/CMOS相机的感光元件对波长(即颜色)不敏感,如果拿一个裸体的CCD/CMOS传感器去拍摄图像,只能得到灰度图;

2.因为上述这条,人们必须找到能够将波长区分开的方法,其中一种是使用三个滤光片(通常是RGB三色),在这三个滤光片之后放置三个CCD,这就是3CCD相机;

0.jpg 3.显然上一种方法的成本太高了,聪明的人类又想到了另一个方法:那就是在CCD/CMOS传感器矩阵之前放置一个滤色片矩阵,每个像素对应一个滤色片,将RGB三种颜色的滤色片均匀分布在这个矩阵中,拍摄到图像后将对应颜色的像素的值取出来并进行插值,就得到了三个通道的数据。
1.jpg RAW文件存储的就是第三种方法拍摄的原始数据,可以使用photoshop打开,放大后能够很明显的观察到类似棋盘格一样的像素值。虽然没有白平衡设置,但最大的好处是真实的数据也没有被改变,基于这些数据操作者可以设置自己的通道权值,能够任意的调整色温和白平衡。
2.jpg
 

3.png

4.png 将图像放大:
5.png
局部放大
 

继续放大:
6.png
在一个项目中我用到了12bit的工业相机,通过调用该相机SDK中的函数可以将拍摄的图像数据保存为16bit单通道的raw文件,其中前12bit有效,末尾4bit是0。

下面来介绍如何用OpenCV打开raw文件。思路如下:
1.以二进制方式打开文件;
2.将每个像素对应的16bit的数据分成两个8bit,分别放入两个矩阵中;
3.对这两个矩阵进行色彩空间变换,转换为两个8bit三通道的图像;
4.将这两个图像合成为一个16bit三通道的图像。

废话少说,代码如下:

   
   
  1. void CMy20120510readrawfileDlg::OnBnClickedButton2()
  2. {
  3. const int WIDTH = 1360;
  4. const int HEIGHT = 1024;
  5. CFile file;
  6. file.Open(_T( "aaa.raw"), CFile::modeRead | CFile::typeBinary);
  7. file.SeekToBegin();
  8. BYTE * pfilebuf = new BYTE[HEIGHT*WIDTH* 2];
  9. if (HEIGHT*WIDTH* 2 != file.Read(pfilebuf, HEIGHT*WIDTH* 2))
  10. {
  11. //提示文件读取错误
  12. file.Close();
  13. return;
  14. }
  15. file.Close();
  16. //
  17. CvMat* mat_a = cvCreateMat( 1, HEIGHT*WIDTH, CV_8U); //单行矩阵便于赋值操作
  18. CvMat* mat_b = cvCreateMat( 1, HEIGHT*WIDTH, CV_8U); //同上
  19. int i= 0;
  20. do {
  21. CV_MAT_ELEM(*mat_a, unsigned char, 0, i) = pfilebuf[i* 2]; //低8位信息
  22. CV_MAT_ELEM(*mat_b, unsigned char, 0, i) = pfilebuf[i* 2+ 1]; //高8位信息
  23. i++;
  24. } while(i<HEIGHT*WIDTH);
  25. delete[] pfilebuf;
  26. cvReshape(mat_a, mat_a, 0, HEIGHT); //把单行矩阵整形为二维矩阵
  27. cvReshape(mat_b, mat_b, 0, HEIGHT);
  28. IplImage* img_a = cvCreateImage(cvSize(WIDTH,HEIGHT), IPL_DEPTH_8U, 3);
  29. IplImage* img_b = cvCreateImage(cvSize(WIDTH,HEIGHT), IPL_DEPTH_8U, 3);
  30. cvCvtColor(mat_a, img_a, CV_BayerBG2RGB); //色彩空间转换,即Bayer模式转为RGB
  31. cvCvtColor(mat_b, img_b, CV_BayerBG2RGB);
  32. cvReleaseMat(&mat_a);
  33. cvReleaseMat(&mat_b);
  34. cvNamedWindow( "img_a");
  35. cvNamedWindow( "img_b");
  36. cvShowImage( "img_a", img_a);
  37. cvShowImage( "img_b", img_b);
  38. //
  39. //因为cvAddWeighted需要参数矩阵都具有相同类型、相同大小
  40. IplImage* img_a_16 = cvCreateImage(cvSize(WIDTH,HEIGHT), IPL_DEPTH_16U, 3);
  41. IplImage* img_b_16 = cvCreateImage(cvSize(WIDTH,HEIGHT), IPL_DEPTH_16U, 3);
  42. cvConvert(img_a, img_a_16);
  43. cvConvert(img_b, img_b_16);
  44. IplImage* img = cvCreateImage(cvSize(WIDTH,HEIGHT), IPL_DEPTH_16U, 3);
  45. //高8位左移8位加上低8位合成一个16位图像
  46. cvAddWeighted(img_a_16, 1, img_b_16, 256, 0, img);
  47. cvNamedWindow( "img");
  48. cvShowImage( "img", img);
  49. cvWaitKey();
  50. cvDestroyAllWindows();
  51. cvReleaseImage(&img_a);
  52. cvReleaseImage(&img_b);
  53. cvReleaseImage(&img);
  54. }

得到的图像如下:
7.png

可以看出img_a的结果是原16bit图像的低8位,直接显示的话是没什么意义的。
最后合成的16bit肉眼几乎观察不出有什么区别,但是对OpenCV来说已经是可以直接处理的16bit图像数据了!

接下来,要怎么处理就可以自由发挥啦。

顺便给出OpenCV帮助文档里cvCvtColor对Bayer模式转换的说明,请认真阅读哦:

8.png

 

 
http://www.opencv.org.cn/forum/viewtopic.php?f=1&t=18681&p=60197&hilit=%E5%8D%95%E5%BA%94%E7%9F%A9%E9%98%B5#p60197
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
对于计算机专业的学生而言,参加各类比赛能够带来多方面的益处,具体包括但不限于以下几点: 技能提升: 参与比赛促使学生深入学习和掌握计算机领域的专业知识与技能,如编程语言、算法设计、软件工程、网络安全等。 比赛通常涉及实际问题的解决,有助于将理论知识应用于实践中,增强问题解决能力。 实践经验: 大多数比赛都要求参赛者设计并实现解决方案,这提供了宝贵的动手操作机会,有助于积累项目经验。 实践经验对于计算机专业的学生尤为重要,因为雇主往往更青睐有实际项目背景的候选人。 团队合作: 许多比赛鼓励团队协作,这有助于培养学生的团队精神、沟通技巧和领导能力。 团队合作还能促进学生之间的知识共享和思维碰撞,有助于形成更全面的解决方案。 职业发展: 获奖经历可以显著增强简历的吸引力,为求职或继续深造提供有力支持。 某些比赛可能直接与企业合作,提供实习、工作机会或奖学金,为学生的职业生涯打开更多门路。 网络拓展: 比赛是结识同行业人才的好机会,可以帮助学生建立行业联系,这对于未来的职业发展非常重要。 奖金与荣誉: 许多比赛提供奖金或奖品,这不仅能给予学生经济上的奖励,还能增强其成就感和自信心。 荣誉证书或奖状可以证明学生的成就,对个人品牌建设有积极作用。 创新与研究: 参加比赛可以激发学生的创新思维,推动科研项目的开展,有时甚至能促成学术论文的发表。 个人成长: 在准备和参加比赛的过程中,学生将面临压力与挑战,这有助于培养良好的心理素质和抗压能力。 自我挑战和克服困难的经历对个人成长有着深远的影响。 综上所述,参加计算机领域的比赛对于学生来说是一个全面发展的平台,不仅可以提升专业技能,还能增强团队协作、沟通、解决问题的能力,并为未来的职业生涯奠定坚实的基础。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值