opencv学习—HighGUI部分函数介绍及例子

HighGUI模块包含媒体的输入输出、视频捕捉、图像和视频的编码解码、图形界面的接口等部分。

主要的函数有:

1.   imread(): 读取单张图片到OpenCV中。

2.   imshow(): 在指定窗口中显示一幅图像。

3.   namedWindow(): 创建一个窗口,如果只是简单地进行图片显示,可以使用imread()与imshow()即可。但需要在显示窗口之前就用到窗口名时,就要用到这个函数。

4.   imwrite(): 输出图像文件。

5.   createTrackbar(): 创建一个可以调整数值的滑动条,并将滑动条附加到指定的窗口上,往往会和一个回调函数配合起来使用。

例1:回调函数的使用

      这里用回调函数改变一张图片的透明度。

#include
#include
using namespace cv;

#define WINDOW_NAME "线性混合实例"

const int maxValue = 100;//滑动条的最大值
int trackballValue;//滑动条的实时值
double image1Value;//第一幅图片的权重值(0-1之间)
double image2Value;//第二幅图片的权重值,其值为: 1-image1Value ,范围同样为0和1之间

Mat image1;//第一幅图片
Mat image2;//第二幅图片
Mat dst_image;//合成图片

//下边写回调函数
void on_TrackBall(int, void*) {
	
	//求出image1Value与image2Value的值
	image1Value = (double)trackballValue / maxValue;
	image2Value = 1.0 - image1Value;
	//根据两者的线性权重将两个图片混合
	addWeighted(image1, image1Value, image2, image2Value, 0.0, dst_image);
	imshow(WINDOW_NAME, dst_image);
}
//下边开始主函数的编写
int main(int argv, char** argc) {
	image1 = imread("E:\\kkk.jpg");
	image2 = imread("E:\\ddd.jpg");
	trackballValue = 70;
	if (!image1.data) {
		printf("image1有问题");
		return -1;
	}
	if (!image2.data) {
		printf("image2有问题");
		return -1;
	}
	//现在开始创建一个窗口,即宏定义中的WINDOW_NAME
	namedWindow(WINDOW_NAME, WINDOW_NORMAL);
	char TrackName[50];
	sprintf(TrackName, "透明度:%d", trackballValue);
	createTrackbar(TrackName, WINDOW_NAME, &trackballValue, maxValue, on_TrackBall);
	on_TrackBall(trackballValue, 0);
	
	waitKey();
	return 0;
}
运行效果如下:

opencv学习—HighGUI部分函数介绍及例子_第1张图片opencv学习—HighGUI部分函数介绍及例子_第2张图片

例2:鼠标响应事件实现:

#include
#include
using namespace cv;
#define WINDOW_NAME "鼠标响应事件"
//每次鼠标事件发生的时候,该函数都被调用。其中,event指的是鼠标事件,x和y代表
//鼠标指针在图像中的坐标,flag指EVENT_FLAG的组合,param是用户定义到SetMouseCallback
//函数调用的参数。
void on_MouseHandle(int event, int x, int y, int flag, void* param);
//画出一个彩色的矩形
void DrawRectangle(Mat& img, Rect box);

Rect rect;
bool drawRectangle = false;
RNG rng(12345);//传入一个64位整型参数作为随机数产生器的初值

int main(int argc, char** argv) {
	rect = Rect(-1, -1, 0, 0);
	Mat srcImg(600, 800, CV_8UC3), tempImg;
	srcImg = Scalar(0);
	namedWindow(WINDOW_NAME);
	setMouseCallback(WINDOW_NAME, on_MouseHandle, (void*)&srcImg);
	//程序主循环,当进行绘制的标识为真时,进行检测
	while (1) {
		srcImg.copyTo(tempImg);
		if (drawRectangle) {
			DrawRectangle(tempImg, rect);
						
		}
		imshow(WINDOW_NAME, tempImg);
		if (waitKey(10) == 27)
			break;
	}
	return 0;
}
void on_MouseHandle(int event, int x, int y, int flag, void* param) {
	Mat& image = *(Mat*)param;
	switch (event) {
	case EVENT_MOUSEMOVE: {
		if (drawRectangle) {
			rect.width = x - rect.x;
			rect.height = y - rect.y;
		}
		
	}
	break;

	case EVENT_LBUTTONDOWN: {
		drawRectangle = true;
		rect = Rect(x, y, 0, 0);
		
	}
	break;
	case EVENT_LBUTTONUP: {
		drawRectangle = false;
		if (rect.width < 0) {
			rect.x += rect.width;
			rect.width *= -1;
		}
		if (rect.height < 0) {
			rect.y += rect.height;
			rect.height *= -1;
		}
		DrawRectangle(image, rect);
	}
	break;

	}
}
void DrawRectangle(Mat& img, Rect box) {
	rectangle(img, box.tl(), box.br(), Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255)));
}
运行效果如下:


opencv学习—HighGUI部分函数介绍及例子_第3张图片

注:以上两个例子参考毛星云主编的《opencv3编程入门》实现,有兴趣的同学可以看看这本书,觉得写得不错。

你可能感兴趣的:(opencv学习笔记,opencv,图形)