分类目录opencv

imutils

源码
https://github.com/jrosebr1/imutils
参考
https://www.jianshu.com/p/bb34ddf2a947
https://www.pythonf.cn/read/30985
图形矫正 http://www.mamicode.com/info-detail-2802340.html

macOS Catalina上python调用摄像头权限问题

  1. xcode
    1)打开Xcode,新建项目,选择macOS,App。
    2)完善项目信息:
    Product Name: pycharm
    Organization Identifier: com.jetbrains
    Bundle identifier: com.jetbrains.pycharm
    Language: Swift
    User Interface: Storyboard
    3)打开Info.plist文件 ,添加Privacy – Camera Usage Description,属性为:Give me my camera access!
    4)打开AppDelegate.swift文件,导入库新增:
    import AVKit
    5)applicationDidFinishLaunching() 函数中,添加代码:
    AVCaptureDevice.requestAccess(for: .video) { _ in }

然后运行项目,OK允许

  1. Iterm2
    系统当前 shell
    $ cat /etc/shells
    当前使用的shell
    echo $SHELL
    切换到zsh
    chsh -s /bin/zsh

bash的配置文件是 -/.bash_profile
zsh的配置文件是-/.zshrc

安装iTerm2
iTerm2下载地址:https://www.iterm2.com/downloads.html
brew cask install iterm2

安装oh my zsh
通过curl安装:
sh -c “$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)”
或通过wget安装:
sh -c “$(wget -O- https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)

‘/Applications/IntelliJ IDEA.app/Contents/MacOS/idea’

opencv python

  1. 读取图像
    retval = cv2.imread(filename[,flags])
    retval 读到图像,未读到返回None
    filename 文件名,支持格式.bmp,dib,jpeg,jpg,jpe,jp2,png,webp,pbm,pgm,ppm,pxm,pnm,sr,ras,tiff,tif,exr,hdr,pic,raster,Vector
    flags 读取标记
    cv2.IMREAD_UNCHANGED 1 保留原格式
    cv2.IMREAD_GRAYSCALE 0 灰度图像
    cv2.IMREAD_COLOR 1 BGR图像(默认)
    cv2.IMREAD_ANYDEPTH 2 当载入的图像深度为16或者32位时,就返回其对应深度的图像,否则就转为8位图像
    cv2.IMREAD_ANYCOLOR 4 以任何可能的颜色格式读取图像
    cv2.IMREAD_ LOAD_GDAL 8 使用GDAL驱动程序加载图像
    cv2.IMREAD_REDUCED_GRAYSCALE_2 将图像转为单通道灰度图,并将尺寸减小1/2
    cv2.IMREAD_REDUCED_GRAYSCALE_4 将图像转为单通道灰度图,并将尺寸减小1/4
    cv2.IMREAD_REDUCED_GRAYSCALE_8 将图像转为单通道灰度图,并将尺寸减小1/8
    cv2.IMREAD_REDUCED_COLOR_2 较图像转为3通道BGR彩色图,并将尺寸减小1/2
    cv2.IMREAD_REDUCED_COLOR_4 较图像转为3通道BGR彩色图,并将尺寸减小1/4
    cv2.IMREAD_REDUCED_COLOR_8 较图像转为3通道BGR彩色图,并将尺寸减小1/8

  2. 显示图像
    None = cv2.namedWindow(winname) 创建指定名的窗口
    None = cv2.imshow(winname,img)

  3. 等待按键
    retval = cv2.waitKey([delay])
    retval 按键返回值按键的ASCII码,没有按键-1
    delay 等待键盘触发时间ms,0或负数,一直等待,默认0

  4. 获取字符的ASCII码值
    ord(“A”)

  5. 销毁指定的窗口
    None = cv2.destroyWindow(winname)

  6. 销毁所有的窗口
    None = cv2.destroyAllWindow()

  7. 保存图像
    retval = cv2.imwrite(filename,img[,params])
    retval 保存结果True False成功或失败
    filename 要保存的完整文件名
    img 被保存的图像
    params 保存的类型参数


像素处理

最小数据类型无符号的8位数
二值图像转为特殊的灰度图0黑色255白色
opencv 通道顺序 BGR 与RGB相反,img[:,:,0] B通道 img[:,:,1] G通道 img[:,:,2] R通道

  1. 常用数据生成
    img = np.zero((2,4,3),dtype=np.uint8) 0
    img = np.ones((2,4,3),dtype=np.uint8) 1
    img = np.random.randint(0,256,size=[5,5,3],dtype=np.uitn8)

  2. numpy.array更快的访问像素
    item(行,列)
    itemset(索引值,新值) 索引值=(行,列)

  3. 感兴趣区域ROI
    img[200:400,200:400]

  4. 通道拆分
    b = img[:,:,0]
    g = img[:,:,1]
    r = img[:,:,2]

b,g,r = cv2.split(img)
b = cv2.split(img)[0]
g = cv2.split(img)[1]
r = cv2.split(img)[2]

  1. 通道合并
    bgr = cv2.merge([b,g,r])

  2. 获取图像的属性
    img.shape 返回行数,列数,通道数,如是二值图或灰度图,只有行列数
    img.size 返回像素数目,行数列数通道数,如是二值图或灰度图,通道数为1
    img.dtype 返回图像的数据类型

  3. 图像的加法
    a+b的和除以256
    cv2.add(a,b[,mask]) 和大于255,取值255

  4. 图像加权和
    dst = cv2.addWeighted(src1,alpha,src2,beta,gamma)
    dst=src1alpha+src2beta+gamma

  5. 按位与
    dst = cv2.bitwise_and(src1,src2[,mask])
    mask 8位单通道array值,常用于保留掩模内的图像

  6. 按位或
    dst = cv2.bitwise_or(src1,src2[,mask])

  7. 按位异或
    dst = cv2.bitwise_xor(src1,src2[,mask])

  8. 按位取反 非
    dst = cv2.bitwise_not(src1,src2[,mask])

  9. 位平面分解
    阀值处理
    mask = img[:,:,i]>0 将图像中大于0的值处理为True <=0的处理为 False
    img[mask] = 255 将True替换为255,False替换为0
    opencv提像了专门的阀值处理函数cv2.threshold()

  10. 图像加解密,水印
    加密: 明文A与密钥B异或,得到密文C
    解密:密文C与密钥B异或,得到明文A
    水印在最低有效位LSB隐藏信息,对整体图像影响不明显


色彩空间类型转换

类型转换
dst = cv2.cvtColor(src, code[,dstCn])
dst 转换后的图像,与原图具有同样的数据类型各深度
src 要转换的原图
code 色彩空间转换码
dstCn 目标通道数,默认0,自动通过原始输入图和code得到

