《Python OpenCV从入门到精通》内容总结(1-15章)

目录

入门篇(1~5章)

基础篇(6~9章)

进阶篇(10-15章)

入门篇(1~5章)

  • Python是一种面向对象的解释型语言(又被称为胶水语言)
  • 图像主体的边缘应该表现为一连串独立的像素
  • OpenCV常用模块说明:
模块说明
Core包含OpenCV库的基础结构以及基本操作
Improc基本的图像转换,包括滤波和卷积等
HighguiUI工具包
Video读取和写视频流的方法
Calib3d校准相机使用
Feature2d包含用于检测、描述以及匹配特征点的算法
Objdectect包含检测特定目标的算法
ML各种机器学习的算法
Flann供其他模块调用的模块
GPU在CUDA、GPU上优化的方法
Photo计算摄影学的方法
Stitching图像拼接
  • Python文件路径全部英文(中文会报各种找不到路径的错误)
  • 读取图像:
# file_name为文件全名,要加引号,可带绝对路径,flags可省略flags=1彩图,flags=0灰度图
image = cv2.imread(file_name, flags)   
  • 显示图像
# window_name要显示的图片的窗口名称,显示在窗口左上角的标题处,picture是图像在代码中的表示
cv2.imshow(window_name, picture)
  • 等待时间
# delay可以省略,值为负数,0,空时无限等待,retval表示被按下的按键的ASCII码,可以不用加
retval = cv2.waitKey(delay)
  • 销毁窗口
cv2.destroyAllWindows()
  • 保存图像
cv2.imwrite(file_name, picture)   # 参数含义参考上方读取图像
  • 获取图像属性
picture.shape  # 彩色图像的形状(垂直像素,水平像素,通道数)灰度图的形状(垂直像素,水平像素)
picture.size   # 图像包含像素个数
picture.dtype  # 图像的数据类型
  • OpenCV中图像是按照BGR的形式存在的
  • 获取像素对应的BGR值:
pixel = picture[y, x]     # 此处横纵坐标位置反着来
pixel = picture[y, x,z]  # z表示通道数,0→B,1→G,2→R(B=G=R=0纯黑,B=G=R=255纯白)

  •  numpy数据类型:
数据类型描述
bool_一个字节的布尔值(True/False)
int_默认整数,相当于C的long,通常为int32或int64
intc相当于C的int,通常为int32或int64
intp用于索引的整数
int8字节(-128~127)
int16(-32768~32767)
int32(-2,147,483,648~2,147,483,647)
int64(-9,223,372,036,854,775,808~9,223,372,036,854,775,807)
uint8(0~255)
uint16(0~65535)
uint32(0~4,294,967,295)
uint64(0~18,446,744,073,709,551,615)
float_float64简写
float16半精度浮点数:符号位(1)+指数(5)+尾数(10)
float32单精度浮点数:符号位(1)+指数(8)+尾数(23)
float64双精度浮点数:符号位(1)+指数(11)+尾数(52)
complexcomplex128简写
complex128复数,两个32位浮点数表示
complex256复数,两个64位浮点数表示
datatime64日期时间
timedelta64两个时间的间隔
  • numpy创建数组
# object创建的数组对象,dtype数据类型,copy布尔型,默认为True,是否复制数组对象
# order元素在内存中的位置,C(按行排)、F(列)、A(原顺序)、K(元素在内存中的顺序)(一般不用)
# subok布尔型,True传递子类,False(默认值)基类数组(一般不用)
# ndmin指定数组的最小维数
np.array(object, detype, copy, order, subok, ndmin)
  • 创建未初始化数组
n = numpy.empty([h, l])  # [h, l]表示h行l列
  • 创建纯0数组
n = numpy.zeros((h, l), numpy.uint8)
  • 创建纯1数组
n = numpy.ones((h, l), numpy.uint8)
  • 创建随机数组
# low最小值,high最大值,size数组大小  eg. size=(2, 5)
n = numpy.random.randint(low, high, size)  
  • numpy数组四则运算
n1 = numpy.array([h1, l1])
n2 = numpy.array([h2, l2])

n1 + n2  # 加法(对应位置数值相加)
n1 - n2  # 减法(对应位置数值相减)
n1 * n2  # 乘法(对应位置数值相乘)
n1 / n2  # 除法(对应位置数值相除)
  • numpy数组幂运算、比较运算、复制数组
