OpenCV教程——鼠标操作与响应、图像像素类型转换与归一化、图像几何变换、视频读写处理

825 阅读4分钟

鼠标操作与响应

setMouseCallback(winname, callback, userdata) winname是窗口的名宇,callback是回调函数,userdata是给回调函数的參数. callback(event, x, y. flags, userdata)回调函数必须包含这5个公数,event是事件(鼠标移动,左键,右键)x,y是点鼠标的坐标点,flags主要用于组合键 userdata就是上面的setMouseCallback的userdata

鼠标事件: EVENT_LBUTTONDBLCLK = 7 左键双击 EVENT_LBUTTONDOWN = 1 左键点击 EVENT_LBUTTONUP = 4 左键释放 EVENT_MBUTTONDBLCLK = 9 中间释放 EVENT_MBUTTONDOWN = 3 中间点击 EVENT_MBUTTONUP = 6 中间释放 EVENT_MOUSEHWHEEL = 11 滚轮事件 EVENT_MOUSEMOVE = 0 滑动 EVENT_MOUSEWHEEL = 10 滚轮事件 EVENT_RBUTTONDBLCLK = 8 右键双击 EVENT_RBUTTONDOWN = 2 右键点击 EVENT_RBUTTONUP = 5 右键释放

flags: EVENT_FLAG_ALTKEY = 32 按Alt不放事件 EVENT_FLAG_CTRLKEY = 8 按Ctrl不放事件 EVENT_FLAG_LBUTTON = 1 左键拖拽 EVENT_FLAG_MBUTTON = 4 中键拖拽 EVENT_FLAG_RBUTTON = 2 右键拖拽 EVENT_FLAG_SHIFTKEY = 16 按Shift不放事件

附上一段代码,在窗口上进行鼠标操作打印事件参数:

#opencv控制鼠标
 
import cv2
import numpy as np
 
#定义回调函数,函数名称可以随便取,但是参数必须是5个
#event 表示鼠标事件,x,y是鼠标的坐标  #flags 鼠标的组合按键
def mouse_callback(event,x,y,flags,userdata):
    print(event,x,y,flags,userdata)
    #点击鼠标右键退出窗口
    if event==2:
        cv2.destroyAllWindows()
        
 
    
#创建窗口
cv2.namedWindow('mouse',cv2.WINDOW_NORMAL)
#640是宽度(列数),340是高度(行数)
cv2.resizeWindow('mouse',640,340)
 
#设置鼠标的回调函数
cv2.setMouseCallback('mouse',mouse_callback,'123')
 
#生成全黑的照片
#640是列数,340是行数 所以这里反过来了
#uint8 取值为0到255
img=np.zeros((360,640,3),np.uint8)
while True:
    cv2.imshow('mouse',img)
    key=cv2.waitKey(1)
    if key==ord('q'):
        break
 
cv2.destroyAllWindows()

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

什么是归一化

概念一:归一化是把需要处理的数据通过某种算法处理后限制在所需要的一定范围内。

概念二:归一化是指在处理数据的过程中,把数据范围相差较大的数据进行标准化处理,让所有的数据都处于同一个数量级中。

为什么要归一化

首先,归一化是 为了后面数据处理的方便,其次是保证程序运行时收敛加快。归一化的具体作用是归纳统一样本的统计分布性。归一化在0-1之间是统计的概率分布,归一化在某个区间上是统计的坐标分布。

归一化的目的,是使得没有可比性的数据变得具有可比性,同时又保持相比较的两个数据之间的相对关系,如大小关系;或是为了作图,原来很难在一张图上作出来,归一化后就可以很方便的给出图上的相对位置等。

归一化的方法

最常用的就是 NORM_MINMAX 归一化方法。

def norm_demo():
    image = cv2.imread('test.jpg')
    cv2.imshow('image', image)
    img_f32 = np.float32(image)
    cv2.normalize(img_f32, img_f32, 1, 0, cv2.NORM_MINMAX)
    cv2.imshow('norm-image', img_f32)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

图像几何变换

几何变换是指改变图像的几何结构,例如大小、角度和形状等,让图像呈现出缩放、翻转、映射和透视效果。

缩放

import cv2

img = cv2.imread("logo.jpg")
dst1 = cv2.resize(img,(100,100))  # 按照宽100像素、高100像素的大小进行缩小
dst2 = cv2.resize(img,(400,400))  # 按照宽400像素、高400像素的大小进行缩小
cv2.imshow("img",img)
cv2.imshow("dst1",dst1)
cv2.imshow("dst2",dst2)
cv2.waitKey()

翻转

import cv2

img = cv2.imread("logo.jpg")
dst1 = cv2.flip(img,0)  # 沿X轴翻转
dst2 = cv2.flip(img,1)  # 沿Y轴翻转
dst3 = cv2.flip(img,-1)  # 同时沿X轴、Y轴翻转
cv2.imshow("1",img)
cv2.imshow("2",dst1)
cv2.imshow("3",dst2)
cv2.imshow("4",dst3)
cv2.waitKey()

平移

import cv2
import numpy as np

img = cv2.imread("logo.jpg")
rows = len(img)
cols = len(img[0])
M = np.float32([[1,0,50],[0,1,100]])
dst = cv2.warpAffine(img,M,(cols,rows))
cv2.imshow("1",img)
cv2.imshow("2",dst)
cv2.waitKey()

旋转

import cv2

img = cv2.imread("logo.jpg")
rows = len(img)
cols = len(img[0])
center = (rows/2,cols/2)
M = cv2.getRotationMatrix2D(center,30,0.8)
dst = cv2.warpAffine(img,M,(cols,rows))
cv2.imshow("1",img)
cv2.imshow("2",dst)
cv2.waitKey()

倾斜

import cv2
import numpy as np

img = cv2.imread("logo.jpg")
rows = len(img)
cols = len(img[0])
p1 = np.zeros((3,2),np.float32)
p1[0] = [0,0]
p1[1] = [cols-1,0]
p1[2] = [0,rows-1]
p2 = np.zeros((3,2),np.float32)
p2[0] = [50,0]
p2[1] = [cols-1,0]
p2[2] = [0,rows-1]
M = cv2.getAffineTransform(p1,p2)
dst = cv2.warpAffine(img,M,(cols,rows))
cv2.imshow("1",img)
cv2.imshow("2",dst)
cv2.waitKey()

视频读写处理

视频处理

视频是由一系列图像构成的,这一系列图像被称为帧,帧是以固定的时间间隔从视频中获取的。

获取(播放)帧的速度称为帧速率,其单位通常使用“帧/秒”表示,代表在1秒内所出现的帧数,对应的英文是FPS(Frames Per Second)。

如果从视频中提取出独立的帧,就可以使用图像处理的方法对其进行处理,达到处理视频的目的。

OpenCV提供了cv2.VideoCapture类和cv2.VideoWriter类来支持各种类型的视频文件。

在不同的操作系统中,它们支持的文件类型可能有所不同,但是在各种操作系统中均支持AVI格式的视频文件。

VideoCapture类

cv2.VideoCapture类处理视频的方式非常简单、快捷,而且它既能处理视频文件又能处理摄像头信息。

类函数介绍

cv2.VideoCapture类的常用函数包括初始化、打开、帧捕获、释放、属性设置等