OpenCV-Python鼠标绘制矩形框和像素归一化

重磅干货,第一时间送达

鼠标绘制矩形框

之前有说到使用opencv绘制几何图形,但那些都是固定地给出坐标绘制固定位置的形状。有时需要鼠标在任何位置绘制几何形状,下面就来看看如何使用鼠标响应函数在图像的不同位置绘制几何形状。

首先需要了解的是鼠标响应函数cv.setMouseCallback(windowName, onMouse, param=None)

  • windowName: 窗口的名字;
  • onMouse: 鼠标响应函数,回调函数;
  • param: 传给回调函数的参数。

最重要的是第2个参数,所有操作都是鼠标回调函数完成,例如本例的画矩形框。

回调函数的统一格式:遵循以下函数原型

on_mouse(event, x, y, flags, param)

上述on_mouse可以是任意名称,其他参数说明如下:

  • event是 CV_EVENT_* 变量之一,CV_EVENT 见下表;
  • xy是鼠标在图像坐标系的坐标(不是窗口坐标系);
  • flags是 CV_EVENT_FLAG 的组合;
  • param是用户定义的传递到setMouseCallback函数调用的参数。

鼠标事件的类型可通过如下代码获取:

import cv2events = [i for i in dir(cv2) if 'EVENT' in i]print(events)

返回类型结果:

['EVENT_FLAG_ALTKEY', 'EVENT_FLAG_CTRLKEY', 'EVENT_FLAG_LBUTTON', 'EVENT_FLAG_MBUTTON', 'EVENT_FLAG_RBUTTON',
'EVENT_FLAG_SHIFTKEY', 'EVENT_LBUTTONDBLCLK', 'EVENT_LBUTTONDOWN',
'EVENT_LBUTTONUP', 'EVENT_MBUTTONDBLCLK', 'EVENT_MBUTTONDOWN', 'EVENT_MBUTTONUP', 'EVENT_MOUSEHWHEEL',
'EVENT_MOUSEMOVE', 'EVENT_MOUSEWHEEL', 'EVENT_RBUTTONDBLCLK', 'EVENT_RBUTTONDOWN', 'EVENT_RBUTTONUP']

event具体说明

事件 代号 说明
EVENT_MOUSEMOVE 0 滑动
EVENT_LBUTTONDOWN 1 左键点击
EVENT_RBUTTONDOWN 2 右键点击
EVENT_MBUTTONDOWN 3 中键点击
EVENT_LBUTTONUP 4 左键放开
EVENT_RBUTTONUP 5 右键放开
EVENT_MBUTTONUP 6 中键放开
EVENT_LBUTTONDBLCLK 7 左键双击
EVENT_RBUTTONDBLCLK 8 右键双击
EVENT_MBUTTONDBLCLK 9 中键双击

flags具体说明

falgs 代号 说明
EVENT_FLAG_LBUTTON 1 左键拖曳
EVENT_FLAG_RBUTTON 2 右键拖曳
EVENT_FLAG_MBUTTON 4 中键拖曳
EVENT_FLAG_CTRLKEY 8~15 按 Ctrl 不放
EVENT_FLAG_SHIFTKEY 16~31 按 Shift 不放
EVENT_FLAG_ALTKEY 32~39 按 Alt 不放

实例:使用鼠标响应函数在一张图像上画出人脸区域。可以应用于目标检测中标注图片或者是截取图像ROI区域。

# -*-coding:utf-8-*-'''File Name: mouse_response_and_type_conversion.pyProgram IDE: PyCharmDate: 10:04Create File By Author: Hong'''import cv2 as cvimport numpy as np

# 在图像上画矩形框x1 = -1y1 = -1x2 = -1y2 = -1

# canvas = np.zeros((300, 300, 3), dtype=np.uint8)canvas = cv.imread('images/2.png', cv.IMREAD_COLOR)img = np.copy(canvas)