n1 = numpy.array([h1, l1])
n2 = numpy.array([h2, l2])

n1 ** n2  # 幂运算(对应位置做幂运算,eg.[(h1)^(h2), (l1)^(l2)])
n1 >= n2  # 比较运算(大于等于)(返回True/False)
n1 <= n2  # 小于等于
n1 == n2  # 等于
n1 != n2  # 不等于

n3 = n1.copy()  # 复制数组,也可以用numpy.array(n1, copy=True)
  • 数组索引和切片
n1 = numpy.array([x, x, x, ..., x])  # x仅代表数值的意思,并非需要完全一致
n1[y]  # y表示索引号,如果是二维及以上数组y表示对应的维数,如果要确定的具体数值需要给出对应维度的坐标
# 切片式索引,start起始索引,没有值代表从0开始,stop终止索引,没有值代表到最后,step表示步长
# 索引左闭右开,三个参数都可以为负数,负号代表反向,数值代表同上,且所有的索引均从0开始计数
n2[start:stop:step]
  • 创建纯黑、纯白图像
picture = numpy.zeros((height, width), numpy.uint8)       # 纯黑图(高,宽)
picture = numpy.ones((height, width), numpy.uint8) * 255  # 纯白图(高,宽)
  • 黑图内部绘制白图(可理解为掩膜操作,后面有专门用来掩膜的计算方式(按位与))
picture = numpy.zeros((height, width), numpy.uint8)  # 纯黑图
# 以(start_height, start_width)和(stop_height, stop_width)为左上和右下坐标的区域变为白色
picture[start_height:stop_height, start_width:stop_width] = 255 
  • 创建彩色图像
picture = numpy.zeros((height, width, 3), numpy.uint8)  # B,G,R再分别赋值
  • 创建随机彩色图像
picture = numpy.random.randint(256, size(height, width, 3), dtype=np.uint8)
  • 拼接图像
array = numpy.hstack(tup)  # 水平拼接,列数可以不一致,行数要保持一致,tup表示要拼接的数组元组
array = numpy.vstack(tup)  # 垂直拼接,行数可以不一致,列数要保持一致,tup表示要拼接的数组元组
  • 从BGR转换为GRAY(灰度图因为丢失颜色比例所以无法转换成彩色图像)
gray = cv2.cvtColor(BGR, cv2.COLOR_BGR2GRAY)
  • BGR转换为HSV(H:色调,S:饱和度,V:亮度)
HSV = cv2.cvtColor(BGR, cv2.COLOR_BGR2HSV)
  • 拆分通道(当BGR三个通道的值都相同时即可得到灰度图像)
B, G, R = cv2.split(BGR)
H, S, V = cv2.split(HSV)
  • 合并BGR通道
BGR = cv2.merge([B, G, R])
  • 合并HSV通道
HSV = cv2.merge([H, S, V])
  • BGR转BGRA(A通道代表透明度,要观看透明效果需要先保存图像)
BGRA = cv2.cvtColor(BGR, cv2.COLOR_BGR2BGRA)

基础篇(6~9章)

  • 在图片上绘制线段
# img为画布,pt1起点坐标,pt2终点坐标,color线条颜色,thickness线条宽度
picture = cv2.line(img, pt1, pt2, color, thickness)  
  • 绘制矩形
# img为画布,pt1左上角坐标,pt2右下角坐标,color线条颜色,thickness线条粗细(thickness=-1时为实心矩形)
picture = cv2.rectangle(img, pt1, pt2, color, thickness)
  • 绘制圆形
# img画布,center圆心坐标,radius半径,color颜色,thickness线宽
picture = cv2.circle(img, center, radius, color, thickness)
  • 用numpy随机生成实心圆的线条颜色时必须加.tolist()
# 0~255是颜色的取值范围,.tolist()不能省略是因为color是一个列表
color = numpy.random.randint(0, high=256, size=(3,)).tolist()
  • 绘制多边形
# img画布,pts多个顶点坐标的列表,isClosed=True表示闭合的多边形,反之不闭合,color颜色,thickness粗细
picture = cv2.polylines(img, pts, isClosed, color, thickness)
  • 绘制文字(斜体可以与其他字体样式一同使用)
