今天我们要来点稍微高级的东西。在我们按下鼠标时可以画矩形,而我们按下键盘m键时,切换到画圆的模式,再按下m键,回到画矩形模式。

一起来写下代码,首先当然还是调用库

  1. import cv2
  2. import numpy as np

当我们按下鼠标左键时时,我们才开始画矩形,所以初始时默认是

  1. drawing=False

当鼠标左键按下时,drawing变量变为True,当鼠标左键抬起时又变回False,这个函数时控制画不画图的关键性变量

  1. mode=True

这里的mode变量控制着是画矩形,还是圆

我们要画一个封闭填充矩形的,前几张都有涉及,今天复习一下:线宽为-1,当线宽-1时表示封闭图形的颜色填充

所以可以这么写

  1. ix,iy=-1,-1

可以开始创建回调函数了

  1. def draw_circle(event,x,y,flags,param):
  2. global ix,iy,drawing,mode

global是python将变量定义为全局变量的函数,就是画矩形就那么画=。=

  1. if event==cv2.EVENT_LBUTTONDOWN:
  2. drawing=True
  3. ix,iy=x,y

这是当鼠标左键按下时,画矩形,ix,iy等于新的x,y

  1. elif event==cv2.EVENT_MOUSEMOVE and flags==cv2.EVENT_FLAG_LBUTTON:
  2. if drawing==True:

当不是上一中情况是,就是这种:鼠标移动时检查变量,flags代表拖拽事件,表示按住左键拖拽。(这是百度的)drawing=True时画矩形,

  1. if mode==True:
  2. cv2.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)

以后代码自己想想怎么写,原理都是一样的,主要就是mode和drawing两个变量,我已经讲述过了,复习一遍:

drawing默认为False,在鼠标左键为按下(及LBUTTONDOWN)的时候变成true,左键抬起(LBUTTONUP)就变成False。这个变量控制着画图还是不画图,当鼠标移动(及MOUSEMOVE)的时候检查这个变量的状态,只有为true才画图

mode这个变量控制着画出图形是矩形还是圆,在MOUSEMOVE时它为True画矩形,为False画圆。


下面上代码

# -*- coding:utf-8 -*-
"""
Created on Tue Jan 03 19:15:27 2017
@author: Y
"""
import cv2
import numpy as np

drawing=False

mode=True
ix,iy=-1,-1

def draw_circle(event,x,y,flags,param):
global ix,iy,drawing,mode

if event==cv2.EVENT_LBUTTONDOWN:
drawing=True
ix,iy=x,y
elif event==cv2.EVENT_MOUSEMOVE and flags==cv2.EVENT_FLAG_LBUTTON:
if drawing==True:

if mode==True:
cv2.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)

else:

cv2.circle(img,(x,y),3,(0,0,255),-1)

elif event==cv2.EVENT_LBUTTONUP:
drawing==False

img=np.zeros((512,512,3),np.uint8)

cv2.namedWindow('image')
cv2.setMouseCallback('image',draw_circle)

while(1):

cv2.imshow('image',img)

k=cv2.waitKey(1)&0xFF
if k==ord('m'):
mode=not mode
elif k==27:
break

画矩形(没有按m键)
按下m键后画圆,这个圆,就是一个个点,我不好说他是点,因为他有半径,我就不造作自己了。。。

祝大家新年快乐,

祝大家新年快乐!

大家新年快乐,近期更新可能会变慢,大家好好领悟前几章的东西,等一切准备就绪,就搞大的!

