Opencv稍微高级点的鼠标事件-OpenCV步步精深
今天我们要来点稍微高级的东西。在我们按下鼠标时可以画矩形,而我们按下键盘m键时,切换到画圆的模式,再按下m键,回到画矩形模式。
一起来写下代码,首先当然还是调用库
- import cv2
- import numpy as np
当我们按下鼠标左键时时,我们才开始画矩形,所以初始时默认是
- drawing=False
当鼠标左键按下时,drawing变量变为True,当鼠标左键抬起时又变回False,这个函数时控制画不画图的关键性变量
- mode=True
这里的mode变量控制着是画矩形,还是圆
我们要画一个封闭填充矩形的,前几张都有涉及,今天复习一下:线宽为-1,当线宽-1时表示封闭图形的颜色填充
所以可以这么写
- ix,iy=-1,-1
可以开始创建回调函数了
- def draw_circle(event,x,y,flags,param):
- global ix,iy,drawing,mode
global是python将变量定义为全局变量的函数,就是画矩形就那么画=。=
- if event==cv2.EVENT_LBUTTONDOWN:
- drawing=True
- ix,iy=x,y
这是当鼠标左键按下时,画矩形,ix,iy等于新的x,y
- elif event==cv2.EVENT_MOUSEMOVE and flags==cv2.EVENT_FLAG_LBUTTON:
- if drawing==True:
当不是上一中情况是,就是这种:鼠标移动时检查变量,flags代表拖拽事件,表示按住左键拖拽。(这是百度的)drawing=True时画矩形,
- if mode==True:
- 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步步精深的更多相关文章
- Opencv处理鼠标事件-OpenCV步步精深
在图片上双击过的位置绘制一个 圆圈 鼠标事件就是和鼠标有关的,比如左键按下,左键松开,右键按下,右键松开,双击右键等等. 我们可以通过鼠标事件获得与鼠标对应的图片上的坐标.我们通过以下函数来调用查看所 ...
- Opencv函数setMouseCallback鼠标事件响应
用户通过鼠标对图像视窗最常见的操作有: 1. 左键单击按下 2. 左键单击抬起 3. 左键按下拖动 4. 鼠标指针位置移动 单次单击操作响应事件及顺序 Opencv中setMouseCallback( ...
- opencv鼠标事件
#include <opencv2\opencv.hpp> using namespace cv; struct mouse_para { cv::Mat org; cv::Mat img ...
- opencv入门系列教学(四)处理鼠标事件
一.鼠标事件的简单演示 opencv中的鼠标事件,值得是任何与鼠标相关的任何事物,例如左键按下,左键按下,左键双击等.我们先来看看鼠标事件有哪些,在python中执行下面代码: import cv2 ...
- Opencv step by step - 鼠标事件
鼠标事件有下面几种(没有滚轮事件,比较遗憾): #define CV_EVENT_MOUSEMOVE 0 滑动 #define CV_EVENT_LBUTTONDOWN 1 左键点击 #define ...
- Opencv下图像对鼠标事件的响应
直接上代码: //////////////////////////////////////////////////////////////////////// // // 该程序从文件中读入一幅图像, ...
- 【OpenCV入门指南】第一篇 安装OpenCV
http://blog.csdn.net/morewindows/article/details/8225783/ win10下vs2015配置Opencv3.1.0过程详解(转) http://ww ...
- OpenCV3添加滑动条和鼠标事件到图形界面
鼠标事件和滑动条控制在计算机视觉和OpenCV中非常有用,使用这些控件,用户可以直接与图形界面交互,改变输入图像或者变量的属性值. /* In this section, we are going t ...
- python_Opencv_处理鼠标事件
流程: 首先,创建一个鼠标事件回调函数,当鼠标事件发生时就会被执行. 鼠标事件可以是鼠标上的任何动作,比如左键按下,左键松开,左键双击等. 我们可以通过鼠标事件获得与鼠标对应的图片上的坐标. 根据这些 ...
随机推荐
- vc/atlmfc/include/afx.h(24) : fatal error C1189: #error : Building MFC application with /MD[d] (CRT
环境:win7,64位,vs2012 1> c:/program files/microsoft visual studio 8/vc/atlmfc/include/afx.h(24) : fa ...
- C++——代码风格
google代码风格 1.使用安全的分配器(allocator),如scoped_ptr,scoped_array 2.测试用的,其他的不能用: 2.1 友元 2.2 C++异常 2.3 RTTI 3 ...
- 12、testng.xml指定运行测试包、测试类、测试方法
目录如下: TestFixture.java 代码如下: package com.testng.cn; import org.testng.annotations.*; public class Te ...
- 拾遗:vim 快捷键设置
~/.vimrc 零.批量注释与反注释 :sp / :vsp 横向 / 纵向拆分窗口 :e 打开新文件 zc:拆叠代码 / zo:展开代码 set foldmetho ...
- 剑指offer——75不用加减乘除做加法
题目描述 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 题解: 使用位运算 class Solution { public: int Add(int num1 ...
- Java控制台
Console类的目的是使Java程序和控制台之间的交互更容易.Console类是java.io包中的一个实用程序类,用于访问系统控制台.控制台不能保证在所有机器上的Java程序中可访问. 例如,如果 ...
- TortoiseGit密钥设置
需要用到TortoiseGit的puttykey generator工具来生成既适用于github的rsa密钥也适用于TortoiseGit的ppk密钥. 1. 安装完成TortoiseGit后 ...
- PHPExcel导出工作蒲(多表合并)教程+详细代码解读
最近做了一个需求,导出统计数据,因为需要同时导出多个不同的统计数据,所以不能像以往导出数据列表一样去实现这个需求,刚好空下来就记录一下(PHPExcel导出Excel多sheet合并) 一.主要使用的 ...
- 集合 HashMap 的原理,与 Hashtable、ConcurrentHashMap 的区别
一.HashMap 的原理 1.HashMap简介 简单来讲,HashMap底层是由数组+链表的形式实现,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的,如果定位到的数组位置不含链表 ...
- ArcGis EsriAddin加载项的安装路径与程序启动路径
安装路径: 在C:\Users\用户名\Documents\ArcGIS\AddIns\Desktop版本号\{…………一组GUID…………}这样的路径下. 例:C:\Users\Adminis ...