# img画布,text文字内容(用双引号括起来),org文字左下角坐标,fontScale字体大小,color字体颜色
# thickness线条宽度,lineType线形(4或者8,默认为8)
# bottomLeftOrigin绘制文字的方向(默认为False),True可以呈现垂直镜像效果
# fontFace字体样式见下表
picture = cv2.putText(img, text, org, fontFace, fontScale, color, thickness, lineType, bottomLeftOrigin)
字体含义
FONT_HERSHEY_SIMPLEX正常大小的sans-serif字体
FONT_HERSHEY_PLAIN小号的sans-serif字体
FONT_HERSHEY_DUPLEX正常大小的sans-serif字体(比SIMPLEX字体样式更复杂)
FONT_HERSHEY_COMPLEX正常大小的serif字体
FONT_HERSHEY_TRIPLEX正常大小的serif字体(比COMPLEX字体样式更复杂)
FONT_HERSHEY_COMPLEX_SMALLFONT_HERSHEY_COMPLEX的简化版
FONT_HERSHEY_SCRIPT_SIMPLEX手写风格的字体
FONT_HERSHEY_SCRIPT_COMPLEXSIMPLEX进阶版
FONT_ITALIC斜体
  • 利用time模块呈现动画效果
# seconds休眠时间,可为小数
time.sleep(seconds)
  • 更改图像比例
# 两种方式二选一
# src原图,dst目标图,dsize输出图像的大小eg:(100, 30),fx、fy表示缩放倍数可缩可放
# interpolation表示插值方式,为可选参数,默认为双线性插值,具体见下表
dst = cv2.resize(src, dsize, interpolation)
dst = cv2.resize(src, fx, fy, interpolation)
参数含义
INTER_NEAREST最临近差值
INTER_LINEAR双线性插值
INTER_CUBIC4×4双立方插值
INTER_AREA使用像素区域关系进行重采样
INTER_LANCZOS48×8Lanczos插值
  • 图像翻转
# src原图,flipCode翻转类型(=0沿x轴翻转,>0沿y轴翻转,<0同时沿x,y轴翻转)
dst = cv2.flip(src, flipCode)
  • 仿射变换
# src原图,dst目标图,dsize输出图像的尺寸大小,flags插值方式(可选,建议默认值)
# borderMode边界类型(包括重复最后一个元素,添加常数边界值等,可选参数,建议直接选择默认值)
# borderValue边界值,可选参数,默认为0
# M仿射变换矩阵,计算方式见下方公式
dst = cv2.warpAffine(src, M, dsize, flags, borderMode, borderValue)

M=\begin{bmatrix}a&b&c\\d&e&f\end{bmatrix}                      \left\{\begin{matrix} x_{new}=x_{old}\times a+y_{old}\times b+c \\ y_{new}=x_{old}\times d+y_{old}\times e+f \end{matrix}\right.

  • 平移变换(X为水平移动距离,Y为垂直移动距离)
M=[[1, 0, X],
   [0, 1, Y]]
  • 旋转(方法和仿射变换一样,只是M矩阵要经过opencv计算)
# center为旋转中心点坐标,angle为旋转角度(非弧度,+逆时针旋转,-顺时针旋转)
# scale为缩放比例(浮点类型)
M = cv2.getRotationMatrix2D(center, angle, scale)
  • 倾斜(方法和仿射变换一样,只是M矩阵要经过opencv计算)
# 三个点坐标分别为左上、右上、左下
# src为原图3个点坐标(三行两列32位浮点数列表),dst为倾斜图像3点坐标,格式同src
M = cv2.getAffineTransform(src, dst)
  • 透视(此处为从图像底部观察图像的效果,下大上小)
# src原图,dsize输出图像大小,flags可选参数,为插值方式
# borderMode边界类型(可选),borderValue边界值(可选,默认为0)
# M(3*3矩阵)用opencv方法自动计算
dst = cv2.warpPerspective(src, M, dsize, flags, borderMode, borderValue)
# src原图四点坐标,dst透视图四点坐标(顺序为左上,右上,左下,右下)
M = cv2.getPerspectiveTransform(src,dst)
  • 图像阈值处理(色彩均衡图像只用一种即可)
# src原图像(可为多通道图像),thresh阈值(在125~150之间效果较好)
# maxval阈值处理时采用的最大值,type阈值处理的类型,具体类型见下表
# retval处理时采用的阈值(和thresh数值一样),dst效果图
retval, dst = cv2.threshold(src, thresh, maxval, type)
类型含义
THRESH_BINARY二值化阈值处理
THRESH_BINARY_INV反二值化阈值处理
THRESH_TOZERO低于阈值置0
THRESH_TOZERO_INV高于阈值置0
THRESH_TRUNC截断阈值处理
  • 自适应阈值处理(适用于明暗分布不均的图像,要先将图像转换为灰度图)
# src原图,maxValue阈值处理时采用的最大值,adaptiveMethod自适应阈值计算方法,具体见下表
# thresholdType阈值处理类型,必须为二值化和反二值化中的一种,blockSize为正方形区域的边长
# C常量,阈值等于均值或者加权值减去C
dst = cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C)
计算方法含义
ADAPTIVE_THRESH_MEAN_C对正方形区域内的所有像素进行平均加权
ADAPTIVE_THRESH_GUSSIAN_C按高斯函数根据像素与中心点距离对正方形内所有像素进行加权运算
  • 自适应寻找阈值
