OpenCV学习9 获取图像感兴趣(ROI)区域并截图(2)

在上一篇小弟用了一个较为麻烦且取巧的办法利用opencv对图像进行简单的截图。
今天更进一步,利用鼠标直接在图片上使用矩形框选取感兴趣区域截图,真正类似于qq微信的截图方式。

运行结果如下

OpenCV学习9 获取图像感兴趣(ROI)区域并截图(2)

代码如下

#include<opencv2/opencv.hpp>  
using namespace std;
using namespace cv;


Rect select;
bool select_flag = false;//bool flag=false; 这句是定义了一个变量为flag 在下面代码中出现的flag都是这个变量 

Mat tu1, tu2;

void S_on_Mouse(int event, int x, int y, int flags, void*param) 
{
    Point p1, p2;
    switch (event)
    {
        case  EVENT_LBUTTONDOWN://点击鼠标左键发生的事件
        {
           select.x = x;
           select.y = y;
           select_flag = true;
        }
        break;
        case EVENT_MOUSEMOVE://移动鼠标发生的事件
        {
            if (select_flag)
            {
                tu1.copyTo(tu2);
                p1 = Point(select.x, select.y);
                p2 = Point(x, y);
                rectangle(tu2, p1, p2, Scalar(0, 255, 0), 2,8);//tu2:待处理图片;  p1, p2:代表左上右下矩形的点坐标;  scalar:颜色2代表线条宽度; 8是线型,默认取8(可不填)
                imshow("框选图", tu2);
            }
        }
        break;
        case EVENT_LBUTTONUP://松开鼠标左键发生的事件
        {
            //显示框出的ROI   
            Rect roi = Rect(Point(select.x, select.y), Point(x, y));
            if (roi.width && roi.height)
            {
                Mat roiImg = tu1(roi);
                imshow("截图", roiImg);
                imwrite("截图.jpg", roiImg);//保存截图在工程目录下
            }                           
            select_flag = false;
        }
        break;
    }
}

int main()
{
    tu1 = imread("ming2.jpg");
    tu2 = tu1.clone();
    select.x = select.y = 0;//初始化xy的值
    imshow("框选图", tu2);

    while (1)
    {
        int key = waitKey(10);
        switch (key)
        {
        case 'j'://按j再点击鼠标左键开始截图
            setMouseCallback("框选图", S_on_Mouse, 0);//一旦调用鼠标就开始执行S_on_Mouse函数
            break;
        }
        if (key == 27 || key == 's')//按s退出
            break;
    }
    waitKey(0);
    return 0;
}

以上主要运用到了调用鼠标事件
函数:cvSetMouseCallback( const char* window_name, CvMouseCallback on_mouse,void* param CV_DEFAULT(NULL));

画矩形框用到以下函数与rect不同
rectangle(tu2, p1, p2, Scalar(0, 255, 0), 2,8);
tu2:待处理图片;
p1, p2:代表左上右下矩形的点坐标;
scalar:颜色绿色
2代表线条宽度;
8是线型,默认取8(可不填)

Rect(x,y,width,height);
x, y 为左上角坐标,
width, height 则为长和宽。

写在最后

该方法参考了许多博主链接如下

1.rectangle函数与Rect函数的用法 - weixin_43491924的博客 - CSDN博客 https://blog.csdn.net/weixin_43491924/article/details/85218336
2.关于标记bool flag=false;-黑马程序员技术交流社区
http://bbs.itheima.com/thread-56606-1-1.html
3.opencv 截图并保存 - kalp_yp - CSDN博客
https://blog.csdn.net/u013539952/article/details/77171061
4.在OpenCV中调用鼠标事件 - k - CSDN博客 https://blog.csdn.net/qq_22033759/article/details/48415613

1524618