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对象之 ...
随机推荐
- java中如何使正在运行中的线程退出
终止线程的三种方法 有三种方法可以使终止线程. 1. 使用退出标志,使线程正常退出,也就是当run方法完成后线程终止. 2. 使用stop方法强行终止线程(这个方法不 ...
- CSDN上最火的android项目
CSDN上最火的android项目 直接拿来用!最火的Android开源项目(二) 直接拿来用最火的android开源项目(1)
- 对tomcat来说,每一个进来的请求(request)都需要一个线程,直到该请求结束。
这段时间折腾了哈java web应用的压力测试,部署容器是tomcat 7.期间学到了蛮多散碎的知识点,及时梳理总结,构建良好且易理解的知识架构把它们组织起来,以备忘.对web应用开发者来说,我们很关 ...
- sqlserver 存储过程中拼接sql语句 动态执行
ALTER PROC [dbo].[Student_Friend_Get] @startRowIndexId INT, @maxNumberRows INT, @schoolId INT, @grad ...
- 线程本地存储(Thread Local Storage, TLS)简单分析与使用
在多线程编程中, 同一个变量, 如果要让多个线程共享访问, 那么这个变量可以使用关键字volatile进行声明; 那么如果一个变量不想使多个线程共享访问, 那么该怎么办呢? 呵呵, 这个办法就是TLS ...
- Ubuntu 13.10 Rhythmbox 播放器不能播放MP3。安装插件
Ctrl+Alt+T > sudo apt-get install ubuntu-restricted-extras 因为版权和专利的问题,MP3等一些non-free的格式文件支持没有出现在免 ...
- linux下安装memcached过程
前一次已经安装过memcached,没有做记录,太久没有操作了也没有记录有点生疏,做一下笔记,已背后用. 下载文件 下载memcached服务端, ...
- log4net日志组件
转载:http://www.cnblogs.com/knowledgesea/archive/2012/04/26/2471414.html 一.什么是log4net组件 Log4net是基于.net ...
- javascript类继承系列二(原型链)
原型链是采用最主要的继承方式,原理:每一个类(构造器,js中的function)都有一个原型属性(prototype)指向一个原型对象,原型对象有一个构造器(constructor),它又指回到fun ...
- Java23种设计模式之单例模式
一.单例模式简介 单例模式是Java设计模式中常见的一种模式.主要分为懒汉式单例.饿汉式单例.登记式单例: 单例模式的特点: 1.单例类只能有一个实例: 2.单例类必须自己创建自己的唯一的实例: ...