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;
}
运行效果如下:
例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)));
}
运行效果如下:
注:以上两个例子参考毛星云主编的《opencv3编程入门》实现,有兴趣的同学可以看看这本书,觉得写得不错。