# src原图(必为灰度图),thresh阈值,且要设置为0,maxval阈值处理的最大值
# type为阈值处理类型,此处除5种必要类型外后面要加上cv2.THRESH_OTSU
# retval为最优阈值,dst为效果图
retval, dst = cv2.threshold(src, thresh, maxval, type)
  • 对图像进行掩膜操作(也可以实现图像覆盖加和的操作,与掩膜不同,要将掩膜用的纯色图换成目标图)
# a~b代表行的像素范围,c~d代表列的像素范围,y表示掩膜的图像的颜色,范围为0~255的整数
picture[a:b, c:d, :] = y
  • 图像相加
# src1第一幅图,src2第二幅图,mask掩膜(可选)为加和时结果保留的区域,dtype图像深度(可选)
# dst效果图,对于加和大于255的部分取255
dst = cv2.add(src1, src2, mask, dtype)
  • 图像按位与(与纯白像素做运算,结果为原像素值)
# mask为掩膜区域
dst = cv2.bitwise_and(src1, src2, mask)
  • 图像按位或(与纯黑像素做运算为像素原值)
dst = cv2.bitwise_or(src1, src2, mask)
  • 按位取反运算(与原图颜色完全相反的结果)
dst = cv2.bitwise_not(src, mask)
  • 按位异或运算(与掩膜图做异或运算,与纯白异或为原像素取反,与纯黑异或为原图,与同一张图异或两次可以得到原图,可用于加密解密)
dst = cv2.bitwise_xor(src, mask)
  • 利用加权和的方式合并图像(产生多次曝光的效果)
# src1图1,α图1权重,src2图2,β图2权重,γ结果上添加的标量,具体计算公式见下方
dst = cv2.addWeighted(src1, α, src2, β, γ)

dst=\alpha \times src_{1}+\beta \times src_{2}+\gamma

  • 不同通道数图像进行拼接(3通道和4通道)
import cv2

# 拼接图像方法
def overlay_img(img, img_over, img_over_x, img_over_y):
    img_h, img_w, img_p = img.shape  # 背景图像宽、高、通道数
    img_over_h, img_over_w, img_over_c = img_over.shape  # 覆盖图像宽、高、通道数
    if img_over_c <= 3:  # 通道数小于等于3
        img_over = cv2.cvtColor(img_over, cv2.COLOR_BGR2BGRA)  # 转换成4通道图像
    for w in range(0, img_over_w):  # 遍历列
        for h in range(0, img_over_h):  # 遍历行
            if img_over[h, w, 3] != 0:  # 如果不是全透明的像素
                for c in range(0, 3):  # 遍历三个通道
                    x = img_over_x + w  # 覆盖像素的横坐标
                    y = img_over_y + h  # 覆盖像素的纵坐标
                    if x >= img_w or y >= img_h:  # 如果坐标超出最大宽高
                        break
                    img[y, x, c] = img_over[h, w, c]  # 覆盖像素
    return img

smoking = cv2.imread("smoking.png", cv2.IMREAD_UNCHANGED)  # 吸烟图像,保持原格式
no_img = cv2.imread("no.png", cv2.IMREAD_UNCHANGED)  # 禁止图像,保持原格式
cv2.imshow("no", no_img)  # 展示禁止图像
cv2.imshow("smoking", smoking)  # 展示禁止图像
img = overlay_img(smoking, no_img, 95, 90)  # 将禁止图像覆盖到吸烟图像之上
cv2.imshow("no smoking", img)  # 展示覆盖结果
cv2.waitKey()  # 按下任何键盘按键后
cv2.destroyAllWindows()  # 释放所有窗体
图1 smoking
图2 no
图3 效果图