# 回调,系统调用回调函数解决你的问题# 鼠标响应回调函数,参数固定;对应鼠标事件、横坐标、纵坐标、flags和其他参数def mouse_drawing(event, x, y, flags, param):    # print(x, y)    global x1, y1, x2, y2    if event == cv.EVENT_LBUTTONDOWN:        x1 = x        y1 = y    if event == cv.EVENT_MOUSEMOVE:        if x1 < 0 or y1 < 0:            return        x2 = x        y2 = y        dx = x2 - x1        dy = y2 - y1        if dx > 0 and dy > 0:            # 擦除重叠            # canvas[:, :] = 0            canvas[:, :, :] = img[:, :, :]            cv.rectangle(canvas, (x1, y1), (x2, y2), (255, 0, 0), 2, 8, 0)    if event == cv.EVENT_LBUTTONUP:        x2 = x        y2 = y        dx = x2 - x1        dy = y2 - y1        if dx > 0 and dy > 0:            # canvas[:, :] = 0            canvas[:, :, :] = img[:, :, :]            cv.rectangle(canvas, (x1, y1), (x2, y2), (255, 0, 0), 2, 8, 0)

        x1 = -1        y1 = -1        x2 = -1        y2 = -1

def mouse_response():    cv.namedWindow('Mouse Response', cv.WINDOW_AUTOSIZE)    # 再某个窗口上设置鼠标响应函数    cv.setMouseCallback('Mouse Response', mouse_drawing)

    while True:        cv.imshow('Mouse Response', canvas)        c = cv.waitKey(1)        if c == 27:            break

    cv.destroyAllWindows()

if __name__ == '__main__':    mouse_response()

效果展示:

画出人脸区域

图像像素类型转换和归一化

类型转换使用numpy数据格式转换,常见类型转换如下:

  • np.uint8(): 转换为无符号8位整型数;
  • np.float32(): 转换为32位浮点数;
  • np.float64(): 转换为64位浮点数。

图像归一化的两种方式:

  1. image/255.0: 将图像像素归一化到(0~1)
  2. cv.normalize(src, dst, alpha=None, beta=None, norm_type=None, dtype=None, mask=None): 归一化函数,参数说明如下:
    src: 输入矩阵
    dst: 输出矩阵, 与输入矩阵形状相同
    alpha: 如果norm_type为NORM_MINMAX ,则alpha为最小值或最大值;如果norm_type为其他类型,则为归一化要乘的系数
    beta: 如果norm_type为NORM_MINMAX ,则beta为最小值或最大值;如果norm_type为其他类型,beta被忽略,此处不会被用到,一般传入0
    norm_type: 归一化类型,常见的有NORM_L1, NORM_L2, NORM_INF, NORM_MINMAX
    dtype: 如果取负值时,dst与src同样的类型;否则,dst和src有同样的通道数,且此时图像深度为CV_MAT_DEPTH(dtype)
    mask: 可选操作掩膜

具体实现代码:

# -*-coding:utf-8-*-
'''
File Name: mouse_response_and_type_conversion.py
Program IDE: PyCharm
Date: 10:04
Create File By Author: Hong
'''
import cv2 as cv
import numpy as np

# 图像像素类型转换和归一化
def pixel_normalization(image_path: str):
    img = cv.imread(image_path, cv.IMREAD_COLOR)
    # 可以显示整数和浮点数像素图片
    # 图像归一化
    # 方法1
    # print(img/255.0)
    cv.imshow('input', img / 255.0)

# 方法2
    result = np.zeros_like(np.float32(img))
    cv.normalize(img, result, 0, 1, cv.NORM_MINMAX, dtype=cv.CV_32F)
    print(result)
    cv.imshow('result', result)

cv.waitKey(0)
    cv.destroyAllWindows()

if __name__ == '__main__':
    path = 'images/2.png'
    pixel_normalization(path)

结果展示:

图像归一化

·END·

(0)

