opencv学习—HighGUI部分函数介绍及例子
HighGUI模块包含媒体的输入输出、视频捕捉、图像和视频的编码解码、图形界面的接口等部分。
主要的函数有:
1. imread(): 读取单张图片到OpenCV中。
2. imshow(): 在指定窗口中显示一幅图像。
3. namedWindow(): 创建一个窗口,如果只是简单地进行图片显示,可以使用imread()与imshow()即可。但需要在显示窗口之前就用到窗口名时,就要用到这个函数。
4. imwrite(): 输出图像文件。
5. createTrackbar(): 创建一个可以调整数值的滑动条,并将滑动条附加到指定的窗口上,往往会和一个回调函数配合起来使用。
例1:回调函数的使用
这里用回调函数改变一张图片的透明度。
#include<opencv2opencv.hpp> #include<opencv2highguihighgui.hpp> 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<opencv2highgui.hpp> #include<opencv2opencv.hpp> 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编程入门》实现,有兴趣的同学可以看看这本书,觉得写得不错。