Opencv实现的简易绘图工具
来源:互联网 发布:js调用手写输入法 编辑:程序博客网 时间:2024/06/05 07:53
#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
;
}
}
}
}
阅读全文
0 0
- Opencv实现的简易绘图工具
- opencv实现简易画图工具
- sift的opencv简易实现
- 简易的Android绘图程序
- opencv的基本绘图
- Opencv实现简易播放器
- 绘图工具(代码实现绘图)---plantuml
- Win8 下 基于 交换链实现的 绘图工具
- 简易高重用的jdbcutils工具封装实现类以及简易连接池实现
- 简易高重用的jdbcutils工具封装实现类以及简易连接池实现
- EGE windows下的简易绘图库
- 用opencv实现绘图和文字输出。。。。
- Android实战简易教程<三>(实现简单绘图组件)
- OpenCV绘图
- opencv绘图
- 【OpenCV】绘图
- opencv:绘图
- 网页版的绘图工具
- 51Nod 1174区间中最大的数
- 光耦型号内部结构图
- tensorflow 的reshape()和resize()函数
- Python post 传递text格式参数(自己组装数据头)
- 2.自动索引计算数组元素的平方和
- Opencv实现的简易绘图工具
- ORA-02290: 违反检查约束条件 (MES_V1.SYS_C0027075)原因以及解决方法
- 面面向对象(上) 封装,继承,对象初始化流程,单例设计模式向对象(上) 封装,继承,对象初始化流程,单例设计模式
- BIO与NIO、AIO的区别
- 开关电源上的光耦的故障检修
- scrollWidth,clientWidth,offsetWidth的区别 通过一个demo测试这三个属性的差别。 说明: scrollWidth:对象的实际内容的宽度,不包边线宽度,会随对象
- 大型数据库PL/SQL高级编程
- Python学习笔记(一)
- rabbitMQ--RabbitMQ中 exchange、route、queue的关系