C++版本:
#include <opencv2/imgproc.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>
using namespace std;
using namespace cv;
Mat src, img1, mask, final;
Point point;
vector<Point> pts;
int drag = 0;
int var = 0;
int flag = 0;
void mouseHandler(int, int, int, int, void*);
void mouseHandler(int event, int x, int y, int, void*)
{
// 左键按下
if (event == EVENT_LBUTTONDOWN && !drag)
{
if (flag == 0) // 标记是否生成掩码
{
// 第一次进入备份原图像
if (var == 0)
img1 = src.clone();
// 记录当前左键按下的点
point = Point(x, y);
// 在图像上将这个点用圆绘制出来,实心圆
circle(img1, point, 2, Scalar(0, 0, 255), -1, 8, 0);
// 点入vector
pts.push_back(point);
// 点的数量加1
var++;
// 表示已经有了一个点了
drag = 1;
// 如果点的数量大于1,则绘制上一个点于当前点的直线
if (var > 1)
line(img1, pts[var - 2], point, Scalar(0, 0, 255), 2, 8, 0);
// 刷新图像
imshow("Source", img1);
}
}
// 左键松起
if (event == EVENT_LBUTTONUP && drag)
{
// 显示图像
imshow("Source", img1);
drag = 0;
}
// 右键按下
if (event == EVENT_RBUTTONDOWN)
{
// 表示右键
flag = 1;
// 备份图像
img1 = src.clone();
// 如果左键点击的得到的点数不为0,则绘制多边形
if (var != 0)
{
polylines(img1, pts, 1, Scalar(0, 0, 0), 2, 8, 0);
}
// 显示图像
imshow("Source&