本篇 文章分享学习使用opencv3.0创建跟踪条
首先感谢@浅墨_毛星云,本篇博文是小武通过学习@浅墨_毛星云的博客以及书籍《opencv3.0编程入门》整理的笔记及疑问心得,小武水平有限,欢迎交流。
@浅墨_毛星云博文:https://blog.youkuaiyun.com/poem_qianmo/article/details/21479533
函数: 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
效果:
版权声明:本博文原创,转载请注明出处。