opencv实现camera模组的暗电流和lenshading补偿 .
简介
在接触过的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补偿 .的更多相关文章
- android camera(一):camera模组CMM介绍
一.摄像头模组(CCM)介绍: 1.camera特写 摄像头模组,全称CameraCompact Module,以下简写为CCM,是影像捕捉至关重要的电子器件.先来张特写,各种样子的都有,不过我前一段 ...
- 【转】android camera(一):camera模组CMM介绍
关键词:android camera CMM 模组 camera参数平台信息:内核:linux系统:android 平台:S5PV310(samsung exynos 4210) 作者:xubin ...
- android camera(一):camera模组CMM介绍【转】
转自:https://blog.csdn.net/kevinx_xu/article/details/8821818 androidcmm图像处理工作手机三星 关键词:android camera ...
- Camera 模组
http://wenku.baidu.com/view/89d8c21014791711cc7917d5.html http://wenku.baidu.com/view/0cec54d5c1c708 ...
- MTK 平台上查询当前使用的摄像头模组及所支持预览分辨率
1,MTK 平台如何查询当前使用的是哪颗摄像头及相关的模组信息? 在该目录下可以查到当前平台及相关项目的配置文件 ProjectConfig.mk \ALPS.JB.MP.V1_W_20120919\ ...
- led模组的优点和却点
插件模组 1.是指DIP封装的灯将灯脚穿过PCB板,经由过程焊接将锡灌满在灯孔内,由这种工艺做成的LED模组便是插灯模组:益处是视角年夜,亮度高,散热好:谬误舛错是像素密度小. 表贴模组 1.表贴也叫 ...
- 二维条码扫描模组在肯德基KFC的无纸化点餐解决方案
在如今提倡节约资源的环境下,肯德基在品牌发展中,逐渐实现无纸化点餐,不仅节约了纸质点餐单,而且还具有节约资源的示范作用.而其中二维码扫描模组是这套无纸化点餐方案的重点,在整套设备中,加入二维码扫描模组 ...
- FreeSWITCH 增删模组
今天在尝试FreeSWITCH新功能时,遇到一个问题,就是该功能所需要的模组没有加载,导致写了好久的代码不能看到效果,让人很是忧伤啊! 再此,将FS模组增删的方法记录下,以方便遇到同样问题的童鞋. 具 ...
- C# 组件模组引用第三方组件问题
对接上一文章由于是动态加载指定程序集,会把当前目录下所有dll都加载进来.如果像sqlite这种第三组件调用了由C.C++非.net语言所以生成的Dll.因为自动生成的原因.会把非C#生成的dll都加 ...
随机推荐
- 逐步实现python版wc命令
Python 如何处理管道输入输出 sys.stdin 等于打开了一个文件对象,所有输入的文件都会写入到标准输入文件中(键盘) sys.stdout 等于打来了一个文件对象,使用.write()把信息 ...
- UVA 10183 How Many Fibs?
高精度推出大概600项fabi数,就包含了题目的数据范围,对于每组a,b,从1到600枚举res[i]即可 可以直接JAVA大数.我自己时套了C++高精度的版 JAVA 复制别人的 import ja ...
- (十四)git操作
https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
- 【bzoj1042】硬币购物
容斥 #include<bits/stdc++.h> #define N 100005 typedef long long ll; using namespace std; ll ans, ...
- 对象存储 - Swift 原理 及 Swift+keystone+dashboard 架构搭建
1. 原理介绍 Swift 架构.原理及功能: http://www.cnblogs.com/sammyliu/p/4955241.html 总结的很详细也很全面,受益匪浅,感谢分享. 2. keys ...
- Jquery实现全选和取消全选的方法
<input type="checkbox" id="all" />全选<br /> <input type="chec ...
- Linux下Tomcat安装配置
买了台阿里云服务器,因为配置比较低,所以用Linux系统,这里记录一下我在Linux系统中Tomcat的安装配置. 前提JDK已经安装好. 安装 首先在/usr/local/下建立一个tomcat的文 ...
- 2017中国大学生程序设计竞赛 - 女生专场B【DP】
B HDU - 6024 [题意]:n个教室,选一些教室建造糖果商店. 每个教室,有一个坐标xi和在这个教室建造糖果商店的花费ci. 对于每一个教室,如果这个教室建造糖果商店,花费就是ci,否则就是与 ...
- 整数快速乘法/快速幂+矩阵快速幂+Strassen算法
快速幂算法可以说是ACM一类竞赛中必不可少,并且也是非常基础的一类算法,鉴于我一直学的比较零散,所以今天用这个帖子总结一下 快速乘法通常有两类应用:一.整数的运算,计算(a*b) mod c 二.矩 ...
- floyed算法的一些感想
for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=k;j++) if(f[i][k]+f[k][j]<f[i ...