第一次写博,还是个菜鸟。最近开始学习Opencv,试着写了个简易的绘图工具(目前只写了画线和橡皮擦部分,画其它图形还有待往里添加),也算是记录自己的学习之路。

  1. #include "stdafx.h"
  2. #include "cv.h"
  3. #include "highgui.h"
  4.  
  5. #define SHAPE_LINE 1
  6. #define SHAPE_ERASER 2
  7.  
  8. int g_style;
  9. CvRect rect;
  10.  
  11. CvPoint g_StartPoint;
  12. CvPoint g_EndPoint;
  13. CvPoint p_Start; //记录鼠标位置左上方点
  14. CvPoint p_End; //记录鼠标位置右下方点
  15. bool drawing=false; //是否处于画图状态
  16. bool erasering=false; //是否处于擦除状态
  17.  
  18. void callback(int event,int x,int y,int flags,void* param);
  19. void DrawLine(IplImage* img);
  20. //简易绘图工具,实现了画线和橡皮擦功能,绘图功能还有待往里添加
  21. int main(int argc,char** argv)
  22. {
  23. IplImage* img=cvCreateImage(cvSize(512,512),IPL_DEPTH_8U,3);
  24. cvSet(img,cvScalar(255,255,255));
  25.  
  26. IplImage* temp=cvCloneImage(img);
  27. cvCopy(img,temp);
  28.  
  29. cvNamedWindow("简易绘图工具");
  30.  
  31. cvSetMouseCallback("简易绘图工具",callback,img);
  32. printf("请键入要选择执行的操作:‘l’——”画线“,‘e’——”橡皮“\n");
  33. char select='l';
  34.  
  35. while(1)
  36. {
  37. cvCopyImage(img,temp); //始终在原图image上画结果(和鼠标事件绑定),先将image复制给temp,然后在临时图temp画出画图的过程(在main函数中画过程图形),然后用temp来显示图像
  38. switch(select)
  39. {
  40. case 'l':
  41. g_style=SHAPE_LINE;
  42. break;
  43. case 'e':
  44. g_style=SHAPE_ERASER;
  45. break;
  46. case 27:
  47. return 0;
  48. }
  49. if(g_style==SHAPE_LINE&&drawing) //画鼠标在按住移动过程中画线
  50. cvDrawLine(temp,g_StartPoint,g_EndPoint,cvScalar(0,0,0));
  51. if(g_style==SHAPE_ERASER)
  52. {
  53. cvRectangle(temp,p_Start,p_End,cvScalar(0,0,0)); //画出橡皮矩形边框
  54. }
  55. cvShowImage("简易绘图工具",temp);
  56. select=cvWaitKey(30);
  57. }
  58. cvReleaseImage(&img);
  59. cvReleaseImage(&temp);
  60. cvDestroyWindow("简易绘图工具");
  61. return 0;
  62. }
  63.  
  64. void callback(int event,int x,int y,int flags,void* param)
  65. {
  66. IplImage* img=(IplImage*)param;
  67.  
  68. switch(event)
  69. {
  70. case CV_EVENT_LBUTTONDOWN:
  71. {
  72. if(SHAPE_LINE==g_style)
  73. {
  74. drawing=true;
  75. g_StartPoint=cvPoint(x,y);
  76. g_EndPoint=g_StartPoint; //此处将终点坐标设为同起始点避免记住前一条直线的终点坐标
  77. }
  78. if(SHAPE_ERASER==g_style)
  79. {
  80. erasering=true;
  81. //注意边界问题要适当修改ROI有效区域
  82. rect.x=x-20; rect.y=y-20; //注意坐标的计算,一般原点在窗口的左上角(这和操作系统等因素有关,IplImage结构中有个origin属性可以设置图像的原点)
  83. rect.width=40; rect.height=40;
  84. p_Start.x=x-20; p_Start.y=y-20;
  85. p_End.x=x+20; p_End.y=y+20;
  86. if(x>-20&&x<532&&y>-20&&y<532)
  87. {
  88. cvSetImageROI(img,rect);
  89. cvSet(img,cvScalar(255,255,255));
  90. cvResetImageROI(img);
  91. }
  92. }
  93. }
  94. break;
  95. case CV_EVENT_MOUSEMOVE:
  96. {
  97. p_Start.x=x-20; p_Start.y=y-20; //随时定位鼠标位置画橡皮矩形
  98. p_End.x=x+20; p_End.y=y+20;
  99. if(SHAPE_LINE==g_style)
  100. {
  101. if(drawing)
  102. {
  103. g_EndPoint=cvPoint(x,y);
  104. }
  105. }
  106.  
  107. if(SHAPE_ERASER==g_style)
  108. {
  109. rect.x=x-20; rect.y=y-20;
  110. rect.width=40; rect.height=40;
  111. if(erasering)
  112. {
  113. if(x>-20&&x<532&&y>-20&&y<532)
  114. {
  115. cvSetImageROI(img,rect);
  116. cvSet(img,cvScalar(255,255,255));
  117. cvResetImageROI(img);
  118. }
  119. }
  120. }
  121.  
  122. }
  123. break;
  124. case CV_EVENT_LBUTTONUP:
  125. {
  126. if(SHAPE_LINE==g_style)
  127. {
  128. drawing=false;
  129. cvDrawLine(img,g_StartPoint,g_EndPoint,cvScalar(255,0,0)); //(255,0,0)此处画出的是蓝色,即BGR
  130. }
  131.  
  132. if(SHAPE_ERASER==g_style)
  133. {
  134. erasering=false;
  135. }
  136. }
  137. }
  138. }

  

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. springsecurity4+springboot 实现remember-me 发现springsecurity 的BUG

    前言:现在开发中,记住我这个功能是普遍的,用户不可能每次登录都要输入用户名密码.昨天准备用spring security的记住我功能,各种坑啊,吐血 . 先看下具体实现吧. spring securi ...

  2. SAP HANA SLT 将Oracle表 数据同步到HANA数据库

    简单介绍SLT 同步数据的整个配置过程: 在SLT系统中创建与Oracle的链接 在HANA监控平台上,创建Configuration 创建表的同步作业 ——————————————BEGIN———— ...

  3. Android中利用OpenMax 编程的基本流程

    近期因为公司在做数字电视,播放器和模块由供应商打包一起卖,驱动调通了,但是播放器要硬件解码,和平台差异,原厂又没有相关文档,就自己试着看了一个系统的播放器流程,顺便整理了一下,也方便以后查询,希望对播 ...

  4. sqlServer将多字段设为主键方法

    补充一下关于数据库多字段复合主键的设置. 首先一个表是不能有多个主键的.但是可以有多个字段组合成一个主键,这就是为什么有时候表里为什么会有多个字段都有主键的标志,那是因为他们组合成了一个主键了.我们可 ...

  5. Redis实战之Redis + Jedis[转]

    http://blog.csdn.net/it_man/article/details/9730605 2013-08-03 11:01 1786人阅读 评论(0) 收藏 举报   目录(?)[-] ...

  6. iOS开发-javaScript交互

    前言 当前混合开发模式迎来了前所未有的发展,跨平台开发.热更新等优点决定了这种模式的重要地位.虽然前端界面在交互.动效等多方面距离原生应用还有差距,但毫无疑问混合开发只会被越来越多的公司接受.在iOS ...

  7. CocoaPods导入第三方库头文件自动补齐

    使用了一段时间CocoaPods来管理Objective-c的类库,方便了不少.但是有一个小问题,当我在xcode输入import关键字的时候,没有自动联想补齐代码的功能,需要手工敲全了文件名,难以适 ...

  8. TableView的优化

    一:什么是TableView的优化以及为什么要优化 1)CPU(中央处理器)和GPU(图形处理器):CPU主要从事逻辑计算的一些工作:GPU主要从事图形处理方面的工作. 2)CPU和GPU的共同点: ...

  9. Android(java)学习笔记188:关于构造代码块,构造函数的一道面试题(华为面试题)

    1.源码是: package text; public class TestStaticCon { public static int a = 0; static { a = 10; System.o ...

  10. centos6.7 install chrome

    1.yum仓库 (如果用rpm包安装 可以忽略此步) vim /etc/yum.repos.d/google-chrome.repo [google-chrome] name=google-chrom ...