第一次写博,还是个菜鸟。最近开始学习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实现的简易绘图工具的更多相关文章

  1. EasyX 简易绘图工具接口整理

      EasyX Library for C++ (Ver:20190415(beta)) http://www.easyx.cn EasyX.h 1 #pragma once 2 3 #ifndef ...

  2. 【震惊】手把手教你用python做绘图工具(一)

    在这篇博客里将为你介绍如何通过numpy和cv2进行结和去创建画布,包括空白画布.白色画布和彩色画布.创建画布是制作绘图工具的前提,有了画布我们就可以在画布上尽情的挥洒自己的艺术细胞. 还在为如何去绘 ...

  3. RDIFramework.NET ━ .NET快速信息化系统开发框架 V2.8 版本━新增企业通(内部简易聊天工具)

    RDIFramework.NET ━ .NET快速信息化系统开发框架 V2.8 版本 新增企业通(内部简易聊天工具) RDIFramework.NET,基于.NET的快速信息化系统开发.整合框架,给用 ...

  4. UML系列01之 UML和绘图工具Visio介绍

    概要 UML,全称是Unified Modeling Language,中文是"统一建模语言".通俗点说,UML是一种创建模型的语言.UML是在开发阶段,说明,可视化,构建和书写一 ...

  5. 用MSoffice里的绘图工具

    试过一些绘图表的工具,在xbeta推荐的替代visio一文中介绍的一些软件.之前用得最多的就是Dia,在linux下也有.现在才发现在微软的office下的绘图工具已经足够我使用了,不需要专业的图形符 ...

  6. 一起来画画!8款最佳HTML5绘图工具

    HTML5无疑是当前最受宠的一项技术,今天推荐8款HTML5绘图工具,同样惊艳你的眼球!这些绘图工具大多数是用HTML5画布(Canvas)实现的,部分辅以Javascript.对每一个web设计者来 ...

  7. HTML5 canvas 在线画笔绘图工具(一)

    HTML5 canvas 在线画笔绘图工具(一) 功能介绍 这是我用Javascript写的第一个程序,在写的过程中走了很多弯路,所以写完之后想分享出来,给与我一样的初学者做为学习的参考,同时在编写这 ...

  8. 绘图工具graphviz学习使用

    画图工具: http://www.tuicool.com/articles/r2iAfa http://www.tuicool.com/articles/RjQfey 绘图工具graphviz学习使用 ...

  9. HTML5 canvas 在线画笔绘图工具(三)

    组装画板(TDrawBuilder) 在这一小节中我们要把工具条和画板组装起来,让他们可以协同进行工作. 画板通过一个命名为TDrawBuilder来进行组装.在详细讲解TDrawBuilder对象之 ...

随机推荐

  1. java中如何使正在运行中的线程退出

    终止线程的三种方法      有三种方法可以使终止线程.      1.  使用退出标志,使线程正常退出,也就是当run方法完成后线程终止.      2.  使用stop方法强行终止线程(这个方法不 ...

  2. CSDN上最火的android项目

    CSDN上最火的android项目 直接拿来用!最火的Android开源项目(二) 直接拿来用最火的android开源项目(1)

  3. 对tomcat来说,每一个进来的请求(request)都需要一个线程,直到该请求结束。

    这段时间折腾了哈java web应用的压力测试,部署容器是tomcat 7.期间学到了蛮多散碎的知识点,及时梳理总结,构建良好且易理解的知识架构把它们组织起来,以备忘.对web应用开发者来说,我们很关 ...

  4. sqlserver 存储过程中拼接sql语句 动态执行

    ALTER PROC [dbo].[Student_Friend_Get] @startRowIndexId INT, @maxNumberRows INT, @schoolId INT, @grad ...

  5. 线程本地存储(Thread Local Storage, TLS)简单分析与使用

    在多线程编程中, 同一个变量, 如果要让多个线程共享访问, 那么这个变量可以使用关键字volatile进行声明; 那么如果一个变量不想使多个线程共享访问, 那么该怎么办呢? 呵呵, 这个办法就是TLS ...

  6. Ubuntu 13.10 Rhythmbox 播放器不能播放MP3。安装插件

    Ctrl+Alt+T > sudo apt-get install ubuntu-restricted-extras 因为版权和专利的问题,MP3等一些non-free的格式文件支持没有出现在免 ...

  7. linux下安装memcached过程

    前一次已经安装过memcached,没有做记录,太久没有操作了也没有记录有点生疏,做一下笔记,已背后用. 下载文件                            下载memcached服务端, ...

  8. log4net日志组件

    转载:http://www.cnblogs.com/knowledgesea/archive/2012/04/26/2471414.html 一.什么是log4net组件 Log4net是基于.net ...

  9. javascript类继承系列二(原型链)

    原型链是采用最主要的继承方式,原理:每一个类(构造器,js中的function)都有一个原型属性(prototype)指向一个原型对象,原型对象有一个构造器(constructor),它又指回到fun ...

  10. Java23种设计模式之单例模式

    一.单例模式简介 单例模式是Java设计模式中常见的一种模式.主要分为懒汉式单例.饿汉式单例.登记式单例: 单例模式的特点:  1.单例类只能有一个实例:  2.单例类必须自己创建自己的唯一的实例: ...