目录(?)[-]

  1. 简介
  2. 基本原理
    1. 产生原因
    2. 校正补偿原理
  3. 具体实现
    1. 框架搭建
    2. 功能实现
      1. 暗电流
      2. lenshading补偿
    3. 效果演示
      1. 图片处理
    4. 效果演示

简介

  在接触过的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.jpg
  darkcurrent.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.jpg
   2、依次点击控件: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.jpg
   2、依次点击控件:darkcurrent lenrolloff process。
   3、最后效果如下:

代码下载:http://download.csdn.net/detail/u011630458/8691453

opencv实现camera模组的暗电流和lenshading补偿 .的更多相关文章

  1. android camera(一):camera模组CMM介绍

    一.摄像头模组(CCM)介绍: 1.camera特写 摄像头模组,全称CameraCompact Module,以下简写为CCM,是影像捕捉至关重要的电子器件.先来张特写,各种样子的都有,不过我前一段 ...

  2. 【转】android camera(一):camera模组CMM介绍

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

  3. android camera(一):camera模组CMM介绍【转】

    转自:https://blog.csdn.net/kevinx_xu/article/details/8821818 androidcmm图像处理工作手机三星 关键词:android  camera ...

  4. Camera 模组

    http://wenku.baidu.com/view/89d8c21014791711cc7917d5.html http://wenku.baidu.com/view/0cec54d5c1c708 ...

  5. MTK 平台上查询当前使用的摄像头模组及所支持预览分辨率

    1,MTK 平台如何查询当前使用的是哪颗摄像头及相关的模组信息? 在该目录下可以查到当前平台及相关项目的配置文件 ProjectConfig.mk \ALPS.JB.MP.V1_W_20120919\ ...

  6. led模组的优点和却点

    插件模组 1.是指DIP封装的灯将灯脚穿过PCB板,经由过程焊接将锡灌满在灯孔内,由这种工艺做成的LED模组便是插灯模组:益处是视角年夜,亮度高,散热好:谬误舛错是像素密度小. 表贴模组 1.表贴也叫 ...

  7. 二维条码扫描模组在肯德基KFC的无纸化点餐解决方案

    在如今提倡节约资源的环境下,肯德基在品牌发展中,逐渐实现无纸化点餐,不仅节约了纸质点餐单,而且还具有节约资源的示范作用.而其中二维码扫描模组是这套无纸化点餐方案的重点,在整套设备中,加入二维码扫描模组 ...

  8. FreeSWITCH 增删模组

    今天在尝试FreeSWITCH新功能时,遇到一个问题,就是该功能所需要的模组没有加载,导致写了好久的代码不能看到效果,让人很是忧伤啊! 再此,将FS模组增删的方法记录下,以方便遇到同样问题的童鞋. 具 ...

  9. C# 组件模组引用第三方组件问题

    对接上一文章由于是动态加载指定程序集,会把当前目录下所有dll都加载进来.如果像sqlite这种第三组件调用了由C.C++非.net语言所以生成的Dll.因为自动生成的原因.会把非C#生成的dll都加 ...

随机推荐

  1. 从setting文件导包

    两种方式 from project.settings.py import s3_key 第二种: from django.conf import setting s3_key = settings.S ...

  2. python基础===文件对象的访问模式,以及计数循环的使用方法

    案例一: 一个几M的文本文件,需要每隔100行写到新的文件中. 代码实现如下: with open(r'f:\book.txt','rb') as f1: with open(r'f:\book2.t ...

  3. TortoiseSVN与VisualSVN Server搭建SVN版本控制系统【转】

    转自:http://www.cnblogs.com/xing901022/p/4399382.html 本片主要介绍如何搭建SVN版本控制系统,主要使用工具: 1 客户端:TortoiseSVN (小 ...

  4. 关于background

    background目前有size;  color;  image;  repeat;position;attachtment; 作用分别是一:调整背景大小. 语法:background-size:a ...

  5. 【计算机网络】http状态码

    100-199 用于指定客户端应相应的某些动作. 200-299 用于表示请求成功. 300-399 用于已经移动的文件并且常被包含在定位头信息中指定新的地址信息. 400-499 用于指出客户端的错 ...

  6. hihocoder-第六十一周 Combination Lock

    题目1 : Combination Lock 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Finally, you come to the interview roo ...

  7. Vue cmd命令操作

    1.安装node(安装到电脑中,不同项目不需重复安装) 安装nodejs(如果不是在C:则需要配环境变量)2.打开cmd C:创建一个文件夹(名字不要用node) 1.进入该文件夹 2.node -v ...

  8. ionic3 打包发布,以安卓说明

    1 添加图标 ionic cordova resources [<platform>] 官方https://ionicframework.com/docs/cli/cordova/reso ...

  9. asp.net数据类型--泛型

    asp.net有很多的数据类型,同时c#等均是强数据类型,在使用的过程,存在因数据类型不一致,在编译时通过,在使用过程中出错的情况,因此从2.0起,增加泛型这种类型.这种类型,在定义时不指定类型,而在 ...

  10. sqlmap的小试牛刀

    这次算是一次用sqlmap的例子,写的很水. 目的:通过工具扫描到了后台的数据库的地址(如下图),想通过sqlmap找到数据库的用户和密码进入到数据库(首先可以尝试一下root:root一般都是这个情 ...