Opencv图像识别从零到精通(12)-----滑动条控制直方图、对比度、亮度、图像相加
来源:互联网 发布:洞洞板电路设计软件 编辑:程序博客网 时间:2024/05/16 07:13
经过前面的学习,有了对比度,直方图的基础,所以就想着用这滑动条做一个综合的实例,用滑动条去控制直方图,去滑动条控制对比度和亮度,用滑动条控制融合,也是对基础的一点提高,其中还有很多值得改进的,可以动态显示结果之类的,这里就不多介绍。以后有机会再优化。
学习之前,要知道几个函数的使用方法,其他的出现的函数或者用法,请参考前面的基础例子-----------------------链接:Opencv图像识别从零到精通(1)---(11)
一、滑动条的综合示例
int createTrackbar(conststring& trackbarname, conststring& winname, int* value, int count, TrackbarCallback onChange=0,void* userdata=0);
- 第一个参数,const string&类型的trackbarname,表示轨迹条的名字,用来代表我们创建的轨迹条。
- 第二个参数,const string&类型的winname,填窗口的名字,表示这个轨迹条会依附到哪个窗口上,即对应namedWindow()创建窗口时填的某一个窗口名。
- 第三个参数,int* 类型的value,一个指向整型的指针,表示滑块的位置。并且在创建时,滑块的初始位置就是该变量当前的值。
- 第四个参数,int类型的count,表示滑块可以达到的最大位置的值。PS:滑块最小的位置的值始终为0。
- 第五个参数,TrackbarCallback类型的onChange,首先注意他有默认值0。这是一个指向回调函数的指针,每次滑块位置改变时,这个函数都会进行回调。并且这个函数的原型必须为void XXXX(int,void*);其中第一个参数是轨迹条的位置,第二个参数是用户数据(看下面的第六个参数)。如果回调是NULL指针,表示没有回调函数的调用,仅第三个参数value有变化。
- 第六个参数,void*类型的userdata,他也有默认值0。这个参数是用户传给回调函数的数据,用来处理轨迹条事件。如果使用的第三个参数value实参是全局变量的话,完全可以不去管这个userdata参数。
void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype=-1);
- 第一个参数,InputArray类型的src1,表示需要加权的第一个数组,常常填一个Mat。
- 第二个参数,alpha,表示第一个数组的权重
- 第三个参数,src2,表示第二个数组,它需要和第一个数组拥有相同的尺寸和通道数。
- 第四个参数,beta,表示第二个数组的权重值。
- 第五个参数,dst,输出的数组,它和输入的两个数组拥有相同的尺寸和通道数。
- 第六个参数,gamma,一个加到权重总和上的标量值。看下面的式子自然会理解。
- 第七个参数,dtype,输出阵列的可选深度,有默认值-1。;当两个输入数组具有相同的深度时,这个参数设置为-1(默认值),即等同于src1.depth()。
<span style="font-size:18px;"> #include <opencv2/core/core.hpp>#include <opencv2/highgui/highgui.hpp>#include "opencv2/imgproc/imgproc.hpp"#include <iostream>using namespace std;using namespace cv;#define winname "混合滚动条"Mat src;Mat src1;Mat src2;Mat src3;Mat src4;Mat dst;Mat dispImg1;int sidlervalue=10;int sidlervalue1=10;const int g_max=100;const int g_max1=100;void ontracker(int,void*){ double alpha=(double)sidlervalue/g_max;double beta=(1-alpha);addWeighted(src1,alpha,src2,beta,0.0,dst);MatND dstHist; float hranges[2] = {0, 255}; const float *ranges[1] = {hranges}; int channels = 0; calcHist(&dst, 1, &channels, Mat(), dstHist, 1, &sidlervalue, ranges); Mat dstImage(256, 256, CV_8U, Scalar(0)); double minValue = 0;double maxValue = 0;minMaxLoc(dstHist,&minValue, &maxValue, 0, 0); int hpt = saturate_cast<int>(0.9 * 256);for(int i = 0; i < sidlervalue; i++){float binValue = dstHist.at<float>(i); int realValue = saturate_cast<int>(binValue * hpt/maxValue);line(dstImage,Point(i,256-1),Point((i+1)-1,256-realValue),Scalar(255));}namedWindow(winname);imshow(winname,dst);namedWindow("一维直方图");imshow("一维直方图", dstImage);}void ontracker2(int,void*){ for(int i=0;i<src.rows;i++) { for(int j=0;j<src.cols;j++) { dst.at<uchar>(i,j)=saturate_cast<uchar>(sidlervalue1+dst.at<uchar>(i,j)); } } MatND dstHist; float hranges[2] = {0, 255}; const float *ranges[1] = {hranges}; int channels = 0; calcHist(&dst, 1, &channels, Mat(), dstHist, 1, &sidlervalue1, ranges); Mat dstImage(256, 256, CV_8U, Scalar(0)); double minValue = 0; double maxValue = 0; minMaxLoc(dstHist,&minValue, &maxValue, 0, 0); int hpt = saturate_cast<int>(0.9 * 256);for(int i = 0; i < sidlervalue1; i++){float binValue = dstHist.at<float>(i); int realValue = saturate_cast<int>(binValue * hpt/maxValue);line(dstImage,Point(i,256-1),Point((i+1)-1,256-realValue),Scalar(255));}namedWindow(winname);imshow(winname,dst);namedWindow("一维直方图");imshow("一维直方图", dstImage);}int main(){ vector<Mat> imgs(2);imgs[0] = imread("peppers.png");imgs[1] = imread("pillsetc.png");src4=imgs[1];src=imgs[0];cvtColor(src4,src3,COLOR_BGR2GRAY); cvtColor(src,src2,COLOR_BGR2GRAY);src1=src3;Mat dispImg;int x, y;x = imgs[0].cols; y = imgs[0].rows;int max;max = (x > y)? x: y;int dstsize=max;dispImg.create(Size(dstsize*(1+1)+100,dstsize), CV_8UC3);int nImg = (int)imgs.size();for(int i=0;i<nImg;i++){ int m=20+i*max; int n=20; Mat imgROI = dispImg(Rect(m, n, (int)x, (int)y)); resize(imgs[i], imgROI, Size((int)x, (int)y));} namedWindow("winName");imshow("winName", dispImg); sidlervalue=10; namedWindow(winname); char barname[50]; sprintf(barname,"融合 %d",g_max); createTrackbar(barname,winname,&sidlervalue,g_max,ontracker); ontracker(sidlervalue,0); sidlervalue1=1; createTrackbar("对比度",winname,&sidlervalue1,g_max1,ontracker2); ontracker2(sidlervalue1,0); waitKey(0); return 0;}</span>
结果如下
(1)多图显示
(2)滑动条界面
(3)实时动态显示直方图
二、Matlab辅助
对于matlab的按钮滑块,是GUI里面的内容,这个在前面我写了好几篇,有基础入门,也有图像的进阶链接如下
http://blog.csdn.net/qq_20823641/article/category/6310257
图像识别算法交流 QQ群:145076161,欢迎图像识别与图像算法,共同学习与交流
2 0
- Opencv图像识别从零到精通(12)-----滑动条控制直方图、对比度、亮度、图像相加
- Opencv图像识别从零到精通(9)----对比度亮度改变
- Opencv图像识别从零到精通(10)-----直方图均衡化与直方图拉伸
- Opencv图像识别从零到精通(8)-----灰度直方图
- Opencv图像识别从零到精通(32)----直方图对比,模版匹配,方向投影
- Opencv图像识别从零到精通(8)-----灰度直方图
- Opencv图像识别从零到精通(23)----轮廓
- Opencv图像识别从零到精通(26)---分水岭
- Opencv图像识别从零到精通(27)---grabcut
- Opencv图像识别从零到精通(28)----Kmeans
- Opencv图像识别从零到精通(34)---SIFI
- Opencv图像识别从零到精通(35)---SURF
- Opencv图像识别从零到精通(6)----访问图像像素
- Opencv图像识别从零到精通(7)----图像平移、旋转、镜像
- Opencv图像识别从零到精通(31)----图像修补,分离合并通道
- opencv——轨迹条控制图像对比度与亮度
- Opencv图像识别从零到精通(3)———单图像显示和多图像显示
- Opencv图像识别从零到精通(2)-----准备知识
- Introduction to matlab 1
- Android之Toast自定义动画
- shape 简单使用
- opencv——检测四边形的四个角点
- HTTP协议详解
- Opencv图像识别从零到精通(12)-----滑动条控制直方图、对比度、亮度、图像相加
- expandListView悬停效果
- R 数据分析
- Greenplum对新增节点扩展Segments实战
- HashCode和hashMap hashTable
- JVM启动参数的类别及使用
- C++分割字符串小结
- 大数 乘法 C语言
- 这么多开源框架,该用哪个好?