/*******************************************************************************
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