Opencv实现的简易绘图工具
第一次写博,还是个菜鸟。最近开始学习Opencv,试着写了个简易的绘图工具(目前只写了画线和橡皮擦部分,画其它图形还有待往里添加),也算是记录自己的学习之路。
#include "stdafx.h"
#include "cv.h"
#include "highgui.h" #define SHAPE_LINE 1
#define SHAPE_ERASER 2 int g_style;
CvRect rect; CvPoint g_StartPoint;
CvPoint g_EndPoint;
CvPoint p_Start; //记录鼠标位置左上方点
CvPoint p_End; //记录鼠标位置右下方点
bool drawing=false; //是否处于画图状态
bool erasering=false; //是否处于擦除状态 void callback(int event,int x,int y,int flags,void* param);
void DrawLine(IplImage* img);
//简易绘图工具,实现了画线和橡皮擦功能,绘图功能还有待往里添加
int main(int argc,char** argv)
{
IplImage* img=cvCreateImage(cvSize(512,512),IPL_DEPTH_8U,3);
cvSet(img,cvScalar(255,255,255)); IplImage* temp=cvCloneImage(img);
cvCopy(img,temp); cvNamedWindow("简易绘图工具"); cvSetMouseCallback("简易绘图工具",callback,img);
printf("请键入要选择执行的操作:‘l’——”画线“,‘e’——”橡皮“\n");
char select='l'; while(1)
{
cvCopyImage(img,temp); //始终在原图image上画结果(和鼠标事件绑定),先将image复制给temp,然后在临时图temp画出画图的过程(在main函数中画过程图形),然后用temp来显示图像
switch(select)
{
case 'l':
g_style=SHAPE_LINE;
break;
case 'e':
g_style=SHAPE_ERASER;
break;
case 27:
return 0;
}
if(g_style==SHAPE_LINE&&drawing) //画鼠标在按住移动过程中画线
cvDrawLine(temp,g_StartPoint,g_EndPoint,cvScalar(0,0,0));
if(g_style==SHAPE_ERASER)
{
cvRectangle(temp,p_Start,p_End,cvScalar(0,0,0)); //画出橡皮矩形边框
}
cvShowImage("简易绘图工具",temp);
select=cvWaitKey(30);
}
cvReleaseImage(&img);
cvReleaseImage(&temp);
cvDestroyWindow("简易绘图工具");
return 0;
} void callback(int event,int x,int y,int flags,void* param)
{
IplImage* img=(IplImage*)param; switch(event)
{
case CV_EVENT_LBUTTONDOWN:
{
if(SHAPE_LINE==g_style)
{
drawing=true;
g_StartPoint=cvPoint(x,y);
g_EndPoint=g_StartPoint; //此处将终点坐标设为同起始点避免记住前一条直线的终点坐标
}
if(SHAPE_ERASER==g_style)
{
erasering=true;
//注意边界问题要适当修改ROI有效区域
rect.x=x-20; rect.y=y-20; //注意坐标的计算,一般原点在窗口的左上角(这和操作系统等因素有关,IplImage结构中有个origin属性可以设置图像的原点)
rect.width=40; rect.height=40;
p_Start.x=x-20; p_Start.y=y-20;
p_End.x=x+20; p_End.y=y+20;
if(x>-20&&x<532&&y>-20&&y<532)
{
cvSetImageROI(img,rect);
cvSet(img,cvScalar(255,255,255));
cvResetImageROI(img);
}
}
}
break;
case CV_EVENT_MOUSEMOVE:
{
p_Start.x=x-20; p_Start.y=y-20; //随时定位鼠标位置画橡皮矩形
p_End.x=x+20; p_End.y=y+20;
if(SHAPE_LINE==g_style)
{
if(drawing)
{
g_EndPoint=cvPoint(x,y);
}
} if(SHAPE_ERASER==g_style)
{
rect.x=x-20; rect.y=y-20;
rect.width=40; rect.height=40;
if(erasering)
{
if(x>-20&&x<532&&y>-20&&y<532)
{
cvSetImageROI(img,rect);
cvSet(img,cvScalar(255,255,255));
cvResetImageROI(img);
}
}
} }
break;
case CV_EVENT_LBUTTONUP:
{
if(SHAPE_LINE==g_style)
{
drawing=false;
cvDrawLine(img,g_StartPoint,g_EndPoint,cvScalar(255,0,0)); //(255,0,0)此处画出的是蓝色,即BGR
} if(SHAPE_ERASER==g_style)
{
erasering=false;
}
}
}
}
Opencv实现的简易绘图工具的更多相关文章
- EasyX 简易绘图工具接口整理
EasyX Library for C++ (Ver:20190415(beta)) http://www.easyx.cn EasyX.h 1 #pragma once 2 3 #ifndef ...
- 【震惊】手把手教你用python做绘图工具(一)
在这篇博客里将为你介绍如何通过numpy和cv2进行结和去创建画布,包括空白画布.白色画布和彩色画布.创建画布是制作绘图工具的前提,有了画布我们就可以在画布上尽情的挥洒自己的艺术细胞. 还在为如何去绘 ...
- RDIFramework.NET ━ .NET快速信息化系统开发框架 V2.8 版本━新增企业通(内部简易聊天工具)
RDIFramework.NET ━ .NET快速信息化系统开发框架 V2.8 版本 新增企业通(内部简易聊天工具) RDIFramework.NET,基于.NET的快速信息化系统开发.整合框架,给用 ...
- UML系列01之 UML和绘图工具Visio介绍
概要 UML,全称是Unified Modeling Language,中文是"统一建模语言".通俗点说,UML是一种创建模型的语言.UML是在开发阶段,说明,可视化,构建和书写一 ...
- 用MSoffice里的绘图工具
试过一些绘图表的工具,在xbeta推荐的替代visio一文中介绍的一些软件.之前用得最多的就是Dia,在linux下也有.现在才发现在微软的office下的绘图工具已经足够我使用了,不需要专业的图形符 ...
- 一起来画画!8款最佳HTML5绘图工具
HTML5无疑是当前最受宠的一项技术,今天推荐8款HTML5绘图工具,同样惊艳你的眼球!这些绘图工具大多数是用HTML5画布(Canvas)实现的,部分辅以Javascript.对每一个web设计者来 ...
- HTML5 canvas 在线画笔绘图工具(一)
HTML5 canvas 在线画笔绘图工具(一) 功能介绍 这是我用Javascript写的第一个程序,在写的过程中走了很多弯路,所以写完之后想分享出来,给与我一样的初学者做为学习的参考,同时在编写这 ...
- 绘图工具graphviz学习使用
画图工具: http://www.tuicool.com/articles/r2iAfa http://www.tuicool.com/articles/RjQfey 绘图工具graphviz学习使用 ...
- HTML5 canvas 在线画笔绘图工具(三)
组装画板(TDrawBuilder) 在这一小节中我们要把工具条和画板组装起来,让他们可以协同进行工作. 画板通过一个命名为TDrawBuilder来进行组装.在详细讲解TDrawBuilder对象之 ...
随机推荐
- 【OpenCV】基于kmeans的细胞检测方法
问题是这样的,有一幅经过二值化处理之后的图像,我们希望统计其中细胞的个数,和不同粘连情况的细胞个数,比如,下图中有1个细胞组成连通区域的,也有2个细胞组成连通区域的,也有更多个细胞组成连通区域的,我们 ...
- 【设计模式 - 22】之策略模式(Strategy)
1 模式简介 在策略模式中,一个类的行为或其算法可以在运行时改变.策略模式定义了一系列算法,把它们一个个封装起来,并且使它们可以互相替换. 策略模式的优点: 1) 算法可以自由 ...
- SAP ABAP 日期相关函数
获的两个日期之间的分钟数 data min TYPE i. CALL FUNCTION 'DELTA_TIME_DAY_HOUR' EXPORTING T1 = ' T2 = ' D1 = ' D2 ...
- ubuntu 14.04 chromium,firefox 怎样正确安装Adobe flash player
一.firefox 正确安装Adobe flash player 有时候我们须要在Ubuntu下採用手动安装一些软件,比方Firefox的Flash插件.Adobe® Flash® Player 是一 ...
- 在内核外编写的linux驱动程序MAKEFILE
一般都是这么写: ifneq ($(KERNELRELEASE),) obj-m := else KERNELDIR ?= /lib/modules/$(shell uname -r)/build ...
- tabhost中setup()和setup(LocalActivityManager activityGroup)
如果用系统默认的tabhost时, 直接用getTabhost()初始化,整个类继承tabActivity. 当没有选择系统tabhost默认id时,而是自己定义的id时,必须使用 findViewB ...
- careercup-数组和字符串1.1
1.1 实现一个算法,确定一个字符串的所有字符是否全部不同.假设不允许使用额外的数据结构,又该如何处理? C++实现: #include<iostream> #include<str ...
- myeclipse 编码问题
在使用eclipse+MyEclipse开发中,许多文件编码默认是ISO-8859-1,不支持中文(如常用的JSP),这样我们每次建文件都要手动改编码,其实我们可以在设置文件默认编码,今后再创建时就不 ...
- magic_quotes_sybase(魔术引号开关)
magic_quotes_sybase,如果该选项在php.ini文件中是唯一开启的话,将只会转义%00为\0(即null字符).此选项会完全覆盖magic_quotes_gpc.如果同时开启这两个选 ...
- 聊聊 iOS 中的网络加密
介绍下 公司的接口一般会两种协议的,一种HTTP,一种HTTPS的,HTTP 只要请求,服务器就会响应,如果我们不对请求和响应做出加密处理,所有信息都是会被检测劫持到的,是很不安全的,客户端加密可以使 ...