OpenCV 常用的API总结(迅速查询)

OpenCV基本操作

matplotlib中文显示

plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
openCV安装
pip install opencv-python==3.4.2.17
pip install opencv-contrib-python==3.4.2.17
#国内清华镜像
-i https://pypi.tuna.tsinghua.edu.cn/simple
# 设置清华镜像
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
pip config set install.trusted-host pypi.tuna.tsinghua.edu.cn
读取图片(IO操作)
import cv2
# 读一个图片并进行显示(图片路径需自己指定)
img=cv2.imread("1.jpg")
cv2.imshow("image",img)
cv2.waitKey(0)

# 保存图片
cv.imwrite('messigray.png',img)
绘制集合图形
# 绘制直线
# 绘制直线
cv.line()
# 绘制直线
cv.circle()
# 绘制直线
cv.rectangle()
# 向图像中增加文字
cv.putText()
图像加法以及混合操作
# 图像加法
cv.add()
#2 图像混合
cv.addWeighted()

OpenCV图像处理


图像几何变换
#1 图像缩放
cv2.resize(src,dsize,fx=0,fy=0,interpolation=cv2.INTER_LINEAR)
#2 图像平移
cv.warpAffine(img,M,dsize)
#3 图像旋转
cv2.getRotationMatrix2D(center, angle, scale) -> cv.warpAffine(img,M,dsize)
#4 仿射变换
cv2.getAffineTransform() -> cv.warpAffine(img,M,dsize)
#5 透射变换
cv.getPerspectiveTransform() -> cv.warpAffine(img,M,dsize)
#6 图像金字塔
cv.pyrUp(img)       #对图像进行上采样
cv.pyrDown(img)        #对图像进行下采样
形态学操作
# 腐蚀   
cv.erode(img,kernel,iterations)
# 膨胀
cv.dilate(img,kernel,iterations)
# 开运算  闭运算
cv.morphologyEx(img, op, kernel) # op: 处理方式:若进行开运算,则设为cv.MORPH_OPEN,若进行闭运算,则设为cv.MORPH_CLOSE
# 礼帽和黑帽
cv.morphologyEx(img, op, kernel)#  op: 处理方式:若进行开运算,则设为cv.MORPH_TOPHAT,若进行闭运算,则设为cv.BLACKHAT
图像平滑
#均值滤波
cv.blur(src, ksize, anchor, borderType)
#高斯滤波
cv2.GaussianBlur(src,ksize,sigmaX,sigmay,borderType)
#中值滤波
cv.medianBlur(src, ksize)
直方图
# mask -> 直方图
cv2.calcHist(images,channels,mask,histSize,ranges[,hist[,accumulate]])