更多类型查看官网

  1. 锁定特征值,可提取特定颜色
    dst = cv2.inRange(src, lowerb,upperb)
    dst 输出结果,大小和src一致,如果值在区间内,dst对应位置为255,否则为0,可以作为一个掩码数组
    src 要检查的图像或数组
    lowerb 范围下界
    upperb 范围上界

  2. alpha通道
    RGBA色彩空间4通道,alpha通道值[0,1]或[0,255]表示从透明到不透明


几何变换

  1. 缩放
    dst = cv2.resize(src,dSize[,fx[,fy[,interpolation]]])
    dst 输出的图像,类型与src相同,大小为dSize(非0时)或通过计算得到
    src 要缩放的图像
    dSize 输出图像大小,为None时能过缩放比计算
    fx 水平方向的缩放比
    fy 垂直方向的缩放比
    interpolation 插值方式 在缩小图像时,使用区域插值方式能有好的效果cv2.INTER_AREA,放大图像时,使用三次样条INTER_CUBIC(慢)和双线性INTER_LINEAR插值效果不错(快)

  2. 翻转
    dst = cv2.flip(src, flipCode)
    flipCode 旋转类型0绕着X轴翻转,正数绕着y轴,负数绕着x,y轴同时翻转

  3. 仿射
    dst(x,y) = src(M11x+M12y+M13,M21x+M22y+M23)
    dst = cv2.warpAffine(src,M,dSize[,flags[,borderMode[,borderValue]]])
    M 2X3的变换矩阵,使用不同的矩阵,实现不同的仿射变换
    dSize 输出图像的大小
    flags 插值方式,默认INTER_LINEAR,为WARP_INVERSE_MAP时,M是逆变换类型
    borderMode 代表边类型,默认BORDER_CONSTANT,目标图像内值不做改变,对应原始图像内的异常值
    borderValue 边界值,默认为0
    平移M
    dst(x,y) = src(x+100,y+200)
    M = np.float32([1,0,100],[0,1,200])
    旋转M
    M = cv2.getRotationMatrix2D(center,angle,scale)
    center 旋转的中心点
    angle 旋转的角度,正表示逆时针,负表示正时针旋转
    scale 放大缩小变换尺度
    复杂变换M
    M = cv2.getAffineTransform(src,dst)
    src 输入图像的三个顶点坐标
    dst 输出图像的三个顶点坐标

  4. 透视变换,可以将矩形应射为任意四边形
    dst = cv2.warpPerspective(src,M,dSuze[,flags[,borderMode[,borderValue]]])
    M 3X3的变换矩阵,使用不同的矩阵,实现不同的仿射变换
    dSize 输出图像的大小
    flags 插值方式,默认INTER_LINEAR,为WARP_INVERSE_MAP时,M是逆变换类型
    borderMode 代表边类型,默认BORDER_CONSTANT,目标图像内值不做改变,对应原始图像内的异常值
    borderValue 边界值,默认为0
    构造M函数
    M = cv2.getPerspectiveTransform(src,dst)
    src 输入图像的四个顶点坐标
    dst 输出图像的四个顶点坐标

  5. 重映射
    dst = cv2.remap(src,mapX,mapY,interpolation[,borderMode[,borderValue]])
    mapX 参数有两种可能表示(x,y)点的一个映射 表示CV_16SC2,CV_32FC1,CV_32FC2类型(x,y)点的x值
    mapY 当map1表示(x,y)时,值为空,(是x,y)点的x值时,是CV_16UC1,CV_32FCL1类型(x,y)点的y值
    interpolation 插值方式,不支持INTER_LINEAR方法
    borderMode 边界模式
    borderValue 边界值,默认0
    可以实现复制,翻转,缩放等操作


阀值处理

  1. retval, dst = cv2.threshold(src,thresh,maxval,type)
    retval 返回的阀值
    dst 阀值分割结果图像
    thresh 设定的阀值
    maxval 当type设定为THRESH_BINARY,THRESH_BINARY_INV时,需要设定最大值
    type cv2.THRESH_BINARY 二值化阀值处理 THRESH_BINARY_INV反二值化阀值处理 THRESH_TRUNC截断阈值化处理 THRESH_TOZERO_INV超阈值零处理 THRESH_TOZERO 低阈值零处理

  2. 自适应阈值处理 能更好的处理明暗差异较大的图像
    dst = cv2.adaptiveThreshold(src,maxValue,adaptiveMethod,thresholdType,blockSize,C)
    maxValue 最大值
    adaptiveMethod 自适应方法
    thresholdType 阀值处理方式,只能是THRESH_BINARY,THRESH_BINARY_INV
    blockSize 领域尺寸的块大小,通常3,5,7等
    C 常量

  3. Otsu处理 根据图像给出最佳的类间分割阈值
    retval, dst = cv2.threshold(src,0,255,cv2.THRESH_BINARY + cv2.THRESH_OTSU)
    retval 返回的最优阀值
    dst 阀值分割结果图像


图像平滑处理

  1. 均值滤波
    dst = cv2.blur(src,ksize,anchor,borderType)
    dst 滤波后的结果
    src 待处理的图像
    ksize 滤波核的大小,领域图像的高度和宽度,如(3,3)
    anchor 锚点,默认(-1,-1),表示当前计算的均值点位于核的中心点位置,一般默认即可
    borderType 边界样式,一般不用考虑取值,默认即可

  2. 方框滤波
    dst = cv2.boxFilter(src,ddepth,ksize,anchor,normalize,borderType)
    dst 滤波后的结果
    src 待处理的图像
    ddepth 图像处理深度,一般用-1,表示与原图像同样深度
    ksize 滤波核的大小,领域图像的高度和宽度,如(3,3)
    anchor 锚点,默认(-1,-1),表示当前计算的均值点位于核的中心点位置,一般默认即可
    normalize 是否进行归一化
    borderType 边界样式,一般不用考虑取值,默认即可

  3. 高斯滤波 考虑权重
    dst = cv2.GaussianBlur(src, ksize, sigmaX, sigmaY,borderType)
    sigmaX 卷积核在水平方向X的标准差
    sigmaY 卷积核在垂直方向Y的标准差 ,为0,则只采用sigmaX的值,sigmaX也为0,则通过ksize自动计算

  4. 中值滤波
    dst = cv2.medianBlur(src, ksize)
    ksize 核大小,比1大的奇数,3,5,7…

  5. 双边滤波 有效保护图像内的边缘信息
    dst = cv2.bilateralFilter(src,d,sigmaColor,sigmaSpace,borderType)
    d 空间距离参数,表示以当前像素点为中心点的直径.为负数,自动从sigmaSpace计算得到,如果>5,速度较慢,一般推荐5,对于较大噪声的离线滤波,可以用9
    sigmaColor 颜色差值范围,决定周围哪些像素点能够参与到滤波中来.小于sigmaColor的像素点可以参与,255都可以
    sigmaSpace 坐标空间中的sigma值,越大越有更多的值参与运算.d>0时,d指定领域大小

  6. 2D卷积 自定义
    dst = cv2.filter2D(src, ddepth,kernel,anchor,delta,borderType)
    delta 修正值,可选项
    以9*9大小领域进行均值滤波 1/81 kernel = np.ones((9,9),np.float32)/81