进阶篇(10-15章)

  • 模版匹配
# image搜索帧,templ模板帧,method匹配的方法,result匹配结果(是一个二维数组,其中的数为对应位置的匹配结果)
# mask掩膜,只有SQDIFF和CCORR_NORMED支持该参数,一般用默认值
result = cv2.matchTemplate(image, templ, method, mask)
参数值值(和参数值二选一即可)含义
cv2.TM_SQDIFF0平方差匹配,匹配程度越高计算结果越小,完全匹配结果为0
cv2.TM_SQDIFF_NORMED1标准平方差匹配,规则同上
cv2.TM_CCORR2相关匹配,匹配程度越高结果越大
cv2.TM_CCORR_NORMED3标准相关匹配,规则同上
cv2.TM_CCOEFF4相关系数匹配,计算结果为-1~1的浮点数,1表示完全匹配,0表示完全不同,-1表示亮度相反
cv2.TM_CCOEFF_NORMED5标准相关系数匹配,规则同上
  • 单目标匹配
# src为模版匹配后得到的结果数组,mask为掩膜,一般使用默认值
# minValue数组中的最小值,maxValue数组中的最大值,minLoc最小值坐标(x,y), maxLoc最大值坐标(x,y)
minValue, maxValue, minLoc, maxLoc = cv2.minMaxLoc(src, mask)
  • 多目标匹配
results = cv2.matchTemplate(img, templ, cv2.TM_CCOEFF_NORMED)
  • 多模版匹配

        多个单目标匹配循环即可实现

  • 均值滤波(滤波核在对应位置做滤波操作,求平均值,做低通滤波器,滤波核越大,处理后的图像越模糊)
# src原图,ksize滤波核的大小,anchor滤波核的锚点(最终数值所在的点,默认为中心点),borderType边界的扩展方法,建议选取默认值
dst = cv2.blur(src, ksize, anchor, borderType)
  • 中值滤波(直接将像素值排序,取中间像素值,直接赋值,边长越长越模糊,比均值滤波丢失更多细节)
# src原图,ksize滤波核的边长(固定只取正方形核,其他滤波器可取矩形核)
dst = cv2.medianBlur(src, ksize)
  • 高斯滤波(处理后的图像呈现磨砂玻璃的效果,可理解为一种类似马赛克的效果,但又不完全一致,卷积核中的权重呈高斯分布,高斯滤波处理的更加平滑,保留信息更多,更易辨认)
# src原图,ksize卷积核大小,borderType为边界样式,一般使用默认值
# sigmaX水平方向标准差,sigmaY垂直方向标准差,如果不知道怎么设置,可直接写0,滤波器会自动计算合适的权重
dst = cv2.GaussianBlur(src, ksize, sigmaX, sigmaY, borderType)
  • 双边滤波(可有效保护边界信息)
# src原图,d表示滤波器直径,如果d<0,则自动计算,与保留边缘信息的数量成正比,与运行效率成反比
# sigmaColor表示参与计算的颜色范围,是像素值与周围颜色最大的差值,颜色值之差小于此值时周围的像素才参与计算,值为255时,所有颜色均参与计算
# sigmaSpace表示参与计算的坐标空间的值,值越大参与计算的像素数量越多,borderType边界计算方法,一般采用默认值
# dst目标图
dst = cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace, borderType)
  • 图像腐蚀(抹除一些外部细节)
# src原图,kernel腐蚀的核(需要自己定义),anchor核的锚点位置,iterations腐蚀操作的迭代次数
# borderType边界的操作方式,一般使用默认即可,borderValue表示扩充边界的值,dst表示腐蚀后的图像
dst = cv2.erode(src, kernel, anchor, iterations, borderType, borderValue)
  • 图像膨胀(放大部分外部细节,呈现出近视眼的效果)
# src原图,kernel膨胀的核,anchor核的锚点位置,iterations膨胀的迭代次数
# borderType边界样式,一般采用默认,borderValue边界值,一般采用默认
dst = cv2.dilate(src, kernel, anchor, iterations, borderType, borderValue)
  • 开运算(先腐蚀后膨胀,用于抹除外部细节)
  • 闭运算(先膨胀后腐蚀,用于抹除图像内部细节)
  • 形态学运算
