简介

  在接触过的qcom和mtk平台中,camera调试软件和流程基本都是大同小异。所以查了点资料,然后模仿这些软件,自己练习写了下最开始的
两步:暗电流和len shading补偿。

基本原理

产生原因

  在camera模组中,会因为sensor本身的暗电流,从而对图像参数噪声。同时也会因为模组镜头的原因,导致拍摄照片的亮度,中间亮而四周相对较暗。
所以在模组工作中,我们需要对模组做暗电流的校正和len shading相关的补偿。对这方面深入的了解,请自己查询相关资料吧,这里只简单讲解下。

校正补偿原理

  理解到了暗电流和len shading产生原因之后,就可以通过如下步骤开始进行校正。暗电流校正:1、用黑胶布遮住摄像头,然后在全黑环境下拍摄一张全尺寸的照片。2、软件读取并保存住这张图片的值,这里面非0的值,都是由sensor的暗电流产生的噪点,当对照片处理的时候,需要减去这些对应的噪声。lenshading补偿:1、用毛玻璃盖住模组,在灯箱下拍摄一张照片。正常情况下,可以看到照片是中心亮,而四周相对较暗。2、将拍摄的照片通过处理,找出照片中最亮位置的亮度,然后用这个亮度为基准,记录下整个图片中,每个像素位置亮度和这个亮度的比值。当对照片处理的时候,对应像素位置乘以这个比值。

具体实现

框架搭建

  根据前面一篇提到的《opencv模拟button》,构建出了基本软件背景界面和三个操作按键。分别对应为暗电流、len shading补偿、图片处理。
效果如下:
  软件的运行如下:./XXX darkcurrent.jpg lenshading.jpg tmp.jpgdarkcurrent.jpg:拍摄的暗电流照片。lenshading.jpg:拍摄的len shading照片。tmp.jpg:需要被处理的照片。

功能实现

  所以我们需要关心的就是那三个控件对应的事件处理功能。
void on_button(int buttonNow, Mat img){if(buttonNow == 0){doDarkCurrent(img);}else if(buttonNow == 1){lenrollOff(img);}else if(buttonNow == 2){pic_process(img);}buttonFlag[buttonNow] = true;
}

暗电流

void doDarkCurrent(Mat mat){                                                                                                         IplImage pI = mat;IplImage pI_2 = img3;int width = mat.rows;int height = mat.cols;CvScalar s;int i, j;double b_count = 0, g_count = 0, r_count = 0;for(i=0; i<height; i++){for(j=0; j<width; j++){s = cvGet2D(&pI, j, i);cvSet2D(&pI_2, j, i, s);}}
}
  实现很简单,就是将darkcurrent.jpg的照片数据保存到img3中,作为暗电流操作的操作数据。

lenshading补偿

void lenrollOff(Mat img){                                                                                                            int *address;double maxLight;address = (int *)malloc(2);IplImage pI = img;getMaxLight(img, address, &maxLight); /* 找到图像中最亮的点位置,address为最亮点所在的坐标 */lenShading(maxLight, img, img4);
}
  img对应为传入的lenshading.jpg。首先通过函数getMaxLight,建立一个8X8的矩阵,然后该图片中从头到尾计算出矩阵包围的图片区域亮度,
并找出最高的位置和对应平均亮度。接着使用函数lenShading,计算出图片所有像素和上一步得到的最大亮度之间比值,对应的保存在img4中。

效果演示

  使用步骤:1、运行软件:./xxx ./res/dark.jpg ./res/lenoff.jpg ./res/1.jpg2、依次点击控件:darkcurrent lenrolloff process。3、最后效果如下:

图片处理

  在第一步和第二步处理完了之后,接着就可以进行第三步的图片处理。
void pic_process(Mat img){imshow("poc_process", img);/*process for DarkCurrent*/proDark(img);/*process for lenrollOff*/prolenOff(img);imshow("prolenOff", img);
}
  这一步中,首先显示出来,需要被处理的照片,也就是之前传入的tmp.jpg。接着使用proDark来减去暗电流产生的噪点。接着使用函数prolenOff进行
图片lenshading的补偿,最后将处理后的图片也显示出来。
void proDark(Mat img){int width = img.rows;int height = img.cols;IplImage pI = img;int i, j;CvScalar s, s1;IplImage pI_2 = img3;int start_Haddr = img3.cols / 2 - height / 2;int end_Haddr = img3.cols / 2 + height / 2;int start_Waddr = img3.rows / 2 - width / 2;int end_Waddr = img3.rows / 2 + width / 2;if((width > img3.rows) || (height > img3.cols)){printf("proDark is error!!!!!!\n");return;}for(i=start_Haddr; i < end_Haddr; i++){for(j = start_Waddr; j < end_Waddr; j++){s = cvGet2D(&pI_2, j, i);s1 = cvGet2D(&pI, j - start_Waddr, i - start_Haddr);s1.val[0] = s1.val[0] - s.val[0];s1.val[1] = s1.val[1] - s.val[1];s1.val[2] = s1.val[2] - s.val[2];cvSet2D(&pI, j - start_Waddr, i - start_Haddr, s1);}   }
}
  在传入的处理图片中,如果是被sensor裁剪过的话,那就从暗电流保存数据的中心开始,计算出和处理照片同样大小的数据,然后处理照片再依次