形态学操作

  1. 腐蚀 图像的边界点消除,向内收缩
    dst = cv2.erode(src , kernel [, anchor [, iterations [, borderType[, borderValue]]]])
    kernel 腐蚀操作的结构类型,可以自定,可以cv2.getStructuringElement()生成
    anchor element结构中锚点的位置,默认(-1,-1),要核的中心位置
    iterations 迭代次数,默认1
    borderType 边界样式,默认BORDER_CONSTANT
    borderValue 边界值,一般默认,C++中提供morphologyDefaultBorderValue()返回腐蚀和膨胀的magic边界值

  2. 膨胀 对图像边界扩张,还可以消除内部斑点
    dst = cv2.dilate(src , kernel [, anchor [, iterations [, borderType[, borderValue]]]])

  3. 能用形态学函数
    dst = cv2.morphologyEx(src ,op, kernel [, anchor [, iterations [, borderType[, borderValue]]]])
    op cv2.MORPH_ERODE 腐蚀erode(src)
    ..DILATE 膨胀 dilate(src)
    ..OPEN 开运算 dilate(erode(src)) 用于去噪,分割,计数
    ..CLOSE 闭运算 erode(dilate(src)) 用于关闭前景内部小孔,去除物体上的小黑点,进行图像连接
    ..GRADIENT 梯度运算 dilate(src)-erode(src) 可以获得前景图像的边缘
    ..TOPATH 顶帽运算 src-open(src) 获取图像的噪声信息,或得到比原始图像边缘更亮的边缘信息
    ..BLACKHAT 黑帽运算 close(src) -src 获取图像内部小孔,或前景中的小黑点,,或得到比原始图像边缘更暗的边缘信息
    ..HITMISS 击中击不中 intersection(erode(src),erode(srcI))

  4. 构造核函数
    retval = cv2.getStructuringElement(shape,ksize[,anchor])
    shape 形状类型 cv2.MORPH_RECT 矩形结构元素,都是1 ..CROSS 十字形结构元素,对角线为1 .. ELLIPSE 椭圆形结构元素
    ksize 结构元素的大小
    anchor 结构中锚点的位置,默认(-1,-1),要核的中心位置


图形梯度 计算图形的边缘信息

  1. sobel算子 在离散空间,可能不太准确
    dst = cv2.Soble(src,ddepth,dx,dy[,ksize[,scale[,delta[,borderType]]]])
    ddepth 输出图像的深度 输入图像的深度cv2.CV_8U ..16U/16S ..32F ..64F 输出深度为1/输入图像深度,再计算时为避免信息丢失,先设为cv2.CV_64F,再通过取绝对值映射为cv2.CV_8U.
    dx x方向的求导阶数
    dy y方向的求导阶数
    x方向边缘,dx=1,dy=0 y方向边缘,dx=0,dy=1 ,xy方向重合的部分dx=1,dy=1 ,xy方向叠加cv2.addWeighted(),注意先取绝对值
    ksize sobel核的大小.-1会使用Scharr算子进行运算
    scale 缩放因子,默认为1,不缩放
    delta 加在目标图上的值 ,默认为0
    borderType 边界样式

  2. 取绝对值
    dst = cv2.convertScaleAbs(src[, alpha[, beta]])
    alpha 调节系数,默认为1
    beta 调节亮度值,默认为0

  3. Scharr算子 同样速度且精度更高
    dst = cv2.Scharr(src,ddepth,dx,dy[,scale[,delta[,borderType]]])
    ddepth 为cv2.CV_64F,再通过取绝对值映射为cv2.CV_8U
    dx,dy x方向边缘,dx=1,dy=0 y方向边缘,dx=0,dy=1 ,xy方向叠加cv2.addWeighted(),只有这三种方式

  4. Laplacian算子 具有旋转不变性,满足不同方向图像边缘检测的要求
    dst = cv2.Laplacian(src,ddepth,[,ksize[,scale[,delta[,borderType]]]])
    ksize 核尺寸大小,必须为正奇数
    计算结果必须取绝对值才能保证正确

  5. Canny边缘检测
    edges = cv2.Canny(image,minThreshold,maxThreshold[,apertureSize[,L2gradient]])
    edges 返回的边缘图像
    image 8位输入图像
    minThreshold 第一个小的阈值
    maxThreshold 第二个大的阈值 minThreshold,maxThreshold较小时能检测更多的结果
    apertureSize Sobel算子的孔径大小
    L2gradient 计算梯形副度的标识,默认为False,使用L1范数计算,为True时使用更精确的L2范数计算


图像金字塔

  1. 高斯金字塔 向下采样
    dst = cv2.pyrDown(src[,dstsize[,borderType]])
    dstsize 目标图像大小,默认情况下输出大小为Size((src.cols+1)/2,(src.rows+1)/2)
    borderType 办界类型,仅支持BORDER_DEFAULT

  2. 高斯金字塔 向上采样
    dst = cv2.pyrUp(src[,dstsize[,borderType]])
    dstsize 目标图像大小,默认情况下输出大小为Size(src.cols2,src.rows2)
    borderType 办界类型,仅支持BORDER_DEFAULT
    两个方向操作不可逆

  3. 拉普拉斯金字塔 可获得采样过程中丢失的信息
    Li = Gi – pyrUp(Gi+1)
    Li 拉普拉斯金字塔的第i层
    Gi 高斯金字塔的第i层


