#include<opencv2/core/core.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<stdio.h>
#include <string>
#include <iostream>
using namespace std;
using namespace cv;
Mat src;
Mat dst;
Mat dst_mask;
vector<cv::Point> ptSet;
bool rButtonDown = false;
//Point points[1][20];
int i=0;
void on_mouse(int event, int x, int y, int flags, void* ustc)
{
static Point pre_pt ;
static Point cur_pt ;
char temp_1[20];
// 如果要在图片的任意位置作为起始点,这两步就不需要了
//pre_pt=Point(-1,-1);
//cur_pt=Point(-1,-1);
if (event == CV_EVENT_LBUTTONDOWN)
{
dst.copyTo(src);
pre_pt = Point(x, y);
//sprintf(temp_1,"x:%d,y:%d",x,y);
//xiaolei=Rect(x1,y1,0,0);
//putText(src,temp_1,Point(x,y),FONT_HERSHEY_SIMPLEX,0.5,Scalar(255,255,255));
circle(src, pre_pt, 0.5, cvScalar(255, 0, 0), CV_FILLED, CV_AA, 0);
imshow("src", src);
src.copyTo(dst);//确保画线操作是在src上进行
}
else if (event == EVENT_MOUSEMOVE && (flags & EVENT_FLAG_LBUTTON))
{
dst.copyTo(src);
cur_pt = Point(x, y);
sprintf(temp_1,"x:%d,y:%d",x,y);
//xiaolei=Rect(x1,y1,0,0);
putText(src,temp_1,Point(x,y),FONT_HERSHEY_SIMPLEX,0.5,Scalar(0,255,255));
line(src, pre_pt, cur_pt, cvScalar(0, 255,0), 1, CV_AA, 0);
imshow("src", src);
}
else if (event == CV_EVENT_LBUTTONUP)
{
dst.copyTo(src);
cur_pt = Point(x, y);
sprintf(temp_1,"x:%d,y:%d",x,y);
//xiaolei=Rect(x1,y1,0,0);
putText(src,temp_1,Point(x,y),FONT_HERSHEY_SIMPLEX,0.4,Scalar(0,255,255));
circle(src, cur_pt, 3, cvScalar(255,0, 0), CV_FILLED, CV_AA, 0);
line(src, pre_pt, cur_pt, cvScalar(0, 255,0), 1, CV_AA, 0);
ptSet.push_back(cur_pt);
//points[0][i]=Point(x,y);
imshow("src", src);
src.copyTo(dst);
i++;
}
else if (event == CV_EVENT_RBUTTONDOWN)
{
rButtonDown = true;
}
else if (event == CV_EVENT_RBUTTONUP)
{
if (rButtonDown==true)
{
cout<<ptSet.size()<<endl;
Point points[1][20];
for (int k=0;k<ptSet.size();k++)
{
points[0][k]=Point(ptSet[k].x,ptSet[k].y);
}
const Point* pt[1] = { points[0] };
int npt[1] = {ptSet.size()};
Mat image(src.rows, src.cols, CV_8UC1, Scalar(0, 0, 0));
polylines( image, pt, npt, 1, 1, Scalar(250,0,0)) ;
fillPoly( image, pt, npt, 1, Scalar(250,0,0), 8);
image.copyTo(dst_mask);
imshow("ss",image);
//imwrite("1.png", image);
}
rButtonDown = false;
}
}
int main()
{
//注意:这一步必须要有,不然进行不了鼠标操作
namedWindow("src", WINDOW_AUTOSIZE);//WINDOW_AUTOSIZE:系统默认,显示自适应
char * srcname="172.19.7.18.bmp";
//char path_buffer[_MAX_PATH];
char drive[_MAX_DRIVE];
char dir[_MAX_DIR];
char fname[_MAX_FNAME];
char ext[_MAX_EXT];
_splitpath( srcname, drive, dir, fname, ext );
src = imread(srcname, 1);//1:为原图颜色,0:为灰度图,黑白颜色
src.copyTo(dst);
char *binaryMask="binaryMask";
char *maskname=new char[30];
sprintf(maskname,"%s%s.bmp",fname,binaryMask);
cout<<maskname<<endl;
setMouseCallback("src", on_mouse, 0);
imshow("src", src);
// Wait for a keystroke in the window
for (;;)
{
char key = waitKey(0);
switch (key)
{
case 'q':
cout << "goodbye" << endl;
return 0;
case 's':
{
imwrite(maskname,dst_mask);
break;
}
}
}
waitKey(0);
return 0;
}
opencv鼠标点击记录坐标 连线 画封闭区域 二值填充
于 2017-05-10 11:00:22 首次发布