(学习opencv二刷)简单绘图


/*******************************************************************************
Copyright (c) 2017-2018, Hangzhou UNV Technologies Co., Ltd. All rights reserved.
--------------------------------------------------------------------------------
filename.cpp(filename.c)
Project Code: ISF
Module Name:简单绘图
Date Created: 2018-02-12
Author: HUI
Description:
利用opencv实现简单绘图操作
--------------------------------------------------------------------------------
Modification History
DATE        NAME             DESCRIPTION
--------------------------------------------------------------------------------
YYYY-MM-DD

*******************************************************************************/


#include"stdafx.h"
#include<opencv2\opencv.hpp>
#include<opencv2\highgui.hpp>
using  namespace std;
using namespace cv;
#define SHAPE_LINE 1
#define SHAPE_ERASE 2
#define SHAPE_CIRCLE 0
bool drawing;
bool erasing;
int iOperateState;
Mat mWhite(Size(512, 512), CV_8UC3, Scalar(255, 255, 255));
Mat mWhiteCopy;
Rect Rerase ;
char select;
 Point pre_Point=Point(50,50);
 Point cur_Point=Point(0,0);
static Point Erase_RePoint_Start;
static Point Erase_RePoint_End;
/*****************************************************************************
函 数 名:onMouse
创建日期:2018.02.12
作    者:
函数描述:鼠标回调事件
输入参数: IN
IN
INOUT
输出参数: OUT
INOUT
返回值:
注意点:
------------------------------------------------------------------------------
修改历史
日期        姓名             描述
--------------------------------------------------------------------------
设计思路:

switch (鼠标事件)
{
case 左键按下:
{
if(状态是画线){ 记录起始点}
if(状态是画圆){ 记录圆的圆心}
if(状态是橡皮檫){定义一个小白色矩形,粘贴到原图片中 }
}
break;
case 左键移动:
{
if (左键按下)
{
if (状态是画线){复制一个原图片到临时图片,记录每次移动的点}
if (状态是画圆)
{
复制一个原图片到临时图片,记录每次移动的点
}
if (状态是橡皮檫)
{
在原始图片中每次移动的小矩形
}
}
break;
case 左键放开:
{
if (状态是画线) { 在原始图片中连线起始点与终点 }
if (状态是画圆) { 在原始图片中画出圆}
if (状态是橡皮檫) { 在原始图片中每次移动的小矩形 }
}
break;
}

default:
break;
}
*****************************************************************************/
 