图像轮廓

  1. 查找图像轮廓
    image, contours, hierarchy = cv2.findContours(image, mode, method)
    CV4 contours, hierarchy = cv2.findContours(image, mode, method)
    contours 返回的轮廓数组
    hierarchy 轮廓的层次关系
    image 必须是8位单通道二值图像
    mode cv2.RETR_EXTERNAL 只检测外轮廓 cv2.RETR_LIST不建立等级关系cv2.RETR_CCOMP 两级层次结构 cv2.RETR_TREE 建立等级树的层次结构

  2. 绘制图像轮廓
    image = cv2.drawContours(image,contours,contourIdx,color[,thickness[,lineType[,hierarchy[,maxLevel[,offset]]]]])
    contours 图像轮廓
    contourIdx 轮廓索引 -1绘制全部轮廓
    color 绘制颜色
    thickness 画笔粗细 -1绘制实心轮廓,即特定对象的掩模
    lineType 绘制的线型
    hierarchy 轮廓的层次关系
    maxLevel 轮廓的层次深度 0仅绘制第0层,其它非0整数,绘制最高层及以下相同数量层级的轮廓
    offset 偏移参数,将轮廓偏移到不同的位置展示出来

  3. 轮廓矩特征 用来比较两个轮廓是否相似
    retval = cv2.moments(array[,binaryImage])
    array 可以是点集,灰度图,二值图
    binaryImage 为True时,array所有非零值都被处理为1,此值仅在array为图像时有效
    retval 特征矩 空间矩:零阶矩m00表示轮廓的面积 中心矩: 归一化中心矩:

  4. 计算轮廓的面积
    retval = cv2.contourArea(contour[,oriented])
    contour 轮廓
    oriented 默认False,返回绝对值 为True是返回值包含正负号,表示轮廓是顺时针还是逆时针的

  5. 计算轮廓的长度
    retval = cv2.arcLength(contour,closed)
    contour 轮廓
    closed True/False 轮廓是否封闭

  6. Hu矩–用来识别图像的特征
    hu = cv2.HuMoments(m);
    hu h0~h6
    m cv2.moments计算得到的矩特征值

  7. 形状匹配
    retval = cv2.matchShapes(contour1,contour2,method,parameter)
    contour1 contour2 两个轮廓或者灰度图像
    method 比较方法 cv2.CONTOURS_MATCH_I1(2/3)
    parameter 扩展参数到CV4.1.0暂都不支持,应设为0

  8. 轮廓拟合-矩形包围框
    retval = cv2.boundingRect(array)
    x,y,w,h = cv2.boundingRect(array)
    retval x,y,w,h 矩形边界左上角顶点坐标值及边界的宽度和高度
    array 灰度图像或轮廓

  9. 轮廓拟合-最小包围矩形框
    retval = cv2.minAreaRect(points)
    retval (最小外接矩形的中心(x,y),(宽度,高度),旋转角度)
    points 轮廓
    retval返回值不符合cv2.drawContours参数结构,需使用cv2.boxPoints()转换

  10. 转换轮廓 获取最小包围矩形框的四个顶点坐标
    points = cv2.boxPoints(box)
    points 能使用cv2.drawContours绘制的轮廓点
    box cv2.minAreaRect的返回值

  11. 轮廓拟合-最小包围圆形
    center, radius = cv2.minEnclosingCircle(points)
    (x,y), radius = cv2.minEnclosingCircle(points)
    center 最小包围圆形的中心
    radius 半径
    points 轮廓

  12. 轮廓拟合-最优拟合椭圆
    retval = cv2.fitEllipse(points)
    retval 是RotatedRect类型,包括质心,宽,高,旋转角度等信息
    points 轮廓

  13. 轮廓拟合-最优拟合直线
    line = cv2.fitLine(points,distType,param,reps,aeps)
    [vx,vy,x,y] = cv2.fitLine(points,distType,param,reps,aeps)
    points 轮廓
    distType 距离类型,要使输入点到拟合直线的距离之和最小,如下:
    cv2.DIST_USER/L1/L2/C/L12/FAIR/WELSCH/HUBER
    param 距离参数 与所选距离类型有关, 为0时自动选择最优
    reps 径向精度,通常设为0.01
    aeps 角度精度,通常设为0.01

  14. 轮廓拟合-最小外包三角形
    retval,triangle = cv2.minEnclosingTriangle(points)
    retval 最小外包三角形的面积
    triangle 最小外包三角形的三个顶点

  15. 轮廓拟合-逼近多边形-采用的是DP算法
    approxCurve = cv2.approxPolyDP(curve,epsilon,closed)
    approxCurve 逼近多边形的点集
    curve 轮廓
    epsilon 精度 原始轮廓的边界点与逼近多边形边界之间的最大距离,通常设为多边形总长度的百分比形式
    closed True/False 多边形是否封闭的

  16. 凸包
    hull = cv2.convexHull(points[,clockwise[,returnPoints]])
    points 轮廓
    clockwise True/False 凸包角点按顺时针或逆时针方向排列
    returnPoints True/False 默认为True,返回凸包角点的x/y坐标,反之返回角点的索引

  17. 绘制凸包
    cv2.polylines(image,[hull],True,(0,255,0),2)

  18. 凸缺陷-凸包与轮廓之间的部分
    convexityDefects = cv2.convexityDefects(contour,convexhull)
    convexityDefects 凸缺陷点集,一个数组[起点,终点,轮廓上距离凸包最远的点,最远的点到凸包的近似距离],前三个值为索引,需要到轮廓点中查找
    contour 轮廓
    convexhull 凸包 returnPoints的值必须是False

  19. 检测轮廓是否是凸形
    retval = cv2.isContourConvex(contour)
    retval True/False 是否凸形
    contour 要判断的轮廓

  20. 点到轮廓的距离,或点和多边形的关系测试
    retval = cv2.pointPolygonTest(contour,pt,measureDist)
    contour 轮廓
    pt 待判定的点
    measureDist 判定的方式:True计算点到轮廓的距离,点在轮廓的外部返回负值,在轮廓上返回0,在内部,返回正数, False只返回-1,0,1中的一个值

  21. 计算形状场景距离-构造距离提取算子
    retval = cv2.createShapeContextDistanceExtractor([,nAngularBins[,nRadialBins[,innerRadius[,outerRadus[,iterations[,comparer[,transformer]]]]]]])
    nAngularBins 角容器的数量
    nRadialBins 径向容器的数量
    innerRadius 内半径’
    outerRadus 外半径
    iterations 迭代次数
    comparer 直方图代价提取算子
    transformer 形状变换参数

  22. 计算不同形状场景距离
    retval = cv2.createShapeContextDistanceExtractor.computeDistance(contour1,contour2)
    contour1,contour2 是不同的轮廓

  23. 计算Hausdorff距离-构造距离提取算子
    retval = cv2.createHausdorffDistanceExtractor([,distanceFlag[,rankProp]])
    distanceFlag 距离标记
    rankProp 比例值0~1之间

  24. 轮廓的特征值
    宽高比 = 宽度/高度
    Extend = 轮廓面积(对象面积)/矩形边界面积
    Solidity = 轮廓面积(对象面积)/凸包面积
    Equivalent Diameter等效直径 = Sqrt(4*轮廓面积/PI)
    方向 = (x,y),(MA,ma),angle = cv2.fitEllipse(cnt) 利用椭圆方向

  25. 获取掩模
    参见cv2.drawContours绘制轮廓将参数thickness设为-1

  26. 使用Numpy函数获取轮廓像素点
    使用numpy.nonzero()找出数组内非0元素的位置,返回值是将行列分别显示
    再使用numpy.transpose()处理上述结果,得到这些点的(x,y)坐标

  27. 使用OpenCV函数获取轮廓点
    idx = cv2.findNonZero(src)
    idx 非0元素的索引位置,每个元素对应的是(列号,行号)格式
    src 要查找的非零元素的图像

  28. 最大值最小值及其位置
    min_val,max_val,min_loc,max_loc = cv2.minMaxLoc(imgray,mask=mask)
    min_val,max_val 最小值,最大值
    min_loc,max_loc 最小值,最大值的位置
    imgray 单通道图像,灰度图像
    mask 掩模

  29. 平均颜色及平均灰度
    mean_val = cv2.mean(im,mask = mask) 能够计算各个通道的均值
    im 原图像
    mask 掩模

  30. 极点
    leftmost = tuple(cnt[cnt[:,:,0].argmin()][0]) 最左端点
    rightmost = tuple(cnt[cnt[:,:,0].argmax()][0]) 最右端点
    topmost = tuple(cnt[cnt[:,:,1].argmin()][0]) 最上端点
    bottommost = tuple(cnt[cnt[:,:,1].argmax()][0]) 最下端点


