OpenCV是一个功能强大的开源计算机视觉和机器学习软件库,它在图像处理和视频分析领域得到了广泛应用。OpenCV最初由英特尔公司于1999年发起并支持,后来由Willow Garage和Itseez(现在是Intel的一部分)维护。它是为了推动机器视觉领域的实时应用而开发的。OpenCV提供了丰富的算法,包括但不限于图像处理、物体和特征检测、物体识别、3D重建等。这些算法经过优化,可以在多种硬件平台上高效运行。OpenCV被广泛应用于面部识别、物体识别、运动跟踪、机器人视觉以及许多其他的计算机视觉应用中。
OpenCV的优势:
OpenCV-Python是一个Python绑定库,解决计算机视觉问题。
OpenCV-Python继承了OpenCV的多平台、轻量级和高效的特点,为Python开发者提供了丰富的计算机视觉功能。以下是OpenCV-Python的一些详细介绍:
读取图像
cv.imread()
参数:
要读取的图像
读取方式的标志
cv.IMREAD*COLOR:以彩色模式加载图像,任何图像的透明度都将被忽略。这是默认参数。
cv.IMREAD*GRAYSCALE:以灰度模式加载图像
cv.IMREAD_UNCHANGED:包括alpha通道的加载图像模式。
import numpy as np
import cv2 as cv
img = cv.imread('QQ.jpg',0)
显示图像
cv.imshow()
保存图像
cv.imwrite()
保存的图像
cv.imwrite('messigray.png',img)
读取一张图片,将其转换为灰度图像,并显示出来:
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
img = cv.imread('messi5.jpg',0)
cv.imshow('image',img)
plt.imshow(img[:,:,::-1])
plt.title('匹配结果'), plt.xticks([]), plt.yticks([])
plt.show()
k = cv.waitKey(0)
cv.imwrite('messigray.png',img)
绘制直线
cv.line(img,start,end,color,thickness)
绘制圆形
cv.circle(img,centerpoint, r, color, thickness)
绘制矩形
cv.rectangle(img,leftupper,rightdown,color,thickness)
向图像中添加文字
cv.putText(img,text,station, font, fontsize,color,thickness,cv.LINE_AA)
实战:
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
img = np.zeros((512,512,3), np.uint8)
cv.line(img,(0,0),(511,511),(255,0,0),5)
cv.rectangle(img,(384,0),(510,128),(0,255,0),3)
cv.circle(img,(447,63), 63, (0,0,255), -1)
font = cv.FONT_HERSHEY_SIMPLEX
cv.putText(img,'OpenCV',(10,500), font, 4,(255,255,255),2,cv.LINE_AA)
plt.imshow(img[:,:,::-1])
plt.title('匹配'), plt.xticks([]), plt.yticks([])
plt.show()
图像缩放
cv2.resize(src,dsize,fx=0,fy=0,interpolation=cv2.INTER_LINEAR)
src : 输入图像
dsize: 绝对尺寸,直接指定调整后图像的大小
fx,fy: 相对尺寸,将dsize设置为None,然后将fx和fy设置为比例因子即可
interpolation:插值方法
import cv2 as cv
# 读取图片
img1 = cv.imread("dog.jpeg")
rows,cols = img1.shape[:2]
res = cv.resize(img1,(2*cols,2*rows),interpolation=cv.INTER_CUBIC)
res1 = cv.resize(img1,None,fx=0.5,fy=0.5)
cv.imshow("orignal",img1)
cv.imshow("enlarge",res)
cv.imshow("shrink)",res1)
cv.waitKey(0)
fig,axes=plt.subplots(nrows=1,ncols=3,figsize=(10,8),dpi=100)
axes[0].imshow(res[:,:,::-1])
axes[0].set_title("尺度)")
axes[1].imshow(img1[:,:,::-1])
axes[1].set_title("原图")
axes[2].imshow(res1[:,:,::-1])
axes[2].set_title("尺度")
plt.show()
图像平移
cv.warpAffine(img,M,dsize)
img: 输入图像
M: 2∗∗3移动矩阵
cv2.getRotationMatrix2D(center, angle, scale)
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
img = cv.imread("image.jpg")
# 图像旋转
rows,cols = img.shape[:2]
M = cv.getRotationMatrix2D((cols/2,rows/2),90,1)
# 旋转变换
dst = cv.warpAffine(img,M,(cols,rows))
fig,axes=plt.subplots(nrows=1,ncols=2,dpi=100)
axes[0].imshow(img1[:,:,::-1])
axes[0].set_title("原图")
axes[1].imshow(dst[:,:,::-1])
axes[1].set_title("旋转后")
plt.show()
仿射变换是线性变换与平移的组合,可以保持直线和平行线的性质。它将矩形映射为平行四边形,即变换后各边仍然平行。
图像的仿射变换涉及到图像的形状位置角度的变化,是深度学习预处理中常到的功能,仿射变换主要是对图像的缩放,旋转,翻转和平移等操作的组合。
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
img = cv.imread("image.jpg")
rows,cols = img.shape[:2]
pts1 = np.float32([[50,50],[200,50],[50,200]])
pts2 = np.float32([[100,100],[200,50],[100,250]])
M = cv.getAffineTransform(pts1,pts2)
dst = cv.warpAffine(img,M,(cols,rows))
fig,axes=plt.subplots(nrows=1,ncols=2,figsize=(10,8),dpi=100)
axes[0].imshow(img[:,:,::-1])
axes[0].set_title("原图")
axes[1].imshow(dst[:,:,::-1])
axes[1].set_title("仿射后")
plt.show()
透视变换是一种中心投影的射影变换,它可以将矩形映射为任意不规则四边形,因此透视变换的自由度更高。透视变换适用于需要模拟三维空间中视角变化的场合,如在计算机视觉中的相机校准、三维重建等,利用透视中心、像点、目标点三点共线的条件,按透视旋转定律使透视面透视轴旋转某一角度,破坏原有的投影光线束,仍能保持承影面上投影几何图形不变的变换。
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
img = cv.imread("image.jpg")
rows,cols = img.shape[:2]
# 2.1 创建变换矩阵
pts1 = np.float32([[56,65],[368,52],[28,387],[389,390]])
pts2 = np.float32([[100,145],[300,100],[80,290],[310,300]])
T = cv.getPerspectiveTransform(pts1,pts2)
dst = cv.warpPerspective(img,T,(cols,rows))
fig,axes=plt.subplots(nrows=1,ncols=2,figsize=(10,8),dpi=100)
axes[0].imshow(img[:,:,::-1])
axes[0].set_title("原图")
axes[1].imshow(dst[:,:,::-1])
axes[1].set_title("透射")
plt.show()
类似的还有OpenCV处理平滑方法、边缘检测、视频读写等操作和API,后期会更新更多OpenCV相关操作~