core模块定义了opencv中的基础数据结构和基础运算,是整个库的核心模块。而mat数据结构是opencv中最重要的数据结构,是opencv中图像最常用的存储格式。
1 基本数据结构
opencv的基本数据结构有mat数据结构,point数据结构,rect数据结构,size数据结构。
1)在python中,mat类型的对象构造操作可以通过numpy来实现(创建图像矩阵)
如下代码构建全0矩阵m1,然后将所有值初始化为128,还可以用copy进行矩阵拷贝,也可以对图像数据的部分原始值进行修改。
import cv2 import numpy as np #python中,mat类型的对象通过numpy来实现 m1 = np.zeros([512,512],np.uint8) #创建全0二维矩阵 m1[:] = 128 #初始化赋值 m2 = m1.copy() #把m1图像拷贝到m2 m2[128:384,128:384] = 0 #将行,列为128到384的区域像素值赋值为0 cv2.imshow('m2',m2) cv2.imshow('m1',m1) cv2.waitKey(0) cv2.destroyAllWindows()
可以对图像矩阵进行裁剪和缩放,裁剪直接用python的切片来完成,缩放可以用opencv的 resize() 函数来操作。resize函数介绍如下:
cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]]) -> dst
参数说明:
src:原图像;dst:改变大小的目标图像;dsize:输出图像的大小。
fx:width方向的缩放比例;fy:height方向的缩放比例;
interpolation:指定插值的方式,图像resize之后,像素要重新计算,靠这个参数来指定重新计算像素的方式,有以下几种:
INTER_NEAREST - 最邻近插值
INTER_LINEAR - 双线性插值,如果最后一个参数你不指定,默认使用这种方法
INTER_AREA -区域插值
INTER_CUBIC - 4x4像素邻域内的双立方插值
INTER_LANCZOS4 - 8x8像素邻域内的Lanczos插值
有两点需要注意:1 dsize和fx/fy不能同时为0。指定dsize的值,让fx和fy直接省略或置0 或者 dsize=None或置 (0,0),指定fx和fy的值,(dsize不可省略,会报错)。2 图像的size是(h,w),而
resize的操作是先w,再h。
import cv2 #图像裁剪和缩放 import numpy as np img = cv2.imread('cat.jpg') cv2.imshow('cat',img) rows = img.shape[0] #图像的行(高) [h,w,c] cols = img.shape[1] #图像的列(宽) img2 = img.copy() #把img1图像拷贝到img2 img2 = cv2.resize(img2,(int(cols/2),int(rows/2))) #图像尺寸减小为原来的一半,不是裁剪 [w,h] cv2.imshow('img2',img2) img3 = img[0:int(rows/2),0:int(cols/2)] #图像裁剪为原来的1/4,用切片来裁剪,cropped_image = img[80:280, 150:330] 切片img[高,宽] cv2.imshow('img3',img3) cv2.waitKey(0) cv2.destroyAllWindows()
2)在opencv中,点的定义由point类实现。python语言中,point类型可以由tuple元组表示,然后利用numpy进行点乘和叉乘计算。
import numpy as np #tuple元组点乘叉乘(向量内积/外积) point1 = (10,20) point2 = (2,4) print(type(point1)) #tuple(元组,有序且不可更改的集合)类型, # 元组与列表相似,不同之处在于元组的元素不能修改,而列表的元素可以修改。元组使用小括号(),列表使用中括号[]。 res1 = np.dot(point1,point2) #点乘 print('res1',res1) point3 = (1,2,3) point4 = (4,5,6) res2 = np.cross(point3,point4) #叉乘,输出一个向量,方向垂直于输入两向量形成的平面 print('res2',res2)
3)opencv中定义了矩形的表示类rect,模板类rect定义了顶点坐标,宽高,面积等信息的获取操作,以及矩形是否包含点的判断操作。在python中的rect也是通过tuple类型的数据表示,即左上角坐标点(x,y)和矩形宽高4个值表示的rect为(x,y,w,h)的形式,在需要传入rect数据类型的地方,可以按照tuple类型的数据传入。
4)opencv的很多函数中都需要传入size类型的参数,比如mat类的后置函数为mat(Size size,int type),需要通过size类型对象传入构造矩阵的尺寸。size类型对象包含两个成员变量width和height。python中的size对象也是通过tuple类型的数据表示,即 (w,h) 的形式传入宽高数据的,在需要传入size数据类型的地方,可以按照tuple类型的数据传入。
2 矩阵运算
core模块中提供了图像矩阵的基本运算,opencv对这些基本运算都做了封装,比如四则运算,位运算,比较运算等。
- opencv-python 模块 核心 opencv pythonopencv-python模块 核心opencv opencv-python模块 图像opencv 图像处理opencv-python模块 图像 python-opencv模块 核心python opencv-python opencv-python opencv python opencv-python opencv python cv2 python opencv-python exception opencv opencv-python opencv python视频 opencv-python python_pip install python