直方图处理

  1. 绘制直方图-matplotlib.pyplot.hist()
    matplotlib.pyplot.hist(x,BINS)
    x 数据源
    BINS BINS值,灰度级的分组情况

  2. 二维数组降为一维数组
    b = a.ravel()

  3. 绘制直方图-cv2.calcHist
    hist = cv2.calcHist(images,channels,mask,histSize,ranges,accumulate)
    hist 统计直方图,一维数组
    images 原始图像,需用[]括起来
    channels 通道编号,需用[]括起来,单通道灰度图为0,彩色图0,1,2,对应B,G,R
    mask 掩模图像
    histSize BINS的值,需用[]括起来
    ranges 像素值的范围,如8位灰度图像素值[0,255]
    accumulate 默认False,累计/叠加标识,为True时直方图开始计算时不清零,用于一组图像计算,实时更新直方图,从多个对象中计算单个直方图,一般不用设置

  4. matplotlib.pyplot.plot 直方图绘图
    plt.plot(x,y,color=’r’) 省略x轴时默认生成与y长度一致的自然序数

  5. 直方图均衡化,综合考虑了统计概率和HVS的均衡化
    dst = cv2.equalizeHist(src)
    src 8位单通道原始图像

  6. matplotlib.pyplot.subplot 向当前窗口添加一个子窗口对象
    matplotlib.pyplot.subplot(nrows,ncols,index)

  7. matplotlib.pyplot.imshow 显示窗口,注意openCV的通道顺序BGR
    matplotlib.pyplot.imshow(X, cmap=None)
    X 图像信息
    cmap 色彩空间 默认null RGB(A)色彩空间

  8. matplotlib.pyplot.figure 构建窗口
    matplotlib.pyplot.figure(‘text’)

  9. matplotlib.pyplot.axis 关闭/显示坐标轴
    matplotlib.pyplot.axis(‘off’)


傳里叶变换

  1. numpy实现傳里叶变换
    retval = numpy.fft.fft2(原始灰度图像)
    retval 复数数组的频谱信息

  2. 零频率成分移动到频域图像中心位置
    retval = numpy.fft.fftshift(原始频谱)

  3. 频谱信息转换到[0,255]的灰度空间图
    像素新值 = 20*np.log(np.abs(频谱信息值))

  4. 零频率成分移动到频域图像中心位置的反向操作,移回原位
    retval = numpy.fft.ifftshift(原始频谱)

  5. numpy实现逆傳里叶变换
    retval = numpy.fft.ifft2(频域数据)
    retval 复数数组的空域信息

  6. 空域信息转换到[0,255]的灰度空间图
    像素新值 = np.abs(空域信息)

  7. 高通滤波,增加图中尖锐细节,保留边缘信息,低通滤波使图像变模糊
    f = np.fft.fft2(img)
    fshift = np.fft.fftshift(f)
    rows, cols = img.shape
    crow, ccol = int(rows/2), int(cols/2)
    fshift[crow-30:crow+30, ccol-30:ccol+30] = 0
    ishift2 = np.fft.ifftshift(fshift)
    iimg2 = np.fft.ifft2(ishift2)
    iimg2 = np.abs(iimg2)

  8. opencv实现傳里叶变换
    rstval = cv2.dft(原始图像,转换标识)
    rstval 返回结果与nupmy转换一致,但是双通道,1通道为实数部分,2通道为虚数部分,再使用numpy.fft.fftshift(rstval)移到中心位置,再计算频谱信息的幅度,然后再20*np.log(),得到频谱信息
    原始图像 要先使用np.float32()转换格式
    转换标识 通常为cv2.DFT_COMPLEX_OUTPUT输出一个复数阵列

  9. 计算频谱信息的幅度
    rstval = cv2.magnitude(实部,虚部)

  10. 将幅度值映射为灰度空间[0,255]
    20*np.log(rstval)

  11. opencv实现逆傳里叶变换
    rstval = cv2.dft(频域数据)
    频域数据 如果先前移动了零频率分量,在使用前要先ifftshift移回原位置

  12. 低通滤波
    dft = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT)
    dftshift = np.fft.fftshift(dft)
    rows, cols = img.shape
    crow, ccol = int(rows/2), int(cols/2)
    mask = np.zeros((rows, cols, 2), np.uint8)
    .# 两个通道,与频域图像匹配
    mask[crow-30:crow+30, ccol-30:ccol+30] = 1
    fshift = dftshift * mask
    ishift = np.fft.ifftshift(fshift)
    iimg2 = cv2.idft(ishift)
    iimg2 = cv2.magnitude(iimg2[:, :, 0], iimg2[:, :, 1])


模版匹配

  1. 模版匹配
    rstval = cv2.matchtemplate(image, templ, method[,mask])
    rstval 比较结果集,单通道32位浮点型,原始图大小WH,模版大小wh,返回值大小(W-w+1)*(H-h+1),前两种返回0最匹配,其它值越大越匹配,查极值
    image 原始图像8位或32位的浮点型图像
    templ 模版图像,小于或等原始图像,与它具有相同的类型
    method 匹配方法cv2.TM_SQDIFF/TM_SQDIFF_NORMED/TM_CCPRR/TM_CCORR_NORMED/TM_CCOEFF/TM_CCOEFF_NORMED
    mask 模版图像掩模,和ermpl具有相同的大小和类型,通常默认值即可,仅支持TM_SQDIFF/TM_CCORR_NORMED

  2. 查找最值(极值)与所在的位置
    minVal,maxVal,minLoc,maxLoc = cv2.minMaxLoc(src[,mask])
    minVal,maxVal,minLoc,maxLoc 极值与位置,可以为NULL
    src 单通道数据
    mask 掩模的子集

  3. *取模版图像的宽高时语句
    th,tw = template.shape[::]
    tw,th = template.shape[::-1]

  4. 多模版匹配
    loc = np.where(res >= threshold) 能够获取模版匹配位置的集合
    threshold 预设阀值
    遍历位置
    for i in zip(模版匹配索引集合)
    行列位置互换
    loc[::-1]
    标记各个匹配位置
    for pt in zip(
    loc[::-1])
    cv2.rectangle(img,pt,(pt[0]+w, pt[1]+h), 255, 1)


