机器看世界(二)

简介: 机器看世界(二)

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(),此函数有三个参数:分别为需要旋转的图像,仿射变换矩阵,以及输出图像的大小。


仿射变换,也称仿射映射,是指一个向量空间通过一次线性变换后,变为另一个空间。可以用如下公式表示:


6c1d98da10ff82a324a139be52691b5.png


其中矩阵A表示旋转与缩放,向量b表示平移。


2749ad96107fe16532ae81c5a40d244.png


(1)旋转变换,顺时针旋转


0e92e77b13ec236dc6ad0973db562e6.png


(2)缩放变换,水平方向为a倍,竖直方向变为b倍。


cc3bc6b422b45c82ad050ec3788c9b9.png


代码展示:


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 两个傅立叶频谱间逐元素的乘法


相关文章
|
7月前
|
自然语言处理 自动驾驶 机器人
机器自动话
机器自动话
60 1
1266:【例9.10】机器分配 2021-01-15
1266:【例9.10】机器分配 2021-01-15
|
机器学习/深度学习 数据采集 算法
机器学习笔记
机器学习笔记
|
机器学习/深度学习 人工智能 监控
机器看世界(一)
机器看世界(一)
113 0
|
安全 数据安全/隐私保护 Python
Pystinger上线不出网机器
Pystinger上线不出网机器
392 0
|
机器学习/深度学习 算法 数据挖掘
机器为什么能学习|学习笔记
快速学习机器为什么能学习。
机器为什么能学习|学习笔记
|
机器学习/深度学习 算法 数据挖掘
机器为什么能学习
一、为何机器可以学习? 二、举例 三、机器学习跟数据挖掘的关系 四、总结
机器为什么能学习
|
数据库
LeetCode(数据库)- 每台机器的进程平均运行时间
LeetCode(数据库)- 每台机器的进程平均运行时间
600 0
LeetCode(数据库)- 每台机器的进程平均运行时间
|
机器学习/深度学习 人工智能 自然语言处理
机器阅读理解 VS 机器问题生成
机器阅读理解 VS 机器问题生成
|
网络协议 Linux
A机器与B机器网络connect成功后,断电时的网络状态?
A机器与B机器网络connect成功后,断电时的网络状态?
140 0