opencv鼠标点击记录坐标 连线 画封闭区域 二值填充

#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;  

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值