霍夫变换

  1. 霍夫直线变换
    lines = cv2.HoughLines(image,rho,theta,threshold)
    lines 中每个元素都是一对浮点数,表示检测到的直线参数即(r,0)
    image 源图像8位单通道的二值图像
    rho 以像素为单位的距离r的精度,一般为1
    theta 角度0的精度,一般pi/180,表示搜索所有可能的角度
    threshold 阀值,越小判定出的直线越多

  2. 概率霍夫直线变换
    lines = cv2.HoughLinesP(image,rho,theta,threshold,minLineLength,maxLineGap)
    lines 中每个元素都是一对浮点数,表示检测到的直线参数即(r,0)
    image 源图像8位单通道的二值图像
    rho 以像素为单位的距离r的精度,一般为1
    theta 角度0的精度,一般pi/180,表示搜索所有可能的角度
    threshold 阀值,越小判定出的直线越多
    minLineLength 接受直线的最小长度,默认0
    maxLineGap 接受共线线段之间的最小间隔,即一条线段两点的最大间隔

  3. 霍夫圆环变换,在使用前先进行平滑操作,减少噪声,避免误判
    circles = cv2.HoughCircles(image,method,dp,minDist,param1,param2,minRadius,maxRadius)
    image 源图像8位单通道的灰度图像
    method 检测方法,目前只有HOUGH_GRADIENT两轮检测
    dp 累计器分辨率,分隔比率,为1表示输入图像与累加器有相同的分辨率
    minDist 圆心间的最小间距,被作为阀值使用
    param1 默认100,对应Canny边缘检测器的高阀值(低阀值是高阀值的1/2)
    param2 圆心位置必须收到的投票数,值越大,检测到的圆越少,默认100
    minRadius圆半径的最小值,默认为0,参数不起作用
    maxRadius 圆半径的最大值,默认为0,参数不起作用


图像分隔与提取

分水岭算法cv2.watershed(),形态学函数(各个子图没有连接时),距离变换函数cv2.distanceTransform(),cv2.connectedComponents()
形态学函数用于简单的图像

  1. 距离变换函数 获得前景图像的中心,得到确定前景,还能细化轮廓等多种功能
    dst = cv2.distanceTransform(src,distanceType,maskSize[,dstType])
    dst 计算得到图像,8位或32浮点数,尺寸与src相同
    src 源图像8位单通道的二值图像
    distanceType 距离类型参数cv2.DIST_USER/DIST_L1/DIST_L2/DIST_C/DIST_L12/DIST_FAIR/DIST_WELSCH/DIST_HUBER
    maskSize 掩模尺寸cv2.DIST_MASK_3/DIST_MASK_5/DIST_MASK_PRECISE,当类型为DIST_L1/DIST_C时强制为3
    dstType 目标图像类型,默认CV_32F

未知区域UN = (图像O-确定背景B) – 确定前景
(图像O-确定背景B) 可用图像进行形态学膨胀操作得到

  1. 前景图像标注 背景标注为0,其它对像从1开始正数标注
    retval, labels = cv2.connectedComponents(image)
    retval 返回标注的数量
    labels 标注的结果图像
    image 为8位单通道待标注图像
    为适应分水岭算法,标注的结果都加上数值1,未知区域标注0
    ret, markers = cv2.connectedComponents(fore)
    markers = markers + 1
    markers[未知区域] = 0

  2. 分水岭算法图像分隔
    markers = cv2.watershed(image,markers)
    image 8位三通道图像,在处理前先用正数大致勾画出图像期望分隔的区域
    markers 32位单通道的标注结果,和image具有相等大小,-1为边界

具体使用

# 转为灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# OTSU阈值处理
ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
# 开运算,对原始图像去噪
kernel = np.ones((3, 3), np.uint8)
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel=kernel, iterations=2)
# 对过膨胀,得到确定背景B
sure_bg = cv2.dilate(opening, kernel, iterations=3)
# 利用距离变换,并对其阈值处理,得到确定前景F
dist_transform = cv2.distanceTransform(opening, cv2.DIST_L2, 5)
# 确定前景F 阈值处理
ret, sure_fg = cv2.threshold(dist_transform, 0.7*dist_transform.max(), 255, 0)
sure_fg = np.uint8(sure_fg)
# 计算未知区域UN
unknown = cv2.subtract(sure_bg, sure_fg)
# 对原图像O进行标注
ret, markers2 = cv2.connectedComponents(sure_fg)
# 对标注结果进行修正,适应分水岭算法,将未知区域标注为0
markers2 = markers2 + 1
markers2[unknown == 255] = 0
# 使用分水岭函数进行图像的分割
markers3 = cv2.watershed(img2, markers2)
# 显示彩色分割标记 -1表示边界
img2[markers3 == -1] = [0, 255, 0]
  1. 交互式前景提取
    mask, bgModel, fgModel = cv2.grabCut(img, mask, rect, bgModel, fgModel, iterCount[, mode])
    img 8位3通道
    mask 掩模图像,8位单通道,用于确定区域,确定背景0,确定前景1,可能背景2,可能前景3
    rect 包含前景对象的区域,只有当mode为cv2.GC_INIT_WITH_RECT才有作用,使用掩膜时设为none
    bgModel, fgModel 算法内部使用的数组,只需创建(1,65)大小的numpy.float64数组
    iterCount 迭代次数
    mode 迭代模式 cv2.GC_INIT_WITH_RECT矩形模版,cv2.GC_INIT_WITH_MASK自定义,能与矩形组合使用,cv2.GC_EVAL修复模式,cv2.DC_EVAL_FREEZE_MODEL固定模式

视频处理

  1. 摄像头初始化
    cap = cv2.VideoCapture(摄像头ID或文件名)

  2. 判断摄像头是否初始化成功
    retval = cv2.VideoCapture.isOpened()
    retval True成功 False失败

  3. 初始化失败后打开摄像头
    retval = cv2.VideoCapture.open(摄像头ID或文件名)

  4. 捕获帧
    retval, img = cap.read()
    img 捕获到的帧,没有为空
    retval True成功 False失败

  5. 关闭摄像头
    None= cv2.VideoCapture.cap.release()

  6. 摄像头属性获取
    retval = cv2.VideoCapture.cap.get(propid)
    propid 对象属性 cv2.CAP_PROP_FRAME_WIDTH 宽3 cv2.CAP_PROP_FRAME_HEIGHT 高4 FYI P385

  7. 摄像头属性设置
    retval = cv2.VideoCapture.cap.get(propid, value)

  8. 捕获多个摄像头数据
    retval = cv2.VideoCapture.grab() 指向下一帧
    retval True False 是否成功指向下一帧
    下一步
    retval, image = cv2.VideoCapture.retrieve() 解码并返回一帧
    retval True False 是否成功
    image 返回的视频帧,失败为空图像

  9. VideoWriter 保存视频文件,修改视频属性,类型转换等
    = cv2.VideoWriter(filename,fourcc, fps, frameSize[,isColor])
    filename 输出目标视频的文件路径和文件名
    fourcc 视频编码/解码类型 -1为弹窗口选择
    fps 帧速率
    frameSize 每帧的长和宽
    isColor 是否彩色图像

  10. 写入下一帧视频
    None = cv2.VideoWriter(image)

  11. 释放
    None = cv2.VideoWriter.release()
    out.release()

  12. 指定视频编/解码格式
    cv2.VideoWriter_fourcc(4个字符参数) ‘I’,’4′,’2′,’0′ 未压缩YUV的.avi ‘X’,’V’,’T’,’D’ MPEG-4的.avi 更多参见www.fourcc.org


