OpenCV的基本操作
OpenCV数据存取
opencv支持各种类型与格式的图像数据,读取方式非常简单,使用imread函数即可,该函数有两个参数,第一个参数path指图片路径,第二个参数flag表示读取方式,默认值为从v.IMREAD_COLOR,默认读取彩色图片,可选值为cv2.IMREAD_GRAYSCALE和cv2.IMREAD_UNCHANGED默认颜色空间是BGR而非常用的FGB。
import cv2 img=cv2.imread('F:\Image\\test1.jpg',cv2.IMREAD_COLOR) cv2.imshow('图片名字',img) cv2.waitKey(0) #保存图片 cv2.imwrite('图片文件.png',img) #第一个参数是保存图片文件的名字,第二个是后缀
OpenCV图像缩放
当数据集的图像大小不一样时,我们就需要用到图像缩放,使所有的图片大小保持一致,函数时cv2.resize(),第一个参数是目标图像,第二个参数是缩减比例。
import cv2 import numpy as np #读取图片 img=cv2.imread('F:\Image\\test2.jpg',cv2.IMREAD_COLOR) cv2.imshow('原有的图片',img) #进行缩放 img=cv2.resize(img,(1000,1000)) #比例放缩1000:1000 #显示图片 cv2.imshow('图片缩放',img) cv2.waitKey(0)
OpenCV图像裁剪
普通图像的裁剪非常简单,由于读取的图像存储方式时矩阵,所以我们只需取矩阵的一部分就完成了裁剪。
import numpy as np import cv2 img=cv2.imread('F:\Image\\test3.jpg',cv2.IMREAD_COLOR) cv2.imshow('裁剪前',img) patch=img[0:50,0:50] #取左上角50x50小块 cv2.imshow('裁剪过后的图片',patch) cv2.waitKey(0) 当然,虽然我们不知道图片的大小,所以裁剪的时候很麻烦,这时我们就可以随机裁剪,l利用random模块: import numpy as np import cv2 import random img=cv2.imread('F:\Image\\test3.jpg',cv2.IMREAD_COLOR) #得到图像形状 w,h,d=img.shape cv2.imshow('裁剪前',img) x=random.randint(0,w) y=random.randint(0,h) patch=img[x:w,y:h] #取左上角50x50小块 cv2.imshow('裁剪过后的图片',patch) cv2.waitKey(0)
OpenCV图像旋转
图像旋转也是重要的操作,当图像的方向为非水平方向时,就需要通过旋转成水平方向。
在OpenCV中,图像旋转有两种实现方式:
第一种主要通过仿射变换,所用函数为cv2.warpAffine(),此函数有三个参数:分别为需要旋转的图像,仿射变换矩阵,以及输出图像的大小。
仿射变换,也称仿射映射,是指一个向量空间通过一次线性变换后,变为另一个空间。可以用如下公式表示:
其中矩阵A表示旋转与缩放,向量b表示平移。
(1)旋转变换,顺时针旋转
(2)缩放变换,水平方向为a倍,竖直方向变为b倍。
代码展示:
import numpy as np import cv2 img=cv2.imread('F:\Image\\test4.jpg',cv2.IMREAD_COLOR) w,h,d=img.shape #放射变换矩阵 M=np.array([[0,0.5,-10],[0.5,0,0]]) #旋转图片 img1=cv2.warpAffine(img,M,(w,h)) #显示图片 cv2.imshow('图片旋转',img) cv2.waitKey(0)
第二种使用OpenCV内置函数,所用的函数为cv2.getRotationMatrix2D(),此函数共三个参数,分别为图片旋转中心,逆时针旋转角度,以及缩放的倍数。和裁剪一样,这里也可以使用random()实现随机选择和平移功能。
import numpy as np import cv2 img=cv2.imread('F:\Image\\test4.jpg',cv2.IMREAD_COLOR) img1=cv2.getRotationMatrix2D((1,1),90,1) cv2.imshow('图片旋转',img1) cv2.waitKey(0)
从摄像头读取
OpenCV不仅能对图像进行处理,还能对视频进行处理,我们也可以直接调用摄像头进行计算机获取视频。函数是cv2.VideoCapture()函数,此函数只有一个参数,0为计算机摄像头,1为其他来源。
import cv2 import numpy as np capture=cv2.VideoCapture(0) while(True): #读取一帧 ret,frame=capture.read() #显示一帧 cv2.imshow('capture',frame) #关闭摄像头 capture.release()
读取视频后,可以用cv2.VideoWriter()函数创建视频保存器即可。和读取的时候一样,也需要一帧一帧的保存,使用从cv2.putText()函数,可选参数为帧名称,帧标题,标题位于左上角坐标,字体,字体大小,颜色,字体粗细。
#从摄像头读取并保存录像 import cv2 import numpy as np #创建摄像头 capture=cv2.VideoCapture(0) #帧率 fps=60 #保存格式(mp4) fourcc=cv2.VideoWriter_fourcc(*'mp4v') #创建保存器 vout=cv2.VideoWriter() vout.open('F:\Image\\temp.mp4',fourcc,fps,(1280,720),True) #读取一帧并保存 for i in range(100): _,frame=capture.read() cv2.putText(frame,str(i),(10,20),cv2.FONT_HERSHEY_PLAIN,1,(0,255,0),1,cv2.LINE_AA) vout.write(frame) #释放资源 vout.release() capture.release()
这样,就可以实现对摄像头的调用。你就可以知道谁打开了你的电脑。
矩阵操作
add 矩阵加法,A+B的更高级形式,支持mask scaleAdd 矩阵加法,一个带有缩放因子dst(I) = scale * src1(I) + src2(I) addWeighted 矩阵加法,两个带有缩放因子dst(I) = saturate(src1(I) * alpha + src2(I) * beta + gamma) subtract 矩阵减法,A-B的更高级形式,支持mask multiply 矩阵逐元素乘法,同Mat::mul()函数,与A*B区别,支持mask gemm 一个广义的矩阵乘法操作 divide 矩阵逐元素除法,与A/B区别,支持mask abs 对每个元素求绝对值 absdiff 两个矩阵的差的绝对值 exp 求每个矩阵元素 src(I) 的自然数 e 的 src(I) 次幂 dst[I] = esrc(I) pow 求每个矩阵元素 src(I) 的 p 次幂 dst[I] = src(I)p log 求每个矩阵元素的自然数底 dst[I] = log|src(I)| (if src != 0) sqrt 求每个矩阵元素的平方根 min, max 求每个元素的最小值或最大值返回这个矩阵 dst(I) = min(src1(I), src2(I)), max同 minMaxLoc 定位矩阵中最小值、最大值的位置 compare 返回逐个元素比较结果的矩阵 bitwise_and, bitwise_not, bitwise_or, bitwise_xor 每个元素进行位运算,分别是和、非、或、异或 cvarrToMat 旧版数据CvMat,IplImage,CvMatND转换到新版数据Mat extractImageCOI 从旧版数据中提取指定的通道矩阵给新版数据Mat randu 以Uniform分布产生随机数填充矩阵,同 RNG::fill(mat, RNG::UNIFORM) randn 以Normal分布产生随机数填充矩阵,同 RNG::fill(mat, RNG::NORMAL) randShuffle 随机打乱一个一维向量的元素顺序 theRNG() 返回一个默认构造的RNG类的对象 theRNG()::fill(…) reduce 矩阵缩成向量 repeat 矩阵拷贝的时候指定按x/y方向重复 split 多通道矩阵分解成多个单通道矩阵 merge 多个单通道矩阵合成一个多通道矩阵 mixChannels 矩阵间通道拷贝,如Rgba[]到Rgb[]和Alpha[] sort, sortIdx 为矩阵的每行或每列元素排序 setIdentity 设置单元矩阵 completeSymm 矩阵上下三角拷贝 inRange 检查元素的取值范围是否在另两个矩阵的元素取值之间,返回验证矩阵 checkRange 检查矩阵的每个元素的取值是否在最小值与最大值之间,返回验证结果bool sum 求矩阵的元素和 mean 求均值 meanStdDev 均值和标准差 countNonZero 统计非零值个数 cartToPolar, polarToCart 笛卡尔坐标与极坐标之间的转换 flip 矩阵翻转 transpose 矩阵转置,比较 Mat::t() AT trace 矩阵的迹 determinant 行列式 |A|, det(A) eigen 矩阵的特征值和特征向量 invert 矩阵的逆或者伪逆,比较 Mat::inv() magnitude 向量长度计算 dst(I) = sqrt(x(I)2 + y(I)2) Mahalanobis Mahalanobis距离计算 phase 相位计算,即两个向量之间的夹角 norm 求范数,1-范数、2-范数、无穷范数 normalize 标准化 mulTransposed 矩阵和它自己的转置相乘 AT * A, dst = scale(src - delta)T(src - delta) convertScaleAbs 先缩放元素再取绝对值,最后转换格式为8bit型 calcCovarMatrix 计算协方差阵 solve 求解1个或多个线性系统或者求解最小平方问题(least-squares problem) solveCubic 求解三次方程的根 solvePoly 求解多项式的实根和重根 dct, idct 正、逆离散余弦变换,idct同dct(src, dst, flags | DCT_INVERSE) dft, idft 正、逆离散傅立叶变换, idft同dft(src, dst, flags | DTF_INVERSE) LUT 查表变换 getOptimalDFTSize 返回一个优化过的DFT大小 mulSpecturms 两个傅立叶频谱间逐元素的乘法