相关推荐

  • 用Excel仿真---运营与供应管理(19)

    上期我们讨论了仿真的步骤.今天我们说说怎么用Excel搭建仿真基础~ 为什么Excel中可以实现仿真?? 1.变量和参数 这个是根据每个项目不同的情况而设定,没有普遍适用性,所以我不讲. 2.决策的规 ...

  • Python进阶——OpenCV之GUI

    文章目录 图像处理(Getting Started with Images) 读取图像 显示图像 保存图像 使用Matplotlib 视频处理(Getting Started with Videos) ...

  • 支持向量机(SVM)的约束和无约束优化、理论和实现

    优化是机器学习领域最有趣的主题之一.我们日常生活中遇到的大多数问题都是通过数值优化方法解决的.在这篇文章中,让我们研究一些基本的数值优化算法,以找到任意给定函数(这对于凸函数最有效)的局部最优解.让我 ...

  • Python 实现图片转字符画,静态图、GIF 都能转

    来源:Python 技术「ID: pythonall」 字符画是一种由字母.标点或其他字符组成的图画,它产生于互联网时代,在聊天软件中使用较多,本文我们看一下如何将自己喜欢的图片转成字符画. 静态图片 ...

  • Python numpy中矩阵的基本用法汇总

    Python矩阵的基本用法 mat()函数将目标数据的类型转化成矩阵(matrix) 1,mat()函数和array()函数的区别 Numpy函数库中存在两种不同的数据类型(矩阵matrix和数组ar ...

  • 如何使用OpenCV实现图像均衡???

    重磅干货,第一时间送达 我们已经练习了很多图像处理--操作图像(精确地说是图像矩阵).为此,我们探索了图像的均衡方法,以便在一定程度上增强对比度,以使被处理的图像看起来比原始图像更好,这种技术称为直方 ...

  • 【从零学习OpenCV 4】直方图归一化

    重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<从零学习OpenCV 4>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通 ...

  • 基于OpenCV的图像阴影去除

    重磅干货,第一时间送达 我们经常需要通过扫描将纸上的全部内容转换为图像.有很多在线工具可以提高图像的亮度,或者消除图像中的阴影.但是我们可以手动删除阴影吗?当然可以,我们只需要将图像加载到相应的代码中 ...

  • OpenCV-Python学习教程.2

    如果你用Linux得设备,可能会用到这里来看有没有设备被安全挂载.因为没有一个图形化的页面来方便的查看. 子Linux不是太好使 # 获取视频帧的宽w = fcap.get(cv2.CAP_PROP_ ...

  • 基于OpenCV实战:绘制图像轮廓(附代码)

    重磅干货,第一时间送达 山区和地形图中海拔高的区域划出的线称为地形轮廓,它们提供了地形的高程图.这些线条可以手动绘制,也可以由计算机生成.在本文中,我们将看到如何使用OpenCV在简单图像上绘制轮廓线 ...

  • Python提取 “Excel文本框” 内容,这个需求头一次见,1000个表,10行代码!

    前天 本文介绍 说实话,这个需求头一次碰到,我相信对于大多数朋友来说,也是头一次碰到."提取excel文本框中的内容",对,你没有听错!我也不知道你碰到过没有,但是这确实是一位朋友 ...

  • 趣玩 Python 之绘制基本图形

    Python中的类库极其丰富,数据科学中经常会用到可视化技术.今天我们来一学习一下Python中基本图形的绘制方法,本文我们将主要基于turtle(小乌龟)库来画图~ 为了方便后面进行交互性演示,这里 ...

  • 有人说Python是青铜?我用50行Python代码绘制3D机场分布图

    原创 菜鸟哥 菜鸟学Python 2020-03-23 绘制一款的3D图形,不仅可以直观的展示数据分析的结果,也更方便数据化运营,同时也让工作成果更容易被大众理解.本文就基于python绘制一款基础的 ...

  • Python matplotlib绘制图形,包括点、曲线、注释和箭头

    Python的matplotlib模块绘制图形功能很强大,今天就用pyplot绘制一个简单的图形,图形中包括曲线.曲线上的点.注释和指向点的箭头. 1. 结果预览: 2. 代码如下: from mat ...

  • opencv python实现图像匹配

    '''基于FLANN的匹配器(FLANN based Matcher)1.FLANN代表近似最近邻居的快速库.它代表一组经过优化的算法,用于大数据集中的快速最近邻搜索以及高维特征.2.对于大型数据集, ...

  • word文本选择方法视频:连续选择段落文本及矩形框选文本

    word文本选择方法视频|word选择连续文本视频|word选择段落文本视频|word矩形框选文本视频 本视频教程由部落窝教育分享.

  • 【从零学习OpenCV 4】绘制几何图形

    重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<从零学习OpenCV 4>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通 ...

  • 【从零学习OpenCV 4】两图像间的像素操作

    重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<从零学习OpenCV 4>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通 ...