减去对应的暗电流噪声数据。
void prolenOff(Mat img){int width = img.rows;int height = img.cols;IplImage pI = img;IplImage pI_2 = img4;int i, j;CvScalar s, s1;cvCvtColor(&pI, &pI, CV_RGB2YCrCb);if((width > img4.rows) || (height > img4.cols)){printf("prolenOff is error!!!!!!\n");return;}int start_Haddr = img4.cols / 2 - height / 2;int end_Haddr = img4.cols / 2 + height / 2;int start_Waddr = img4.rows / 2 - width / 2;int end_Waddr = img4.rows / 2 + width / 2;for(i=start_Haddr; i < end_Haddr; i++){for(j = start_Waddr; j < end_Waddr; j++){s = cvGet2D(&pI_2, j, i);s1 = cvGet2D(&pI, j - start_Waddr, i - start_Haddr);s1.val[0] = s1.val[0] * s.val[0] / 50;cvSet2D(&pI, j - start_Waddr, i - start_Haddr, s1);}   }cvCvtColor(&pI_2, &pI_2, CV_YCrCb2RGB);cvCvtColor(&pI, &pI, CV_YCrCb2RGB);
}
  len shading补偿也是一样,根据处理图片大小,从补偿数据的中心开始,取出相应大小的数据,然后将图片对应转化为YCrCb,根据补偿值从新调整
权重,接着将图像转换会RGB图像。

效果演示

  使用步骤:1、运行软件:./xxx ./res/dark.jpg ./res/lenoff.jpg ./res/1.jpg2、依次点击控件:darkcurrent lenrolloff process。3、最后效果如下:
代码下载:http://download.csdn.net/detail/u011630458/8691453

opencv实现camera模组的暗电流和lenshading补偿相关推荐

  1. Camera模组详解

    一 Camera模组 大家都知道,手机背面的那个小小的孔,就叫摄像头.这个小孔幽幽的泛着光泽,深邃又迷人,如同一个含苞待放的小萝莉一样,这个小萝莉还是个傲娇娘,像零之使魔的614一样惹人怜爱,而且在小 ...

  2. 手机摄像头的心得体会---camera模组生产流程

    首先开始做一款手机,要提前做好一个时间表,这个时间表从讨论做什么样的手机一直到最后的手机量产.一般过程PE-----PDR----PCL----PEL-----POR-----EVT-----DVT- ...

  3. Android Camera(一):camera模组CMM介绍

    关键词:android camera CMM 模组 camera参数 平台信息: 内核:linux 系统:android 平台:S5PV310(samsung exynos 4210) 新项目开案,代 ...

  4. camera模组 ------- super Good

    come from :https://blog.csdn.net/xubin341719/article/details/7723725 关键词:android  camera CMM 模组 came ...

  5. S5PV210开发板 camera模组CMM介绍

    关键词:android camera CMM 模组 camera参数 平台信息: 内核:linux 系统:android 平台:S5PV310(samsung exynos 4210) 作者:xubi ...

  6. Android开发之十四: camera(一):camera模组CMM介绍

    https://blog.csdn.net/gabbzang/article/details/9457459 android camera(一):camera模组CMM介绍 android camer ...

  7. camera基础知识——1、camera模组简介

    1. 前言 博主作为一个camera驱动码农,在刚接触camera知识的时候难免有点转变不过来,难以接受,博主也深有体会.看着厚厚的camera datasheet,不知道如何下手编写驱动代码.但是在 ...

  8. 手机摄像头的心得体会---camera模组的结构和选择

    今天我们可以来聊一聊关于camera的结构. 一个手机,我们从app中打开camera,然后就看到camera的拍摄的景色,然后按下开关就会形成一个静态的照片,那么这张照片是怎样形成的呢?他的整个过程 ...

  9. 如何在软件中实现多camera模组的兼容

    1. 简介 2. 详细流程  1)kernel  2)vendor 3. 思路总结 1)本文思路 2)另一种简单方法 4. 后续改进 1. 简介 Multi module 指的是同样的sensor,但 ...

最新文章

  1. SecureRandom
  2. 树莓派连接显示器不亮屏的解决方案
  3. 解决navicate 连接mysql数据库中文乱码的问题
  4. xshell突然连接不上虚拟机解决办法
  5. Notepad++ 搜索功能学习总结
  6. java线程安全总结
  7. Leetcode算法题(C语言)1
  8. oracle的临时表和With As总结
  9. SAP IDES各Client用途和用户名密码
  10. MySQL(14)--- WHERE 子句
  11. 吴恩达机器学习 逻辑回归 作业2(芯片预测) Python实现 代码详细解释
  12. Random()种子数
  13. linux shell中的case语句用法 以及 case default设置
  14. Win10电脑如何设置环境变量
  15. 良心推荐效率办公!清描:精准稳定的文字识别软件
  16. 2021电赛F题智能送药小车程序代码
  17. 如何将手机里的PDF转换成Word?
  18. 使用人性化的 Linux 防火墙 CFW 阻止 DDOS 攻击
  19. word里面如何插入柱形图
  20. 【洛谷 P7299】 【并查集】 Dance Mooves S

热门文章

  1. MWC 2019新品汇总:5G+折叠屏开启的新时代?
  2. 经验分布函数 与 bootstrap 方法
  3. flat方法的简单实现
  4. 存款利率计算器v3.0
  5. 【调剂】南京信息工程大学2023年中外合作计算机,电子信息都招!
  6. SQL Server2000安装过程中出现“挂起”操作的解决方法
  7. CTSC 2018 酱油记
  8. SW2016提示cosworks.dll无法装入。
  9. 被数学社吊打祭——收集的干货
  10. [转]适应多种智能电表通信规约的无线抄表解决方案