opencv保存设像头图片时调整白平衡功能
大胸弟:来都来了,不点点关注,不点点赞 ,您是不是有点太不讲武德了!
1. 用opencv预览笔记本摄像头时,不像ipc/或者工业相机一样,有可调用的白平衡接口,
相机的自动白平衡就是要通过改变RGB感光电路信号的放大比例,让受环境光影响的白色还原成纯白色,保证在各种光线条件下,成像色彩跟物体真实的色彩保持一致。
常用的一种自动白平衡算法是灰度世界法,它假设对于一副色彩丰富的图像,图像上RGB三个分量的平均值趋于同一个灰度值,一般取这个灰度值的大小为RGB三分量的平均值。
我们先来看一组图片:
1.
2.
3.
4.
以上这些图都是 R G B 三通道的白平衡值 相差很大导致,我们需要去调整均值, 以保证保存的图片看上去基本一致!
如海康工业相机 白平衡 接口如下:
nRet = pcurCam->GetEnumValue("BalanceWhiteAuto", &stEnumValue);if (MV_OK == nRet){m_BalanceWhiteAutoCombox.SetCurSel(stEnumValue.nCurValue);}if (stEnumValue.nCurValue == 0){//int red = atof(T2A(m_strRed));//int green = atof(T2A(m_strGain));//int blue = atof(T2A(m_strGain));pcurCam->SetEnumValue("BalanceRatioSelector",0);pcurCam->GetIntValue("BalanceRatio", &m_CurCamRed);m_strRed.Format(_T("%d"), m_CurCamRed.nCurValue);AddToolTip2Ctrl_Int(IDC_red_balance, m_CurCamRed.nMin, m_CurCamRed.nMax);pcurCam->SetEnumValue("BalanceRatioSelector", 1);pcurCam->GetIntValue("BalanceRatio", &m_CurCamGreen);m_strgreen.Format(_T("%d"), m_CurCamGreen.nCurValue);AddToolTip2Ctrl_Int(IDC_green_balance, m_CurCamGreen.nMin, m_CurCamGreen.nMax);pcurCam->SetEnumValue("BalanceRatioSelector", 2);pcurCam->GetIntValue("BalanceRatio", &m_CurCamBlue);m_strblue.Format(_T("%d"), m_CurCamBlue.nCurValue);AddToolTip2Ctrl_Int(IDC_blue_balance, m_CurCamBlue.nMin, m_CurCamBlue.nMax);}
那么 系统笔记本的摄像头就必须自己去实现这个功能了:
void CITCFreeTouchDlg::Take_PIc()
{string str = "take picture start!";CLogHelp::ITCLog(str);//Sleep(100);if (m_bPriview){//string strtempsavefile = GeneateImagepath(0, m_priviewid);//if (imwrite(strtempsavefile.c_str(), g_srcImage))//{// CLogHelp::ITCLog("Temp save take_picture。。。");// DeleteFile(strtempsavefile.c_str());//}m_CurrentpicSaveImage = GeneateImagepath(0, m_priviewid);EnterCriticalSection(&m_cs);Mat save_srcImage = g_srcImage.clone();LeaveCriticalSection(&m_cs);BOOL bwirte = FALSE;//EnterCriticalSection(&m_cs);//bwirte = m_CvvImage.SaveEx(m_CurrentpicSaveImage.c_str());//LeaveCriticalSection(&m_cs);if (AutoWhiteBalance > 0){vector<Mat> imageRGB;//RGB三通道分离split(save_srcImage, imageRGB);//求原始图像的RGB分量的均值double R, G, B;B = mean(imageRGB[0])[0];G = mean(imageRGB[1])[0];R = mean(imageRGB[2])[0];//需要调整的RGB分量的增益double KR, KG, KB;KB = (R + G + B) / (3 * B);KG = (R + G + B) / (3 * G);KR = (R + G + B) / (3 * R);//调整RGB三个通道各自的值imageRGB[0] = imageRGB[0] * KB;imageRGB[1] = imageRGB[1] * KG;imageRGB[2] = imageRGB[2] * KR;//RGB三通道图像合并merge(imageRGB, save_srcImage);}vector<int> compression_params;switch (SaveImageFmt){case 0:break;case 1:{compression_params.push_back(CV_IMWRITE_JPEG_QUALITY); //选择jpegcompression_params.push_back(100); //在这个填入你要的图片质量//string str = "take picture adjust jpg quality!";//CLogHelp::ITCLog(str);}break;case 2:{compression_params.push_back(CV_IMWRITE_PNG_COMPRESSION); //PNG格式图片的压缩级别 compression_params.push_back(9); //这里设置保存的图像质量级别//string str = "take picture adjust png quality!";//CLogHelp::ITCLog(str);}break;default:break;}//BOOL bwirte = FALSE;if (SaveImageFmt == 0){bwirte = imwrite(m_CurrentpicSaveImage.c_str(), save_srcImage);}else{bwirte = imwrite(m_CurrentpicSaveImage.c_str(), save_srcImage, compression_params);}if (!bwirte){string str = "take_picture fail!";int len = str.size();int snlen = len + 2;SendCMDACKMsg(str, snlen);CLogHelp::ITCLog(str);return;}else{string str = "take picture Success!";CLogHelp::ITCLog(str);}if (!m_brecvFTPupload){string str = "error not recv FTPupload url!";int len = str.size();int snlen = len + 2;SendCMDACKMsg(str, snlen);CLogHelp::ITCLog(str);return;}Sleep(10);DWORD startftptime = GetTickCount();while (true){if (!FindFtpPrecess("ftp.exe")){break;}else{DWORD endtime = GetTickCount();if ((endtime - startftptime) > 5000){break;}else{Sleep(500);}}}CreateThread(NULL, 0, FTPUploadThreadProc, this, 0, NULL);//创建新线程 CLogHelp::ITCLog("FTPUploadThreadProc start !");return;}
}
大胸弟:文章都看完了,不点点关注,不点点赞 ,您是不是有点太不讲武德了!
opencv保存设像头图片时调整白平衡功能相关推荐
- 如何将yuv420p图像数据转换为RGB数据并使用opencv保存为jpg图片
yuv420是用4个byte存储4个Y的信息,用1个Byte存储U的信息,一个Byte存储V的信息, 这4个Y共用这2个U和V ,也就是用6个Byte 存储4个像素信息,也就是一个像素需要12个Bit ...
- opencv读写和保存中文路径图片及base64与图片互转
文章目录 1.opencv读取中文路径图片 2.opencv保存中文路径图片 3.图片转base64 4.base64转图片 有几点要注意 cv2.imread(filename,flags) cv2 ...
- 运行opencv保存视频时出现错误的解决方法
运行repo代码时,用opencv保存结果视频的时候,如果出现以下问题: 一.明明有写opencv保存的代码,但是就是没保存视频 解决方法:这时候就要定位到opencv保存视频的代码里去,一般保存视频 ...
- opencv之中英文路径图片读取与保存
opencv之中英文路径图片读取与保存 关于如何用opecncv读取和写入图片网上已经有很多教程,这里只是记录一下,用的时候方便查找. 1.opencv读写英文路径图片 使用函数imread()和im ...
- opencv方框内图像保存_opencv利用矩形框选中某一区域并保存为新图片
本文实例为大家分享了Android九宫格图片展示的具体代码,供大家参考,具体内容如下 一.基本原理 Mat img= imread(image): Rect rect(50,20, 200, 50); ...
- Activiti保存.png 流程图片文件且解决idea中保存图片时显示中文乱码的解决方法
Activiti保存.png 流程图片文件且解决idea中保存图片时显示中文乱码的解决方法 Eclipse 工具中的操作 流程图片生成的两种方式: 使用 activiti-designer 设计流程图 ...
- oracle无法减小列长度,中国港湾扩展表单分配时调整字段后保存时报错,无法正常维护表单定义...
版本号: 7.0.4 业务场景(如下):中国港湾扩展表单分配时调整字段后保存时报错,无法正常维护表单定义 异常提示: 异常信息:添加业务实体的时候出错. 导致错误的应用程序或对象的名称:Generso ...
- Java使用Imageio拆分gif图片时保存的图片变为黑色
在拆分GIF图片时,遇到最后保存的图片变为黑色问题.代码如下: public static void splitGif(String filename,String path){try{GifDeco ...
- 初学OpenCV:用本地摄像头拍照并保存为灰度图片
初学OpenCV 用本地摄像头拍照并保存为灰度图片 import cv2 as cvdef openVideo():vix = cv.VideoCapture(0) #打开摄像头while True: ...
- OpenCV技巧 | 常用格式图片保存为透明背景图片(附Python源码)-教你轻松制作Logo
导读 本文主要介绍使用OpenCV将常用格式图片保存为透明背景图片的方法与实现代码. 实现目标 本文的目标有如下两个: ① 将常见格式[jpg/png/bmp]白色背景图片转换保存为透明背景图片: ② ...
最新文章
- _DataStructure_C_Impl:Dijkstra算法求最短路径
- JAVA中的枚举小结
- 硬核艿艿,新鲜出炉,直接带你弄懂 Spring Boot Jar 启动原理!
- html的左侧菜单栏,HTML 之 左侧菜单
- PicGo github配置
- 当医学影像遇见深度学习,MIDL 2020 论文征稿
- 世界你好! 个人网站搭建过程
- linux blind函数,C++拾遗--bind函数绑定
- 网络爬虫程序 *版本1.0.1* 修正几个问题
- 一个简单企业信息网站架构
- c语言程序设计 甘勇,C语言程序设计
- 无线路由器分流时用迅雷下载限速时不能每位用户支持良好的信息交换
- px upx 和rpx
- 职称计算机考试常用的命令,职称计算机考试VisualFoxPro常用命令
- 计算机有关英语单词以及谐音,英语单词中文谐音大全
- Java版90经典坦克大战下载_经典90坦克大战
- 一万块的iPhone X来了,你看好苹果的黑科技吗?
- spring深入学习(十九) IOC 之 Factory 实例化 bean
- Mac使用数据线连接安卓手机传输文件
- 安全远程办公的十大技巧
热门文章
- 男人的消费观连狗都不如
- python导入math模块_Python math模块详解
- 四川计算机专业高职高考,四川职高计算机专业分数线
- 《计算机软件著作权》申请注意事项
- 信息安全快讯丨一起为亚运健儿加油!
- win7无法连接打印机拒绝访问_打印机共享时拒绝访问
- 计算机台式硬件排名价格,2015年最新台式计算机处理器(CPU)性能排名_计算机硬件和网络_IT /计算机...
- 解决VMware虚拟机宿主机与虚拟机通讯慢
- begin tran创建事务、commit tran提交事务、rollback tran回滚(撤消)事务的用法及理解
- 外贸常用术语_外贸常用术语大全-