在以前的教程中 (例如 linear blending 和 brightness and contrast adjustments)你有可能注意到需要 input 一些数值到我们的程序中, 例如 和
。我们会在代码中输入这些数据来配合程序的运行。
好, 下面来介绍所要用到的一个 GUI 中的工具. OpenCV 提供的 GUI 库在(highgui.h)里. 这是一个 滑动条 的样子
在这里教程指导我们修改以前的方案,以便从滑动条中获得那些需要输入数据.
首先来修改一下教程中 使用OpenCV对两幅图像求和(求混合(blending)) 这个例子. 用滑动条来动态输入 这个值.
#include <cv.h>
#include <highgui.h>
using namespace cv;
/// 全局变量的声明与初始化
const int alpha_slider_max = 100;
int alpha_slider;
double alpha;
double beta;
/// 声明存储图像的变量
Mat src1;
Mat src2;
Mat dst;
/**
* @function on_trackbar
* @定义响应滑动条的回调函数
*/
void on_trackbar( int, void* )
{
alpha = (double) alpha_slider/alpha_slider_max ;
beta = ( 1.0 - alpha );
addWeighted( src1, alpha, src2, beta, 0.0, dst);
imshow( "Linear Blend", dst );
}
int main( int argc, char** argv )
{
/// 加载图像 (两图像的大小与类型要相同)
src1 = imread("../../images/LinuxLogo.jpg");
src2 = imread("../../images/WindowsLogo.jpg");
if( !src1.data ) { printf("Error loading src1 \n"); return -1; }
if( !src2.data ) { printf("Error loading src2 \n"); return -1; }
/// 初始化为零
alpha_slider = 0;
/// 创建窗体
namedWindow("Linear Blend", 1);
/// 在创建的窗体中创建一个滑动条控件
char TrackbarName[50];
sprintf( TrackbarName, "Alpha x %d", alpha_slider_max );
createTrackbar( TrackbarName, "Linear Blend", &alpha_slider, alpha_slider_max, on_trackbar );
/// 结果在回调函数中显示
on_trackbar( alpha_slider, 0 );
/// 按任意键退出
waitKey(0);
return 0;
}
我们只分析关于滑动条的那段代码:
#.首先, 我们加载了两个图像, 目的是把它们混合显示.
src1 = imread("../../images/LinuxLogo.jpg"); src2 = imread("../../images/WindowsLogo.jpg");
#.在创建滑动条之前, 我们要先创建一个窗体,以便把创建的滑动条放置在上面:
namedWindow("Linear Blend", 1);
现在可以创建滑动条了:
createTrackbar( TrackbarName, "Linear Blend", &alpha_slider, alpha_slider_max, on_trackbar );
记住下面的参数介绍:
最后, 我们还要定义这个回调函数 on_trackbar 来实现我们想要的结果
void on_trackbar( int, void* )
{
alpha = (double) alpha_slider/alpha_slider_max ;
beta = ( 1.0 - alpha );
addWeighted( src1, alpha, src2, beta, 0.0, dst);
imshow( "Linear Blend", dst );
}
注意回调函数中的整型与双精度型的转换:
下图是程序的运行结果:
也可以使用其它方式验证, 你可以用 改变图像的对比度和亮度 中的例程实现两个滑动条. 一个控制 另一个控制
. 可能的输出会是下面的样子:
SENWELL@ OpenCV中文网站 <yinwoxing@163.com>