Opencv学习笔记(c++)-添加跟踪条(调节对比度和亮度)

本文介绍如何使用 OpenCV 3.0 创建跟踪条来调整图像的亮度和对比度,并提供了完整的代码示例。通过实践演示了如何通过跟踪条实时调整图像属性。


本篇 文章分享学习使用opencv3.0创建跟踪条


首先感谢@浅墨_毛星云,本篇博文是小武通过学习@浅墨_毛星云的博客以及书籍《opencv3.0编程入门》整理的笔记及疑问心得,小武水平有限,欢迎交流。

@浅墨_毛星云博文:https://blog.youkuaiyun.com/poem_qianmo/article/details/21479533


函数: createTrackbar();

官网函数解析:

https://docs.opencv.org/2.4/modules/highgui/doc/user_interface.html?highlight=createtrackbar#createtrackbar

官网例程(含程序):

https://docs.opencv.org/2.4/doc/tutorials/highgui/trackbar/trackbar.html?highlight=createtrackbar


亮度对比度调节原理:

      

              g(x,y)=delta*f(x,y)+yeta

  • g表示输出图像
  • f表示原图像
  • delta控制对比度(大于0)
  • yeta控制亮度
  • x,y表示行列,确定像素点

delta越大,对比度越大,yeta越大,亮度越大。


实现代码:

//添加头文件
#include<opencv2/core/core.hpp>
#include<opencv2/highgui.hpp>
#include<opencv2/imgproc.hpp>
#include<iostream>

using namespace std;
using namespace cv;
//函数声明
void callback_tracker(int,void*);

//全局变量声明
int contrast_rat;
int bright_val;
Mat lenna_1;
Mat lenna_2;

//主函数
int main ()
{
system("color5F");  //改变控制台前景色和背景色(可要可不要)

//读取图片
lenna_1=imread("lenna.jpg");

//创建一个和原始图像同大小,同类型的图像,使用Mat类的zeros功能
lenna_2=Mat::zeros(lenna_1.size(),lenna_1.type());

//设定对比度和亮度的初值(每次开始显示跟踪条的初始值)
contrast_rat=100;
 bright_val=10;

 //创建一个窗口(因为创建跟踪条要用到) 
 namedWindow("【效果图】加跟踪条",1);

 //创建跟踪条
 createTrackbar("对比度 " , "【效果图】加跟踪条" , &contrast_rat,200,callback_tracker);
 createTrackbar("亮度", "【效果图】加跟踪条" , &bright_val,200,callback_tracker);
 
 //调用回调函数
 callback_tracker(contrast_rat,0);
 callback_tracker(bright_val,0);
 
 //等待结束(必须写,否则不能正常显示)
 	waitKey(0);
	return 0;
}

//回调函数
void callback_tracker(int,void*)
{
	//调节亮度和对比度(依次扫描每个像素)
	for(int i=0;i< lenna_2.rows; i++)
	{
	  for(int j=0;j<lenna_2.cols;j++)
	  {
	     for(int k=0;k<3;k++)
		 {
		  lenna_2.at<Vec3b>(i,j)[k]=saturate_cast<uchar>((0.01*contrast_rat*(lenna_1.at<Vec3b>(i,j)[k]))+bright_val);
		 }
	  }
	}

	//显示图像
	imshow("【原图】加跟踪条",lenna_1);
	imshow("【效果图】加跟踪条",lenna_2);
}


几点小结:

1、Mat是一个类,该类下有很多功能函数,诸如:clone, copyTo, zeros(),.....  

     该类的官网详细资料:https://docs.opencv.org/2.4/modules/core/doc/basic_structures.html?highlight=mat#mat

     中文博客详解:https://blog.youkuaiyun.com/guyuealian/article/details/70159660


2、Vec3b 表示 8U 类型的 RGB 彩色图像,是一种类型,如同int表示整型一样。

对于灰度图(单通道),给像素赋值可用:

srcImage.at<uchar>(14,25) = 25;  

对于B-G-R图(3通道),Opencv中图像三原色在内存中的排列顺序为B-G-R,给像素赋值可用(如本文):

img.at<Vec3b>(14,25) [0]= 25;//B    
img.at< Vec3b >(14,25) [1]= 25;//G    
img.at< Vec3b >(14,25 [2]= 25;//R 


3、saturate_cast为溢出保护,原理如下:

if(data<0)  
        data=0;  
else if(data>255)  
    data=255; 

可看原文:https://blog.youkuaiyun.com/mjlsuccess/article/details/12401839


效果:




版权声明:本博文原创,转载请注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值