例程代码
#include "opencv2/opencv.hpp"
#include <iostream>
using namespace std;
using namespace cv;
void onDraw(int event, int x, int y, int flags, void *userdata)
{
static Point bg(-1, -1), ed;
static Mat img;
img = ((Mat *)userdata)->clone();
if (event == EVENT_LBUTTONDOWN)
{
bg.x = x;
bg.y = y;
}
else if (event == EVENT_LBUTTONUP)
{
ed.x = x;
ed.y = y;
Rect rect(bg, ed);
imshow("selected", img(rect));
rectangle(img, rect, Scalar(0, 0, 255));
imshow("img", img);
bg.x = -1;
}
else if (bg.x > -1 && event == EVENT_MOUSEMOVE)
{
ed.x = x;
ed.y = y;
Rect rect(bg, ed);
rectangle(img, rect, Scalar(0, 0, 255));
imshow("img", img);
}
}
int main()
{
Mat img = imread("img.png");
namedWindow("img", WINDOW_FREERATIO);
namedWindow("selected", WINDOW_FREERATIO);
imshow("img", img);
setMouseCallback("img", onDraw, (void *)&img);
waitKey(0);
destroyAllWindows();
return 0;
}
运行效果