# src原图,op操作方法,具体见下表,kernel操作中使用的核,anchor核的锚点位置
# iterations迭代次数,默认为1,borderType边界处理方法,borderValue,边界值,dst目标图
dst = cv2.morphologyEx(src, op, kernel, anchor, iterations, borderType, borderValue)
参数值含义
cv2.MORPH_ERODE腐蚀操作
cv2.MORPH_DILATE膨胀操作
cv2.MORPH_OPEN开运算,先腐蚀后膨胀
cv2.MORPH_CLOSE闭运算,先膨胀后腐蚀
cv2.MORPH_GRADIENT梯度运算,膨胀图减腐蚀图
cv2.MORPH_TOPHAT顶帽运算,原图减开运算图
cv2.MORPH_BLACKHAT黑帽运算,闭运算图减原图
  • 梯度运算(像素的变化程度,像素值跨度越大,梯度值越大)
  • 顶帽运算(只包含外部细节的图)
  • 黑帽运算(只包含内部细节的图)
  • 图像轮廓检测(简单的几何轮廓易识别,不规则的轮廓识别起来比较困难,利用梯度判断图像的边缘)
# image被检测图像(8通道2值图像,彩色图要转为灰度图再进行二值化处理),mode轮廓检索模式,具体见下表
# methode检测轮廓时使用的方法,具体见下表,contours轮廓列表,每个元素都是轮廓的像素坐标数组
# hierarchy轮廓间的层次关系
contours, hierarchy = cv2.findContours(image, mode, methode)
轮廓检索模式参数值(mode)含义
cv2.RETR_EXTERNAL只检测外部轮廓
cv2.RETR_LIST检测所有轮廓,但不建立层次关系
cv2.RETR_CCOMP检测所有轮廓,并建立两级层次关系
cv2.RETR_TREE检测所有轮廓,并建立树状结构的层次关系
检测轮廓时使用的方法参数值(methode)含义
cv2.CHAIN_APPROX_NONE储存轮廓上所有的点
cv2.CHAIN_APPROX_SIMPLE只保存水平、垂直或对角线轮廓的端点
cv2.CHAIN_APPROX_TC89_L1Ten-Chinl近似算法的一种(没找到具体是一种什么样的算法,对正方形框进行分割边界并不平整,没有NONE效果好)
cv2.CHAIN_APPROX_TC89_KCOSTen-Chinl近似算法的一种,效果和上边的一样
  • 图像轮廓标记(要配合findContours函数使用)
# image原图,可以为多通道图像,contours为findContours得到的轮廓列表
# contourldx表示绘制的轮廓的索引,-1则绘制所有轮廓,color绘制的颜色,采用BGR格式
# thickness线粗,-1则绘制实心轮廓,lineType线形,hierarchy为findContours得到的层次关系
# maxLevel绘制轮廓层次的深度,绘制到第几层,offse偏移量,可以改变绘制结果的位置,picture结果图
picture = cv2.drawContours(image, contours, contourldx, color, thickness, lineType, hierarchy, maxLevel, offse)
  • 轮廓拟合(矩形包围框,最小矩形框直接取findContours的结果contours[0])
# array表示轮廓数组,retval元组类型,包括左上角顶点的横纵坐标,矩形的宽和高
retval = cv2.boundingRect(array)
  • 轮廓拟合(圆形包围框)
# points表示轮廓数组,center表示圆心坐标,radius表示最小圆形包围框的半径
center, radius = cv2.minEnclosingCircle(points)
  • 自动找出轮廓凸包(图形最外侧的端点连接成的最小包围框)
# points为轮廓数组,clockwise为布尔类型,True表示凸包中的点顺时针排列,False表示逆时针排列
# returnPoints为布尔类型,True表示凸包中的点返回坐标,False表示返回点的索引
hull = cv2.convexHull(points, clockwise, returnPoints)
  • Canny边缘检测
# image原始图像,threshold1计算过程中最小阈值,如果只有一个阈值表示最大阈值
# threshold2计算过程中最大阈值,两个阈值都很小时检测出较多的细节,两个阈值都较大时忽略较多的细节
# apertureSize为Sobel算子的孔径大小
# L2gradient计算图像梯度的标识,默认为False,选择True时算法计算更精准
edges = cv2.Canny(image, threshold1, threshold2, apertureSize, L2gradient)
  • 利用霍夫变换检测直线(只能检测二值图像)