'''
images: 原图像。当传入函数时应该用中括号 [] 括起来,例如:[img]。
channels: 如果输入图像是灰度图,它的值就是 [0];如果是彩色图像的话,传入的参数可以是 [0],[1],[2] 它们分别对应着通道 B,G,R。   
mask: 掩模图像。要统计整幅图像的直方图就把它设为 None。但是如果你想统计图像某一部分的直方图的话,你就需要制作一个掩模图像,并使用它。(后边有例子)   
histSize:BIN 的数目。也应该用中括号括起来,例如:[256]。   
ranges: 像素值范围,通常为 [0,256]
'''
# 掩模
mask -> cv.bitwise_and
# 直方图均衡化
dst = cv.equalizeHist(img)
#自适应的直方图均衡化
cv.createCLAHE(clipLimit, tileGridSize)
'''
clipLimit: 对比度限制,默认是40
tileGridSize: 分块的大小,默认为8*88∗8
'''
边缘检测
#sobel边缘检测
Sobel_x_or_y = cv2.Sobel(src, ddepth, dx, dy, dst, ksize, scale, delta, borderType)
'''
src:传入的图像
ddepth: 图像的深度
dx和dy: 指求导的阶数,0表示这个方向上没有求导,取值为0、1。
ksize: 是Sobel算子的大小,即卷积核的大小,必须为奇数1、3、5、7,默认为3。
注意:如果ksize=-1,就演变成为3x3的Scharr算子。
scale:缩放导数的比例常数,默认情况为没有伸缩系数。
borderType:图像边界的模式,默认值为cv2.BORDER_DEFAULT。
'''
# Laplacian算子
laplacian = cv2.Laplacian(src, ddepth[, dst[, ksize[, scale[, delta[, borderType]]]]])
'''
Src: 需要处理的图像,
Ddepth: 图像的深度,-1表示采用的是原图像相同的深度,目标图像的深度必须大于等于原图像的深度;
ksize:算子的大小,即卷积核的大小,必须为1,3,5,7。
'''
# Canny边缘检测
canny = cv2.Canny(image, threshold1, threshold2)
'''
image:灰度图,
threshold1: minval,较小的阈值将间断的边缘连接起来
threshold2: maxval,较大的阈值检测图像中明显的边缘
'''
模板匹配
# 模板匹配
res = cv.matchTemplate(img,template,method)
'''
img: 要进行模板匹配的图像
Template :模板
method:实现模板匹配的算法,主要有:
平方差匹配(CV_TM_SQDIFF):利用模板与图像之间的平方差进行匹配,最好的匹配是0,匹配越差,匹配的值越大。
相关匹配(CV_TM_CCORR):利用模板与图像间的乘法进行匹配,数值越大表示匹配程度较高,越小表示匹配效果差。
利用相关系数匹配(CV_TM_CCOEFF):利用模板与图像间的相关系数匹配,1表示完美的匹配,-1表示最差的匹配。
'''
#霍夫线检测
# 1 线性检测
cv.HoughLines(img, rho, theta, threshold)
# 2 圆环检测
circles = cv.HoughCircles(image, method, dp, minDist, param1=100, param2=100, minRadius=0,maxRadius=0 )
傅里叶变换
# 变换
dft = cv2.dft(src, dst=None)
# 逆变换
img = cv.idft(dft)
轮廓检测
# 查找轮廓
binary, contours, hierarchy = cv2.findContours(img, mode, method)
# 绘制轮廓
cv2.drawContours(img, contours, index, color, width)
'''
面积:ContourArea()
周长:ArcLength()
轮廓近似:approxPolyDP() 逼近图像的多边形曲线
凸包:ConvexHull()
边界矩形:BoundingRect()和MinAreaRect()
最小外接圆:MinEnclosingCircle()
椭圆拟合:fitEllipse()
直线拟合:fitline()
'''
图像分割

全域值分割

ret,th = threshold(src, thresh, maxval, type)
  • src: 要处理的图像,一般是灰度图
  • thresh: 设定的阈值
  • maxval: 灰度中的最大值,一般为255,用来指明阈值分割中最大值的取值,主要指阈值二值化和阈值反二值化中
  • type:阈值分割的方式,取值主要有以下五种:
    1、阈值二值化(threshold binary)
    2、阈值反二值化 (threshold binary Inverted)
    3、截断(truncate)
    4、阈值取零(threshold to zero)
    5、阈值反取零(threshold to zero inverted)
    自适应预支分割
dst = cv.adaptiveThreshold(src, maxval, thresh_type, type, Block Size, C)
  • src: 输入图像,一般是灰度图

  • Maxval:灰度中的最大值,一般为255,用来指明像素超过或小于阈值(与type类型有关),赋予的最大值

  • thresh_type : 阈值的计算方法,主要有以下两种: cv2.ADAPTIVE_THRESH_MEAN_C:邻域内像素值取均值

  • cv2.ADAPTIVE_THRESH_GAUSSIAN_C:邻域内像素值进行高斯核加权求和

  • type: 阈值方式,与threshold中的type意义相同

  • block_size: 计算局部阈值时取邻域的大小,如果设为11,就取11*11的邻域范围,一般为奇数。

  • C: 阈值计算方法中的常数项,即最终的阈值是邻域内计算出的阈值与该常数项的差值

全域值分割

res = watershed(image,markers)
  • mage: 输入图像,必须是8位的3通道彩色图像
  • marker: 标记图像,32位单通道图像,它包括种子点信息,使用轮廓信息作为种子点。在进行分水岭算法之前,必须设置好marker信息,它包含不同区域的轮廓,每个轮廓有唯一的编号,使用findCountours方法确定轮廓位置,不同区域的交界位置为-1

