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对象之 ...
随机推荐
- springsecurity4+springboot 实现remember-me 发现springsecurity 的BUG
前言:现在开发中,记住我这个功能是普遍的,用户不可能每次登录都要输入用户名密码.昨天准备用spring security的记住我功能,各种坑啊,吐血 . 先看下具体实现吧. spring securi ...
- SAP HANA SLT 将Oracle表 数据同步到HANA数据库
简单介绍SLT 同步数据的整个配置过程: 在SLT系统中创建与Oracle的链接 在HANA监控平台上,创建Configuration 创建表的同步作业 ——————————————BEGIN———— ...
- Android中利用OpenMax 编程的基本流程
近期因为公司在做数字电视,播放器和模块由供应商打包一起卖,驱动调通了,但是播放器要硬件解码,和平台差异,原厂又没有相关文档,就自己试着看了一个系统的播放器流程,顺便整理了一下,也方便以后查询,希望对播 ...
- sqlServer将多字段设为主键方法
补充一下关于数据库多字段复合主键的设置. 首先一个表是不能有多个主键的.但是可以有多个字段组合成一个主键,这就是为什么有时候表里为什么会有多个字段都有主键的标志,那是因为他们组合成了一个主键了.我们可 ...
- Redis实战之Redis + Jedis[转]
http://blog.csdn.net/it_man/article/details/9730605 2013-08-03 11:01 1786人阅读 评论(0) 收藏 举报 目录(?)[-] ...
- iOS开发-javaScript交互
前言 当前混合开发模式迎来了前所未有的发展,跨平台开发.热更新等优点决定了这种模式的重要地位.虽然前端界面在交互.动效等多方面距离原生应用还有差距,但毫无疑问混合开发只会被越来越多的公司接受.在iOS ...
- CocoaPods导入第三方库头文件自动补齐
使用了一段时间CocoaPods来管理Objective-c的类库,方便了不少.但是有一个小问题,当我在xcode输入import关键字的时候,没有自动联想补齐代码的功能,需要手工敲全了文件名,难以适 ...
- TableView的优化
一:什么是TableView的优化以及为什么要优化 1)CPU(中央处理器)和GPU(图形处理器):CPU主要从事逻辑计算的一些工作:GPU主要从事图形处理方面的工作. 2)CPU和GPU的共同点: ...
- Android(java)学习笔记188:关于构造代码块,构造函数的一道面试题(华为面试题)
1.源码是: package text; public class TestStaticCon { public static int a = 0; static { a = 10; System.o ...
- centos6.7 install chrome
1.yum仓库 (如果用rpm包安装 可以忽略此步) vim /etc/yum.repos.d/google-chrome.repo [google-chrome] name=google-chrom ...