# image表示原始图像,rho检测直线时使用的半径步长,值为1时检测所有可能的半径步长
# theta搜索直线的角度,当值为π/180°时表示检测所有角度,threshold阈值,越小检测出的直线越多
# minLineLength线段的最小长度,小于该长度不计入结果,maxLinGap表示线段间的最小距离
# lines表示检测出的线段,每条线段一个数组,代表两个端点的横纵坐标
lines = cv2.HoughLinesP(images, rho, theta, threshold, minLineLength, maxLinGap)
  • 利用霍夫变换检测圆环(要求同上)
# image原图,method检测方法,4.0.0版本前只有cv2.HOUGH_GRADIENT方法
# dp累加器的分辨率与原始图像分辨率之比的倒数,值为1时两者分辨率相同,值为2时累加器的分辨率为原始图像的0.5
# minDist圆心间的最小距离,param1最大阈值,param2检测圆环后的投票数,超过该值才会进入下一轮筛选
# minRadius圆环的最小半径,maxRadius圆环的最大半径
# circles数组,数组内每个圆环也是一个数组,内容包括圆心的横纵坐标和半径长度
circles = cv2.HoughCircles(image, method, dp, minDist, param1, param2, minRadius, maxRadius)
  • 读取并显示摄像头视频
# index为摄像头的设备索引,capture为要打开的摄像头,这一步是进行摄像头的初始化
# 设备索引的先后顺序由系统决定,opencv不提供查询方法,索引从0开始计算,对于64位win10笔记本,0为笔记本内置摄像头,摄像头可以同时开多个,如果没反应可能是电脑带宽不够
capture = cv2.VideoCapture(index)
# 当调用笔记本摄像头产生警告时,可以将上边的命令变为:
capture = cv2.VideoCapture(index, cv2.CAP_DSHOW)
# 检验摄像头是否初始化成功,如果成功retval为True,反之为False
retval = cv2.VideoCapture.isOpened()
# 从摄像头中读取帧,retval表示是否读取到帧,读取到为True,反之为False,image为读取到的图像
retval, image = cv2.VideoCapture.read()
# 关闭摄像头
cv2.VideoCapture.release()
  • 读取并显示视频文件
# filename要打开的视频文件名,可以带绝对路径,用双引号括起来,video表示打开的视频
video = cv2.VideoCapture(filename)
  • 获取视频文件属性
# retval需要获取的属性值,propId视频文件的属性值,具体属性见下表
retval = cv2.VideoCapture.get(propId)
属性值含义
cv2.CAP_PROP_MSEC视频文件播放的当前位置,毫秒做单位
cv2.CAP_PROP_POS_FRAMES帧的索引,从0开始
cv2.CAP_PROP_POS_AVI_RATIO当前真的相对位置,0表示开头,1表示结尾
cv2.CAP_PROP_FRAME_WIDTH视频帧宽度(水平方向上含有的像素总数)
cv2.CAP_PROP_FRAME_HEIGHT视频帧高度(垂直方向上含有的像素总数)
cv2.CAP_PROP_FPS帧速率
cv2.CAP_PROP_FOURCC用4个字符表示的视频编码格式
cv2.CAP_PROP_FRAME_COUNT视频文件的帧数
cv2.CAP_PROP_FORMATretrieve()方法返回的Mat对象的格式
cv2.CAP_PROP_MODE指示当前捕获模式的后端专用的值
cv2.CAP_PROP_CONVERT_RGB指示是否将图像转换为RGB
  • 保存视频文件
# VideoWriter object表示VideoWriter类对象,filename表示保存视频时的路径
# fourcc为用4个字符表示的视频编码格式,具体格式见下表,fps帧速率,frameSize表示每一帧的大小
<VideoWriter object> = cv2.VideoWriter(filename, fourcc, fps, frameSize)
# frame读取到的帧
cv2.VideoWriter.write(frame)
# 释放类对象
cv2.VideoWriter.release()
fourcc的值视频编码格式扩展名
cv2.VideoWriter_fourcc('I', '4', '2', '0')(或者括号里直接写为*'I420',下同)未压缩的YUV颜色编码格式,兼容性较好,但文件较大.avi
cv2.VideoWriter_fourcc(*'PIMI')MPEG-1编码格式.avi
cv2.VideoWriter_fourcc(*'XVID')MPEG-4编码格式,视频文件的大小为平均值.avi
cv2.VideoWriter_fourcc(*'IHEO')Ogg Vorbis编码格式,兼容性差.ogv
cv2.VideoWriter_fourcc(*'FLVI')Flash视频编码格式.flv
  • opencv中级联分类器的保存路径:
