当前位置:   article > 正文

Opencv学习笔记(c++)-添加跟踪条(调节对比度和亮度)_opencv怎么设置亮度、对比度跟踪栏

opencv怎么设置亮度、对比度跟踪栏


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


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

@浅墨_毛星云博文:https://blog.csdn.net/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越大,亮度越大。


实现代码:

  1. //添加头文件
  2. #include<opencv2/core/core.hpp>
  3. #include<opencv2/highgui.hpp>
  4. #include<opencv2/imgproc.hpp>
  5. #include<iostream>
  6. using namespace std;
  7. using namespace cv;
  8. //函数声明
  9. void callback_tracker(int,void*);
  10. //全局变量声明
  11. int contrast_rat;
  12. int bright_val;
  13. Mat lenna_1;
  14. Mat lenna_2;
  15. //主函数
  16. int main ()
  17. {
  18. system("color5F"); //改变控制台前景色和背景色(可要可不要)
  19. //读取图片
  20. lenna_1=imread("lenna.jpg");
  21. //创建一个和原始图像同大小,同类型的图像,使用Mat类的zeros功能
  22. lenna_2=Mat::zeros(lenna_1.size(),lenna_1.type());
  23. //设定对比度和亮度的初值(每次开始显示跟踪条的初始值)
  24. contrast_rat=100;
  25. bright_val=10;
  26. //创建一个窗口(因为创建跟踪条要用到)
  27. namedWindow("【效果图】加跟踪条",1);
  28. //创建跟踪条
  29. createTrackbar("对比度 " , "【效果图】加跟踪条" , &contrast_rat,200,callback_tracker);
  30. createTrackbar("亮度", "【效果图】加跟踪条" , &bright_val,200,callback_tracker);
  31. //调用回调函数
  32. callback_tracker(contrast_rat,0);
  33. callback_tracker(bright_val,0);
  34. //等待结束(必须写,否则不能正常显示)
  35. waitKey(0);
  36. return 0;
  37. }
  38. //回调函数
  39. void callback_tracker(int,void*)
  40. {
  41. //调节亮度和对比度(依次扫描每个像素)
  42. for(int i=0;i< lenna_2.rows; i++)
  43. {
  44. for(int j=0;j<lenna_2.cols;j++)
  45. {
  46. for(int k=0;k<3;k++)
  47. {
  48. lenna_2.at<Vec3b>(i,j)[k]=saturate_cast<uchar>((0.01*contrast_rat*(lenna_1.at<Vec3b>(i,j)[k]))+bright_val);
  49. }
  50. }
  51. }
  52. //显示图像
  53. imshow("【原图】加跟踪条",lenna_1);
  54. imshow("【效果图】加跟踪条",lenna_2);
  55. }


几点小结:

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

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

     中文博客详解:https://blog.csdn.net/guyuealian/article/details/70159660


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

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

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

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

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


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

  1. if(data<0)
  2. data=0;
  3. else if(data>255)
  4. data=255;

可看原文:https://blog.csdn.net/mjlsuccess/article/details/12401839


效果:




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

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号