void onMouse(int event, int x, int y, int flags, void *parame)
{
	Mat mWhiteCopy_temp;
	Mat mWhiteROI;
	mWhiteCopy.copyTo(mWhiteCopy_temp);
	switch(event)
	{ 
	 
	case CV_EVENT_LBUTTONDOWN:
	{
		if (drawing&&iOperateState == SHAPE_LINE)
		{
			pre_Point = Point(x, y);
		}

		if (drawing&&iOperateState == SHAPE_CIRCLE)
		{
			pre_Point = Point(x, y);
			circle(mWhiteCopy_temp,pre_Point,2,Scalar(0,0,0));
			imshow("绘图", mWhiteCopy);
		}
		if (erasing&&iOperateState == SHAPE_ERASE)
		{
			if (x>20&&y<532&&y>20&&y<532)
			{
				Rerase.x = x - 20; Rerase.y = y - 20;
				Rerase.width = 20; Rerase.height = 20;
				 mWhiteROI = mWhiteCopy(Rerase);
				mWhiteROI.setTo(Scalar(255, 255, 255));
				mWhiteROI.copyTo(mWhiteCopy(Rerase));
				imshow("绘图", mWhiteCopy);
			}
		}
	}
	break;
	case CV_EVENT_MOUSEMOVE: 
	{
		if(flags==CV_EVENT_FLAG_LBUTTON)
		{
			if (drawing&&iOperateState == SHAPE_LINE)
			{
				cur_Point = Point(x, y);
				line(mWhiteCopy_temp, pre_Point, cur_Point, Scalar(0, 0, 0));
				imshow("绘图", mWhiteCopy_temp);
			}
			if (drawing&&iOperateState == SHAPE_CIRCLE)
			{
				cur_Point = Point(x, y);
				double radius = (cur_Point.x - pre_Point.x) *(cur_Point.x - pre_Point.x) + (cur_Point.y - pre_Point.y) *(cur_Point.y - pre_Point.y);
				radius = sqrt(radius);
				circle(mWhiteCopy_temp, pre_Point, radius, Scalar(0, 255, 0));
				imshow("绘图", mWhiteCopy_temp);
			}
			if (erasing&&iOperateState == SHAPE_ERASE)
			{
				if (x > 20 && y < 532 && y>20 && y < 532)
				{
					Rerase.x = x - 20; Rerase.y = y - 20;
					Rerase.width = 20; Rerase.height = 20;
					Mat mWhiteROI = mWhiteCopy(Rerase);
					mWhiteROI.setTo(Scalar(255, 255, 255));
					mWhiteROI.copyTo(mWhiteCopy(Rerase));
					imshow("绘图", mWhiteCopy);
				}
			}
		}
	}
	break;
	case  CV_EVENT_LBUTTONUP:
	{
		if (drawing&&iOperateState == SHAPE_LINE)
		{
			cur_Point = Point(x, y);
			line(mWhiteCopy, pre_Point, cur_Point, Scalar(0, 0, 0));
			imshow("绘图", mWhiteCopy);
		}
		if (drawing&&iOperateState == SHAPE_CIRCLE)
		{
			cur_Point = Point(x, y);
			double radius = (cur_Point.x - pre_Point.x) *(cur_Point.x - pre_Point.x) + (cur_Point.y - pre_Point.y) *(cur_Point.y - pre_Point.y);
			radius = sqrt(radius);
			circle(mWhiteCopy, pre_Point, radius, Scalar(234, 255, 0));
			imshow("绘图", mWhiteCopy);
		}
		if (erasing&&iOperateState == SHAPE_ERASE)
		{


		}
	}
	break;
	}

}
/*****************************************************************************
函 数 名:主函数
创建日期:2018年02月12日
作    者:hui
函数描述:
输入参数: IN
IN
INOUT
输出参数: OUT
INOUT
返回值:
注意点:
------------------------------------------------------------------------------
修改历史
日期        姓名             描述
--------------------------------------------------------------------------
设计思路:
char selsct;
while (1)
{
switch (select)
{
case l:画线
case e:橡皮檫
case c:画圆
default:
break;
}
imshow();
//键盘输入事件
select = waitKey(0);
}

*****************************************************************************/
 
int main()
{
	mWhite.copyTo(mWhiteCopy);
	select='l';
	drawing = false;
	erasing = false;
	cout << "l----画线    c----画圆   e-----橡皮檫" << endl;
	namedWindow("绘图");
	while (1)
	{
		setMouseCallback("绘图", onMouse, 0);
		cout << "select:" << select << endl;
		switch (select)
		{
		case 'l':
		{
			drawing = true;
			erasing = false;
			iOperateState = SHAPE_LINE;
			break;
		}
		case 'e':
		{
			erasing = true;
			drawing = false;
			iOperateState = SHAPE_ERASE;
			break;
		}
		case 'c':
		{
			drawing = true;
			erasing = false;
			iOperateState = SHAPE_CIRCLE;
			break;

		}
		
		default:
			break;
		}
		 
		imshow("绘图", mWhiteCopy);
		select = waitKey(0);
	}
	return 0;
}
 

opencv文档官方地址:

https://docs.opencv.org/trunk/dd/d3f/structCvStereoBMState.html#a65ba70be5d89b6fe99e8c93545f7e3e3

参考博客:

1、http://blog.csdn.net/zmdsjtu/article/details/55504228

2、http://blog.csdn.net/guduruyu/article/details/72843368



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值