Opencv稍微高级点的鼠标事件-OpenCV步步精深的更多相关文章

  1. Opencv处理鼠标事件-OpenCV步步精深

    在图片上双击过的位置绘制一个 圆圈 鼠标事件就是和鼠标有关的,比如左键按下,左键松开,右键按下,右键松开,双击右键等等. 我们可以通过鼠标事件获得与鼠标对应的图片上的坐标.我们通过以下函数来调用查看所 ...

  2. Opencv函数setMouseCallback鼠标事件响应

    用户通过鼠标对图像视窗最常见的操作有: 1. 左键单击按下 2. 左键单击抬起 3. 左键按下拖动 4. 鼠标指针位置移动 单次单击操作响应事件及顺序 Opencv中setMouseCallback( ...

  3. opencv鼠标事件

    #include <opencv2\opencv.hpp> using namespace cv; struct mouse_para { cv::Mat org; cv::Mat img ...

  4. opencv入门系列教学(四)处理鼠标事件

    一.鼠标事件的简单演示 opencv中的鼠标事件,值得是任何与鼠标相关的任何事物,例如左键按下,左键按下,左键双击等.我们先来看看鼠标事件有哪些,在python中执行下面代码: import cv2 ...

  5. Opencv step by step - 鼠标事件

    鼠标事件有下面几种(没有滚轮事件,比较遗憾): #define CV_EVENT_MOUSEMOVE 0 滑动 #define CV_EVENT_LBUTTONDOWN 1 左键点击 #define ...

  6. Opencv下图像对鼠标事件的响应

    直接上代码: //////////////////////////////////////////////////////////////////////// // // 该程序从文件中读入一幅图像, ...

  7. 【OpenCV入门指南】第一篇 安装OpenCV

    http://blog.csdn.net/morewindows/article/details/8225783/ win10下vs2015配置Opencv3.1.0过程详解(转) http://ww ...

  8. OpenCV3添加滑动条和鼠标事件到图形界面

    鼠标事件和滑动条控制在计算机视觉和OpenCV中非常有用,使用这些控件,用户可以直接与图形界面交互,改变输入图像或者变量的属性值. /* In this section, we are going t ...

  9. python_Opencv_处理鼠标事件

    流程: 首先,创建一个鼠标事件回调函数,当鼠标事件发生时就会被执行. 鼠标事件可以是鼠标上的任何动作,比如左键按下,左键松开,左键双击等. 我们可以通过鼠标事件获得与鼠标对应的图片上的坐标. 根据这些 ...

随机推荐

  1. yum 快速LAMP/LNMP 安装(centos7+mysql5.7+apache+php5.6 (缺点:好多模块没有加载)

    1.安装Apache 安装centos7默认自带(Apache2.4.6)版本 yum -y install httpd 2.开启apache服务 systemctl start httpd.serv ...

  2. html 视频播放器

    html  视频播放器 <html> <script> /** *视频播放 *参数说明 u - 媒体URL w - 媒体宽度width h - 媒体高度height */ // ...

  3. 【转】java使用java.lang.management监视和管理 Java 虚拟机

    原文地址:https://blog.csdn.net/zhongweijian/article/details/7619383 软件包 java.lang.management 提供管理接口,用于监视 ...

  4. C++——extern

    1.当它与"C"一起连用时,如: extern "C" void fun(int a, int b);则告诉编译器在编译fun这个函数名时按着C的规则去翻译相应 ...

  5. URAL 1748 The Most Complex Number

    题目链接:https://vjudge.net/problem/11177 题目大意: 求小于等于 n 的最大反素数. 分析: n <= 10^18,而前20个素数的乘积早超过10^18,因此可 ...

  6. 什么是Web?

    Web这个词刚开始显得有些泛泛,似乎“冲浪”.“网上存在”以及“主页”等等都和它拉上了一些关系.甚至还有一种“Internet综合症”的说法,对许多人狂热的上网行为提出了质疑.我们在这里有必要作一些深 ...

  7. beforeEach的深入研究,及beforeEach和beforeRouteEnter区别?

    之前一直困惑它俩的区别,也没找到合适的文档,直到有天看到一篇博客,一起来学习下: 之前是在created钩子函数里面,发现这是在今天当前页面之后了.先回顾一下钩子函数beforeEach const ...

  8. spring Aop设计原理

    转载至:https://blog.csdn.net/luanlouis/article/details/51095702 0.前言 Spring 提供了AOP(Aspect Oriented Prog ...

  9. C static extern和全局变量

    #include <stdio.h> //默认全局变量为外部变量 int a; //当全局变量前面加上static时,该变量为内部变量 static int b; void test(); ...

  10. 二.Python基础语法和数据类型

    Python第二节 基础语法和数据类型 Python编码 python3默认情况下源码文件以UTF-8编码, 字符串均为unicode字符串.同时也可以通过# -*- coding: cp-1252 ...