绘图交互

img 载体图像,画布,画板
color 绘制颜色,注意是BGR,灰度图像只能传入灰度值
thickness 线条粗细,-1 表示填充为实心
lineType 张条类型,默认是8连接类型
shift 数据精度,一般不用设置

  1. 绘制线条
    img = cv2.line(img,pt1,pt2,color,thickness[,lineType])

  2. 绘制矩形
    img = cv2.rectangle(img,pt1,pt2,color[,thickness[,lineType]])

  3. 绘制圆形
    img = cv2.circle(img,center,radius,color[,thickness[,lineType]])
    center 圆心
    radius 半径

  4. 绘制椭圆
    img = cv2.ellipse(img,center,axes,angle,startAngle,endAngle,color[,thickness[,lineType]])
    center 圆心
    axes 轴的长度
    angle 偏转的角度
    startAngle 圆弧起始角的角度
    endAngle 圆弧终结角的角度

  5. 绘制多边形
    img = cv2.polylines(img,pts,isClosed,color[,thickness[,lineType[,shift]]])
    pts 多边形的各个顶点 数组类型为numpy.int32
    isClosed 闭合标记

  6. 图形上绘制文字
    img = cv2.putText(img,text,org,fontFace,fontScale,color[,thickness[,lineType[,bottomLeftOrigin]]])
    text 绘制的文字
    org 绘制的文字位置,以文字的左下角为起点
    fontFace 字体类型,cv2.FONT_HESRESHEY_SIMPLEX …
    fontScale 字体大小
    bottomLeftOrigin 控制文字的方向 默认False,True时垂直镜像的效果

  7. 鼠标交互
    定义响应函数
    def OnMouseAction(event,x,y,flags,param):
    OnMouseAction 响应函数名,可自定
    event 鼠标事件
    x,y 鼠标触发事件时,鼠标在窗口中的坐标
    flags 鼠标的拖拽事件,及键盘鼠标的联合事件
    param 标识所响应的事件函数

函数与窗口绑定
cv2.setMouseCallback(winname,onMouse)
winname 绑定的窗口名
onMouse 响应的函数名

查看opencv所支持的鼠标事件
events = [i for in dir(cv2) if ‘EVENT’ in i]
print(events)

创建窗口
cv2.namedWindows(‘name’)

  1. 滚动条 Trackbar
    cv2.createTrackbar(trackbarname,winname,vlaue,count,onChange)
    trackbarname 滚动条名称
    winname 绑定的窗口名
    vlaue 初始值,决定滚动条中滑块的位置
    count 滚动条取大值,通常最小值为0
    onChange 回调函数

  2. 获取滚动条的值
    retval = getTrackbarPos(trackbarname,winname)
    当作开关使用时,滚动条只有两种值0,1


k邻近算法 cv2.KNearest()

knn = cv2.ml.KNearest_create()
knn.train(trainData,cv2.ml.ROW_SAMPLE,tdLable)
ret,results,neighbours,dist = knn.findNearest(dst,k)
ret
results 可以判定的类型
neighbours 距离当前最近的k个邻居
dist k个最近邻居的距离


支持向量机SVM 基于关键点的分类算法

sk-learn库,LIBSVM库…

生成用于后续训练的空分类器模型
svm = cv2.ml.SVM_create()
训练结果 = svm.train(训练数据,训练数据排列格式,训练数据的标签)
训练数据排列格式 cv2.ml.ROW_SAMPLE 按行 cv2.ml.COL_SAMPLE 按列
(返回值,返回结果) = svm.predict(测试数据)

参数调整:setType()设置类别 setKernel()设置核类型 setC()设置支持向量机的参数C(惩罚系数,对误差的宽容度,默认0)


K均值聚类 无监督学习

retval,bestLabels,centers = cv2.kmeans(data,K,bestLables,criteria,attempts,flags)
retval 距离值,返回每个点到相应中心距离的平方和
bestLabels 各个数据点的最终分类标签(索引)
centers 每个分类的中心点数据
data 待处理的数据集合,np.float32类型,每个特征单独一列中
K 要分出簇的个数,常见2,表示2分类
bestLables 各个数据点的最终分类标签(索引),实际中设为None
criteria 算法迭代的终止条件,达到最大循环数目和指定精度阀值时终止,由3个参数构成type,max_iter,eps
type: cv2.TEEM_CRITERIA_EPS 精度满足 MAX_ITER 迭代次数超过阀值max_iter时停止 _EPS+MAX_ITER两个任意一个满足停止
max_iter 最大迭代次数
eps 精确度的阀值
attempts 使用不用的初始值多次(attempts次)偿试
flags 选择初始中心点的方法,主要有3种cv2.KMEANS_RANDOM_CENTERS 随机 cv2.KMEANS_PP_CENTERS基于中心算法 cv2.KMEANS_USE_INITIAL_LABELS 使用用户输入的数据作为第一次分类的中心点,需要多次偿试时后续使用随机或半随机值作为第一次分类中心点


人脸识别

  1. Haar级联分类器 hog级联分类器(用于行人检测) LBP级联分类器

训练级联分类器
在opencv根目录\bulid\x86\vc12\bin中的opencv_createsamples.exe opencv_traincascade.exe

自带的分类器
在opencv源文件的data文件夹下三个子文件夹

加载级联分类器
= cv2.CascadeClassifier(filename)
在anaconda使用pip安装opencv无法直接获得分类器的xml文件,可在opencv安装目录\data或网上下载相应的xml文件

级联人脸检测使用
objects = cv2.CascadeClassifier.detectMultiScale(image[,scaleFactor[,minNeighbors[,flags[,minSize[,maxSize]]]]])
objects 目标对像的矩形框向量组
image 待检测图像,通常灰度图像
scaleFactor 在前后前后两次相继的扫描中搜索窗口的缩放比例
minNeighbors 构成检测目标的相邻矩形的最小个数,默认为3,提高检测的准确率可设得更大,但可能让一些人脸无法被检测到
flags 能常补省略,在低版1.X时,可能被设置为CV_HAAR_DO_CANNY_RUNNING 表示用canny边缘检测器来拒绝一些区域
minSize 目标的最小尺寸,小于会补忽略
maxSize 目标的最大尺寸,大于会补忽略

  1. 人脸识别:LBPH,EigenFishfaces,fisherfaces

