cpp文件
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <opencv.hpp>
using namespace std;
using namespace cv;
Point coord;//储存初始坐标
Rect sqart;//储存矩形框的起始坐标以及长度和宽度
bool draw;
bool flag = 0;//这个标志位是用在如果要将矩形标定的部分单独显示在一个窗口时使用的
Mat image, frame;
double LinesDis();
void onMouse(int event, int x, int y, int flags, void *param);//鼠标点击函数声明
int main()
{
VideoCapture capture(0);
if (!capture.isOpened())
{
cout << "open camera failed." << endl;
return -1;
}
while (true)
{
capture >> image;
//调用鼠标回调函数
//LinesDis(frame.data);
LinesDis();
}
return 0;
}
double LinesDis()
{
namedWindow("Mouse", 1);
setMouseCallback("Mouse", onMouse, 0);
rectangle(image, sqart, Scalar(0, 0, 255), 1);
imshow("Mouse", image);
waitKey(1);
return 0;
}
//鼠标点击函数
void onMouse(int event, int x, int y, int flags, void *param)
{
//这个if必须放在switch之前
if (draw)
{
//用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, image.cols, image.rows);*/
}
switch (event)
{
case CV_EVENT_LBUTTONDOWN:
coord = Point(x, y);
sqart = Rect(x, y, 0, 0);
draw = true;
break;
case CV_EVENT_LBUTTONUP:
draw = false;
flag = 1;
break;
}
}
运行结果