...\Python\Lib\site-packages\cv2\data\
  • 部分级联分类器功能
级联分类器XML文件名检测内容
haarcascade_eye.xml眼睛检测
haarcascade_eye_tree_eyeglasses.xml眼镜检测
haarcascade_frontalcatface.xml正面猫脸检测
haarcascade_frontalface_default.xml正面人脸检测
haarcascade_fullbody.xml身形检测
haarcascade_lefteye_2splits.xml左眼检测
haarcascade_lowerbody.xml下半身检测
haarcascade_profileface.xml侧面人脸检测
haarcascade_righteye_2splits.xml右眼检测
haarcascade_russian_plate_number.xml车牌检测
haarcascade_smile.xml笑容检测
haarcascade_upperbody.xml上半身检测
  • 级联分类器使用方法
# 创建分类器对象,<CascadeClassifier object>其实就是在代码中给需要的分类器命个名
# filename为上述xml文件的的地址,绝对地址相对地址没有要求
<CascadeClassifier object>=cv2.CascadeClassifier(filename)
# 进行图像识别,cascade即为上面的<CascadeClassifier object>,image为待分析的图像
# scaleFactor为扫描时的缩放比例(可选),minSize最小目标尺寸,maxSize最大目标尺寸
# minNeighbors表示每个候选区域至少保留多少个检测结果才可以判定为识别成功(可选)
# flags在新版中可以省略,建议使用默认值(可选),objects表示目标区域数组,包括左上角点横纵坐标及宽和高
objects = cascade.detectMultiScale(image, scaleFactor,minNeighbors, flags, minSize, maxSize)
  • Eigenfaces人脸识别器PCA(主成分分析法)识别人脸
1.创建人脸识别器
# num_components PCA方法中保留的分量个数(可选),threshold人脸识别时使用的阈值
# recognizer创建的人脸识别器对象
recognizer = cv2.face.EigenFaceRecognizer_create(num_components, threshold)
2.训练识别器
# recognizer人脸识别器对象,src用来训练的人脸图像样本列表,labels样本对应的标签
recognizer.train(src, labels)
3.利用识别器识别人脸
# recognizer人脸识别器对象,src待识别图像,label与样本匹配度最高的标签值
# confidence匹配度最高的信用度评分,小于5000匹配程度较高,0表示完全一样
label, confidence = recognizer.predict(src)
  • Fisherfaces人脸识别器LDA(线性判别分析技术)
1.创建人脸识别器
# num_components FisherFace方法中保留的分量个数(可选),threshold人脸识别时使用的阈值
# recognizer创建的人脸识别器对象
recognizer = cv2.face.FisherFaceRecognizer_create(num_components, threshold)
2.训练识别器
# recognizer人脸识别器对象,src用来训练的人脸图像样本列表,labels样本对应的标签
recognizer.train(src, labels)
3.利用识别器识别人脸
# recognizer人脸识别器对象,src待识别图像,label与样本匹配度最高的标签值
# confidence匹配度最高的信用度评分,小于5000匹配程度较高,0表示完全一样
label, confidence = recognizer.predict(src)
  • Local Binary Pattern Histogram人脸识别器(LPBH局部二进制模式直方图)
1.创建人脸识别器
# radius圆形局部二进制模式的半径,neighbors圆形局部二进制模式的采样点数目,threshold人脸识别时使用的阈值
# grid_x水平方向的单元格数,grid_y垂直方向的单元格数,recognizer创建的人脸识别器对象
recognizer = cv2.face.LBPHFaceRecognizer_create(radius, neighbors, grid_x, grid_y, threshold)
2.训练识别器
# recognizer人脸识别器对象,src用来训练的人脸图像样本列表,labels样本对应的标签
recognizer.train(src, labels)
3.利用识别器识别人脸
# recognizer人脸识别器对象,src待识别图像,label与样本匹配度最高的标签值
# confidence匹配度最高的信用度评分,小于50匹配程度较高,0表示完全一样
label, confidence = recognizer.predict(src)
  • 14
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值