LBPH 局部二值模式直方图
1生成LBPH识别器实例模型
retval = cv2.face.LBPHFaceRecognizer_create([,radius[,neighbors[,grid_x[,grid_y[,thershold]]]]])
radius 半径值,默认为1
neighbors 领域点的个数,默认8
grid_x 特征图划分为一个个单元格时,每个单元格在水平方向上的像素个数,默认8
grid_y 特征图划分为一个个单元格时,每个单元格在垂直方向上的像素个数,默认8
thershold 在预测时所使用的阀值,大于此阀值就认为没有识别到任何目标

2 对每个参考图计算LBPH,得到一向量,每个人的脸都是整个向量的一个点,完成训练
None = cv2.face_FaceRecognizer.train(src, labels)
src 训练图像,用来学习的人脸图像
labels 人脸图像所对应的标签

3检测识别
label, confidence = cv2.face_FaceRecognizer.predict(src)
label 返回的识别结果标签
confidence 返回的置信度评分,0完全匹配,小于50可以接受,大于80差别较大
src 需要识别的图像

EigenFishfaces特征脸,使用成分分析PCA,操作过程中会损失许多特征信息
1生成特征脸识别器实例模型
retval = cv2.face.EigenFaceRecognizer_create([,num_components[,threshold]])
num_components PCA中要保留的分量个数,一般80个就够了
threshold 人脸识别的阀值

2对每个参考图计算,得到一向量,每个人的脸都是整个向量的一个点,完成训练
None = cv2.face_EigenFaceRecognizer.train(src,labels)
src 训练图像,用来学习的人脸图像
labels 人脸图像所对应的标签

3检测识别
label, confidence = cv2.face_EigenFaceRecognizer.predict(src)
label 返回的识别结果标签
confidence 返回的置信度评分,0完全匹配,小于5000可以认为是可靠的,最大值20000
src 需要识别的图像

fisherfaces 线性判断分析LDA
1生成识别器实例模型
retval = cv2.face.FisherFaceRecognizer_create([,num_components[,threshold]])
num_components 线性分析时要保留的分量个数,可设为0,函数自动设置
threshold 识别的阀值,如果最近的距离比设定的阀值还要大,函数返回-1

2对每个参考图计算,得到一向量,每个人的脸都是整个向量的一个点,完成训练
None = cv2.face_FisherFaceRecognizer.train(src,labels)
src 训练图像,用来学习的人脸图像
labels 人脸图像所对应的标签

  1. 检测识别
    label, confidence = cv2.face_EigenFaceRecognizer.predict(src)
    label 返回的识别结果标签
    confidence 返回的置信度评分,0完全匹配,小于5000可以认为是可靠的,最大值20000
    src 需要识别的图像

人脸数据库

  1. CAS-PEAL
    1040位99594幅人脸图像,开放了子集 CAS-PEAL_R1 1040人的30900幅图像

  2. AT&T Facedatabase
    即以前的ORL,40个人400幅

  3. Yale Facedatabase A
    耶鲁人脸数据库,15*11

  4. Extend Yale Facedatabase B
    扩展耶鲁人脸数据库B 28964 16128张

  5. color FERET Database
    1564组,共14126张,由1199个不同拍摄对像重复拍摄,最广泛之一

  6. 人脸数据库整理网站
    opencv推荐 http://face-rec.org/database

opencv

C++
1. brew
brew install homebrew/science/opencv
#若要安装opencv3,如下,可同时存在2与3
brew install homebrew/science/opencv3
or
cd “$(brew –repo)”
git remote set-url origin https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/brew.git
cd “$(brew –repo)/Library/Taps/homebrew/homebrew-core”
git remote set-url origin https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-core.git
cd
brew update
brew install opencv
CLion项目中的CMakeLists.txt
cmake_minimum_required(VERSION 3.9)
project(untitled1)
set(CMAKE_CXX_STANDARD 11)
#find_library(OpenCV)
find_package(OpenCV)
include_directories(${OpenCV_INCLUDE_DIRS})
add_executable(untitled1 main.cpp)
target_link_libraries(untitled1 ${OpenCV_LIBS})
如果出现一些cmake莫名其妙的错误,可以进入Tools | CMake | Reset Cache and Reload Project清空一下CMake缓存。
选中“WITH_OPENGL”、“WITH_QT”,将“WITH_IPP”取消。然后再次点【Configure】
1. 源码 https://opencv.org/releases/
在Download/opencv-3.4.2/创建build文件夹用来存编译后文件
cmake.org/download/
打开CMake,填好OpenCV路径和build的路径->configure->Done->等->Generate
打开终端,用cd命令进入build文件夹目录,然后输入命令make
然后,等它编译到100%,然后输入命令 sudo make install

编译命令为:g++ Cpp_Opencv.cpp -o Cpp_Opencv `pkg-config --cflags --libs opencv`
或者直接将链接库列出来:g++ Cpp_Opencv.cpp  -L/usr/local/lib/ -lopencv_highgui.3.4.2 -lopencv_core.3.4.2 -lopencv_imgcodecs

python
pip安装
https://pypi.org/project/opencv-python/
opencv_python-4.3.0.36-cp37-cp37m-macosx_10_9_x86_64.whl
pip安装opencv无法在pycharm的anconda环境找到扩展包解决方案
不要直接pip install,进入D:\anaconda3\Scripts
将pip.exe和pip-script.py修改为condapip.exe和condapip-script.py(不加conda加别的也行,只为了和系统pip区分开)
condapip install opencv_python-4.3.0.36-cp37-cp37m-macosx_10_9_x86_64.whl
之后刷新pycharm interpretor或者重启一下,就可以成功在pycharm anaconda环境下import cv2了。

a. Packages for standard desktop environments (Windows, macOS, almost any GNU/Linux distribution)

run pip install opencv-python if you need only main modules
run pip install opencv-contrib-python if you need both main and contrib modules (check extra modules listing from OpenCV documentation)

b. Packages for server (headless) environments
These packages do not contain any GUI functionality. They are smaller and suitable for more restricted environments.

run pip install opencv-python-headless if you need only main modules
run pip install opencv-contrib-python-headless if you need both main and contrib modules (check extra modules listing from OpenCV documentation)

Import the package:
import cv2

conda install –channel https://conda.anaconda.org/menpo opencv3
conda install -c menpo opencv3


![](https://pic.ikafan.com/imgp/L3Byb3h5L2h0dHBzL2ZpbGVzLmpiNTEubmV0L2ZpbGVfaW1hZ2VzL2FydGljbGUvMjAxOTAzLzIwMTkwMzIyMDk1NDA1MTcuanBn.jpg)