有关opencv2的文章比较少,介于这个原因为了让后来人可以学到一些opencv2的有关知识,本人决定开始写opencv2的专栏,希望可以给大家帮助
我没有按照顺序编写,读者需要的部分可以看我的opencv专栏
由于鼠标事件很有用,第一篇就写写鼠标事件的用法:
#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/imgproc/types_c.h>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/core/core.hpp>
#include<iostream>
#include<vector>
#include<opencv2/nonfree/features2d.hpp>
#include<opencv2/legacy/legacy.hpp>
#include<opencv2/features2d/features2d.hpp>
#include<opencv2/calib3d/calib3d.hpp>
#include<opencv2/video/tracking.hpp>
Point coord;//储存初始坐标
Rect sqart;//储存矩形框的起始坐标以及长度和宽度
bool draw;
Mat img;//过度图像
Mat dst;//感兴趣区域图像
Mat org;//将org作为原始图像储存
void onMouse(int event, int x, int y, int flags, void *param)
{
/*cout << "Event:" << event << endl;
cout << "x=" << x << " " << "y=" << y << endl;
cout << "flags:" << endl;
cout << "param" << param << endl;*/
switch (event)
{
//按下鼠标左键
case CV_EVENT_LBUTTONDOWN:
//在第二次点击鼠标图像时,这里清除了一下显示小窗口的步骤
cvDestroyWindow("dst");
//储存起始坐标
coord = Point(x, y);
//将起始矩形框初始化
sqart = Rect(x, y, 0, 0);
draw = true;
break;
//松开鼠标左键
case CV_EVENT_LBUTTONUP:
if (sqart.height > 0 && sqart.width > 0)
{
//将img中的矩形区域复制给dst,并显示在img窗口中
dst = img(Rect(sqart.x, sqart.y, sqart.width, sqart.height));
rectangle(img, sqart, Scalar(0, 0, 255), 1);
namedWindow("img");
imshow("img", img);
//将画过矩形框的图像用org原图像还原
org.copyTo(img);
imshow("Mouse", img);
namedWindow("dst");
imshow("dst", dst);
waitKey(0);
}
draw = false;
break;
case CV_EVENT_MOUSEMOVE:
if (draw/*&&sqart.height > 0 && sqart.width > 0*/)
{
//用MIN得到左上点作为矩形框的其实坐标,如果不加这个,画矩形时只能向一个方向进行
sqart.x = MIN(x, coord.x);
sqart.y = MIN(y, coord.y);
sqart.width = abs(coord.x - x);
sqart.height = abs(coord.y - y);
//防止矩形区域超出图像的范围
sqart &= Rect(0, 0, org.cols, org.rows);
}
break;
}
}
int main()
{
img = imread("F:\\road.jpg");
namedWindow("Mouse");
setMouseCallback("Mouse", onMouse, NULL);
imshow("Mouse", img);
img.copyTo(org);//将org作为原始图像储存
waitKey(0);
return 0;
}
运行结果: