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

#include "stdafx.h"
#include "cv.h"
#include "highgui.h"#define SHAPE_LINE 1
#define SHAPE_ERASER 2int 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;}}}
}

  

转载于:https://www.cnblogs.com/luckyboylch/p/4897974.html

Opencv实现的简易绘图工具相关推荐

  1. 用canvas实现一个简易绘图工具

    先看效果 这里可以选择颜色,从而进行在600px*400px画布中,随便画 ★HTML架构部分 <!-- HTML架构部分 --> <div><h3>简易绘图工具& ...

  2. 基于C#实现简易绘图工具【100010177】

    C#实现简易绘图工具 一. 引言 实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有 ...

  3. 《OpenCV3编程入门》学习笔记4 OpenCV数据结构与基本绘图

    第4章 OpenCV数据结构与基本绘图 4.1 基础图像容器Mat 4.1.1 数字图像存储概述   图像在数码设备中的表现形式:像素点矩阵 4.1.2 Mat结构的使用 1.OpenCV1.x时代: ...

  4. python Turtle Graphics海龟绘图工具

    python 2.6中引入了一个简单的绘图工具,叫做海龟绘图 Turtle Graphics 首先我们需要添加头文件 turtle import 下面引入一个代码段,是通过海龟绘图制作的五角星 imp ...

  5. QT编写简易截图工具

    QT编写简易截图工具 Windows和Linux下编译通过,版本5.9.1 ##设计界面 新建Widget项目,进入ui设计界面,添加QLabel和两个QPushButton,布局如下: Button ...

  6. <笔记1>matplotlib绘图工具笔记

    matplotlib绘图工具笔记 python中有许多非常方便的可视化工具,例如matplotlib,seaborn等.在这里主要总结matplotlib的简单绘图方法. 设置图形的大小和中文显示,图 ...

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

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

  8. 编程软件python图片-python Plotly绘图工具的简单使用

    1.plotly库的相关介绍 1)相关说明 plotly是一个基于javascript的绘图库,plotly绘图种类丰富,效果美观: 易于保存与分享plotly的绘图结果,并且可以与Web无缝集成: ...

  9. python 画柱状图-python使用Plotly绘图工具绘制柱状图

    本文实例为大家分享了python使用Plotly绘图工具绘制柱状图的具体代码,供大家参考,具体内容如下 使用Plotly绘制基本的柱状图,需要用到的函数是graph_objs 中 Bar函数 通过参数 ...

  10. 用python画太阳花-python 简单的绘图工具turtle使用详解

    目录 1. 画布(canvas) 1.1 设置画布大小 2. 画笔 2.1 画笔的状态 2.2 画笔的属性 2.3 绘图命令 3. 命令详解 4. 绘图举例 4.1 太阳花 4.2 绘制小蟒蛇 4.3 ...

最新文章

  1. php使用NuSoap产生webservice结合WSDL让asp.net调用
  2. 教程:14、系统性能分析
  3. ASP.NET AJAX学习记要(2)-下手之DOM
  4. Linux环境进程间通信(五): 共享内存(上)
  5. Trigger触发器_05
  6. k8s prometheus/grafana 监控系统建设
  7. pythoniris补全缺失值_机器学习iris数据集导入
  8. dev-stack安装openstack
  9. 【做小游戏在Godot中遇到的问题第一篇】
  10. 使用C#解线性回归方程
  11. 巫师3储物箱在哪_巫师3全宝藏宝箱地图分享 各种宝藏的具体位置
  12. Multiplayer Moo
  13. java ygc 频繁_jvm之判断ygc耗时和频率
  14. 为啥app没有menu键?
  15. 计算机字符格式化集体备课教案,有序备课:集体备课中不要忘记个性化备课
  16. IP化构建新型“路网系统” 工业互联网驶上快车道
  17. 毫无争议:它就是 macOS 上最好用的视频播放器
  18. python随机生成IP地址
  19. 一个未完成的文字rpg打怪小游戏。。。(难得写点东西)
  20. 搜狗拼音输入法词库是怎样炼成的

热门文章

  1. 进阶程序员都不会急于学习编程语言,知道原因吗?
  2. (第二部)程序员逆天改命之胜天半子
  3. python 爬糗事百科
  4. 个人理解的块状格式化上下文
  5. hibernate+spring+struts集成,并自动生成实体类和DAO层的步奏
  6. apach2.2+php5.35 windows环境下安装问题解决
  7. Windows Azure 客户真实案例:交互式解决方案提供商获得了敏捷性,通过托管服务节省了成本...
  8. 一个程序员成功的六个阶段
  9. TX2 摄像头CSI(一)
  10. 七、深度学习中的正则化