opencv鼠标点击记录坐标 连线 画封闭区域 二值填充
来源:互联网 发布:线切割五角星编程 编辑:程序博客网 时间:2024/09/21 09:29
#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;
}
#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;
}
0 0
- opencv鼠标点击记录坐标 连线 画封闭区域 二值填充
- [JavaScript]获取鼠标点击区域的相对、绝对位置坐标
- openCV 鼠标获取坐标值
- OpenCV记录鼠标左键点击位置
- OpenCV—利用回调函数实现返回鼠标点击位置的坐标和灰度值
- OpenCV学习笔记——点击显示鼠标坐标
- OpenCV学习笔记——点击显示鼠标坐标
- 学习OpenCV——鼠标事件 输出鼠标坐标&区域亮化
- 基于漫水填充法的二值图像封闭孔洞填充
- Opencv鼠标画直线并显示坐标
- OpenCV: 鼠标获取坐标
- opencv鼠标获取坐标
- 鼠标悬浮显示区域坐标
- Android 不规则封闭区域填充 手指秒变油漆桶
- Android 不规则封闭区域填充 手指秒变油漆桶
- Android 不规则封闭区域填充 手指秒变油漆桶
- Android 不规则封闭区域填充 手指秒变油漆桶
- Android 不规则封闭区域填充 手指秒变油漆桶
- Integer和int的比较大小
- 导入算量文件
- 理解滚动scroll
- 【搜索】洛谷 P1433 吃奶酪
- HashMap Hashtable区别
- opencv鼠标点击记录坐标 连线 画封闭区域 二值填充
- 哈希表及其常用算法(代码实现)
- Android View如何获取焦点 EditText焦点转移
- 集群故障
- windows下使用PHP实现定时执行脚本
- bzoj1270: [BeijingWc2008]雷涛的小猫
- jQuery元素过滤
- 百度官方解答百度快照的4大问题
- 将图片转换成caffe的数据格式