第一次写博,还是个菜鸟。最近开始学习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. ASP.NET MVC- VIEW Creating Custom HTML Helpers Part 2

    The goal of this tutorial is to demonstrate how you can create custom HTML Helpers     that you can ...

  2. Spring基于注解的Cache支持

    Spring为我们提供了几个注解来支持Spring Cache.其核心主要是@Cacheable和@CacheEvict.使用@Cacheable标记的方法在执行后Spring Cache将缓存其返回 ...

  3. SAP HANA STRING_AGG

    HANA Version 1.00.73.00.389160 不支持STRING_AGG,所以只能,,,,,,,, DROP PROCEDURE ""."ZCONCAT_ ...

  4. ueditor编辑器图片自定义存放目录及路径修改

    百度编辑器ueditor功能强大,很多人士以应用项目开发中,但是里面有一个公众的问题就是上传图片存放目录太深,默认是ueditor/php/upload下,前不久测试后图片存放目录可以改变,但是路径会 ...

  5. WCF探索之旅(一)——入门

    背景 对于.NET程序员来说,假设你不知道WCF,那仅仅能说明一点:你还是个菜鸟. 曾经也用.NET做过几个系统,尤其做后面的系统的时候,心里就有点沾沾自喜了! 想着,.NET也就这点东西,我如今也能 ...

  6. Flume NG中的Kafka Channel

    kafka(官网地址:http://kafka.apache.org)是一款分布式消息发布和订阅的系统 在Flume中的KafkaChannel支持Flume与Kafka整合,可以将Kafka当做ch ...

  7. mysql case when then else end 用法

    select case when 判断条件 then 输出结果  else 输出结果 end from table

  8. 使用html5兼容低版本浏览器

    因为html5 新出的一些语义化的标签,在低版本浏览器下不能识别,举个例子,比如你写了一个 header 标签中,写了一段文本,在低版本浏览器下,肯定是能看到的,但是,那是他是不认识 header标签 ...

  9. 当前时间 js

    当前时间-倒计时下载 效果: 代码: <!doctype html> <html> <head> <meta http-equiv="Content ...

  10. .net 关于数据库的链接

    web.config的配置 <appSettings> <add key="Configpath" value="~/XmlConfig/webset. ...