GrabCut算法

grabCut(img,mask,rect,bgdModel,fgdModel,iterCount,mode )
  • img:输入图像,必须是8位的3通道彩色图像
  • mask: 掩码图像,如果使用掩码进行初始化,那么mask保存初始化掩码信息;也可以将用户交互所设定的前景与背景保存到mask中,然后再传入grabCut函数;在处理结束之后,mask中会保存结果。mask只能取:0(背景),1(前景),2(可能的前景),3(可能的背景)
  • rect:用于限定需要进行分割的图像范围,只有该矩形窗口内的图像部分才被处理
  • bgdModel:背景模型,如果为None,函数内部会自动创建一个bgdModel;bgdModel必须是单通道浮点型图像,且行数只能为1,列数只能为13x5
  • fgdModel:前景模型,如果为None,函数内部会自动创建一个fgdModel;fgdModel必须是单通道浮点型图像,且行数只能为1,列数只能为13x5
  • iterCount:迭代次数,必须大于0
  • mode:指明grabcut函数进行哪种操作,cv.GC_INIT_WITH_RECT(矩形窗抠图)cv.GC_INIT_WITH_MASK(利用掩码抠图)

图像特征提取

#Harris角点检测
dst=cv.cornerHarris(src, blockSize, ksize, k)
  • img:数据类型为 float32 的输入图像。
  • blockSize:角点检测中要考虑的邻域大小。
  • ksize:sobel求导使用的核大小
  • k :角点检测方程中的自由参数,取值参数为 [0.04,0.06].
#Shi-Tomasi角点检测
corners = cv2.goodFeaturesToTrack ( image, maxcorners, qualityLevel, minDistance )
  • Image: 输入灰度图像
  • maxCorners : 获取角点数的数目。
  • qualityLevel:该参数指出最低可接受的角点质量水平,在0-1之间。
  • minDistance:角点之间最小的欧式距离,避免得到相邻特征点。
SIFT检测关键点
# 实例化sift
sift = cv.xfeatures2d.SIFT_create()
# 利用sift.detectAndCompute()检测关键点并计算
kp,des = sift.detectAndCompute(gray,None)
#将关键点检测结果绘制在图像上
cv.drawKeypoints(image, keypoints, outputimage, color, flags)
  • image: 原始图像
  • keypoints:关键点信息,将其绘制在图像上
  • outputimage:输出图片,可以是原始图像
  • color:颜色设置,通过修改(b,g,r)的值,更改画笔的颜色,b=蓝色,g=绿色,r=红色。
  • flags:绘图功能的标识设置
    1. cv2.DRAW_MATCHES_FLAGS_DEFAULT:创建输出图像矩阵,使用现存的输出图像绘制匹配对和特征点,对每一个关键点只绘制中间点
    2. cv2.DRAW_MATCHES_FLAGS_DRAW_OVER_OUTIMG:不创建输出图像矩阵,而是在输出图像上绘制匹配对
    3. cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS:对每一个特征点绘制带大小和方向的关键点图形
    4. cv2.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINTS:单点的特征点不被绘制

视频读写

  1. 读取视频:

    • 读取视频:cap = cv.VideoCapture()
    • 判断读取成功:cap.isOpened()
    • 读取每一帧图像:ret,frame = cap.read()
    • 获取属性:cap.get(proid)
    • 设置属性:cap.set(proid,value)
    • 资源释放:cap.release()
  2. 保存视频

    • 保存视频: out = cv.VideoWrite()
    • 视频写入:out.write()
    • 资源释放:out.release()
# Meanshift
cv.meanShift(probImage, window, criteria)
ret, track_window = cv.CamShift(dst, track_window, term_crit)
    
# 绘制追踪结果
pts = cv.boxPoints(ret)
pts = np.int0(pts)
img2 = cv.polylines(frame,[pts],True, 255,2)

参考文档 OpenCV官方教程

猜你喜欢

转载自blog.csdn.net/Peyzhang/article/details/125923154
今日推荐