[OpenCV]在显示窗口中截图

[OpenCV]在显示窗口中截图简介

介绍使用OpenCV实现简单的截图功能。首先阐述实现此功能的基本步骤,然后给出实现代码,最后贴出实验结果以及遇到的问题。

基本步骤

我们需要知道OpenCV使用字符串来唯一标记显示图像的窗口,也就是说与窗口相关的工作都与一个字符串有关。 我们在已经显示的图像上截取一个子图,并且显示这个子图。

具体操作步骤如下:

程序的基本步骤如下:

本功能的回调函数需要处理鼠标的三个事件:

为了展示截屏过程的效果,在鼠标移动过程中,加入一个绘制矩形框功能。为了避免在没按下鼠标左键的条件下绘制矩形框,需要引入一个控制变量,来标记鼠标左键是否已经按下。

程序代码

代码如下:

cv;;// global variablestatic Mat g_img_src;static Mat g_img_dst;static Mat g_img_sub;static bool g_is_rect_inited = false;static Point g_rect_tl;static string g_window_name = “image”;static void onMouse( int event, int x, int y, int, void* ){if(CV_EVENT_LBUTTONDOWN == event){g_is_rect_inited = true;g_rect_tl = Point(x, y);}else if (CV_EVENT_MOUSEMOVE == event && g_is_rect_inited){g_img_src.copyTo(g_img_dst);rectangle(g_img_dst, g_rect_tl, Point(x,y), Scalar_<uchar>::all(200), 3, 8);imshow(g_window_name, g_img_dst);}else if (CV_EVENT_LBUTTONUP == event && g_rect_tl != Point(x,y)){g_img_src(Rect(g_rect_tl, Point(x,y))).copyTo(g_img_sub);imshow(“sub image”, g_img_sub);g_is_rect_inited = false;}}int main(int argc, char** argv){string filename = argc >= 2 ? argv[1] : “fruits.jpg”;g_img_src = imread(filename, CV_LOAD_IMAGE_GRAYSCALE);if (g_img_src.empty()){cerr << “[ERROR] : please check your image file name.” << endl;return EXIT_FAILURE;}namedWindow(g_window_name, CV_WINDOW_KEEPRATIO);setMouseCallback(g_window_name, onMouse, 0);while(true){imshow(g_window_name, g_img_src);int c = waitKey(0);if( (c & 255) == 27 ){ // EscdestroyAllWindows();cout << “Exiting …\n”;break;}}return EXIT_SUCCESS;}实验结果

实验结果如下图所示:

总结

本文中实现的程序有些情况下单击鼠标左键,不能够捕获鼠标左键的抬起时间,单击被认为是左键按下的事件,所以单击之后,,白框就一直跟着鼠标走。这一点有待改进。

有些人注定是等待别人的,有些人是注定被人等的。

[OpenCV]在显示窗口中截图

相关文章:

你感兴趣的文章:

标签云: