个人比较喜欢总分的方式处理问题,所以在处理一个个方法之前会做个总结,先看看都有那些方法,然后根据需求来进行选择,这里总结的虽然不是很全面,不过可以先看看,后面会对每个方法使用指出些例子:
*OpenCV模块*
Core模块(OpenCV基本数据结构)
图像求和:addWeighted
矩阵掩码:filter2D
绘图: line ->直线 ellipse->椭圆 rectangle ->矩形 circle ->圆 fillPoly-> 填充多边形
rng:随机数生成器
imgproc模块(OpenCV中图像处理函数)
平滑处理(模糊) 归一化滤波:blur
高斯模糊:GaussianBlur
中值滤波 :medianBlur
双边滤波:bilaterlFilter
腐蚀与膨胀
腐蚀:erode
膨胀:dilate
形态学变换
开运算 :先腐蚀再膨胀:Opening
闭运算 :先膨胀再腐蚀:Closing
形态梯度: 膨胀图与腐蚀图之差(保留物体边缘轮廓):Morphological Gradient
顶帽 : 原图像与开运算之差:Top Hat
黑帽 : 闭图像与原图像之差:Black Hat
图像金字塔
放大:pyrUp
缩小:pyrDown
阈值操作
二进制阈值化(THRESH_BINARY) -> 大于阈值为1 小于阈值为0
反二进制阈值化(THRESH_BINARY_INV) -> 大于阈值为0 小于阈值为1
截断阈值化(THRESH_TRUNC) -> 大于阈值为阈值,小于阈值不变
阈值化为0 (THRESH_TOZERO) -> 大于阈值的不变,小于阈值的全为0
反阈值化为0(THRESH_TOZERO_INV) -> 大于阈值为0,小于阈值不变
滤波器:filter2D
给图像添加边界:copyMakeBorder
使用常数填充边界 BORDER_CONSTANT
复制原图中最临近的行或者列 BORDER_REPLICATE
Sobel导数
Sobel算子是离散微分算子,计算图像灰度函数的近似梯度
Sobel算子结合了高斯平滑和微分求导
Laplace算子
使用二阶导数来检测边缘。因为图像是’二维’,所以我们要在两个方向求导
Laplace使用了图像梯度,在内部调用了Sobel算子
Canny边缘检测
多级边缘检测算法,被很多人认为是边缘检测的
最优算法
低错误率,高定位性,最小响应
霍夫线变换 HoughLines,HoughLinesP
霍夫线变换是一种用来寻找直线的方法
是用霍夫线变换之前,首先要对图像进行边缘检测处理,也即霍夫线变换的直接输入
只能是边缘
二值图像
霍夫圆变换:HoughCircles
在图像中检测圆
重映射:Remapping
仿射变换 :任意一个仿射变换都能表示为乘以一个矩阵(线性变换)再加上一个向量(平移) 可以使用warpAffine来实现一些简单的重映射。使用getRotationMatrix2D来获得矩阵
直方图均衡化:直方图均值化是通过拉伸像素强度分布范围来增强对比度的一种方法,相当于给直方图进行了拉伸
直方图计算
split 将图像分割成单通道数组
直方图是对数据的集合统计,并将结果分布于一系列预定义的子区域(bin)中
calcHist 计算图像阵列的直方图
直方图的数据不仅仅指的是灰度图,统计数据可能是任何有效描述图像的特征
normalize归一化数组
直方图对比:compareHist
表达两个直方图的相似度的数值
反向投影
calcBackProject计算反射投影
反向投影是一种记录给定图像中的像素点如何适应直方图模型像素分布的方式
即计算某一特征的直方图模型,然后使用模型去寻找图像中存在的特征
模板匹配
matchTemplate在模板块和输入图像之间寻找匹配,获得匹配结果图像
mixMaxLoc 在给定的矩阵中寻找最大和最小值(包括位置)
在图像中寻找轮廓
findContours 寻找轮廓
drawContours 绘制轮廓
计算物体的凸包:convexHull
创建包为轮廓的矩形和圆形边界
boundingRect 来计算包围轮廓的矩形框
minEnclosingCircle 来计算完全包为已有轮廓最小圆
创建课倾斜的边界框和椭圆
minAreaRect 计算最小包围区域
fitEllipse 用来计算最小包围椭圆
轮廓矩
moments 计算图像所有矩(最高到三阶)
contourArea 计算轮廓面积
arcLength 计算轮廓或曲线长度
多边形测试
pointPolygonTest 判断一个点是否在轮廓内
highgui模块(读取/保存图像/视频文件以及如何使用库的内置图形用户界面的)
为程序界面添加滑动条:createTrackbar
在窗口添加一个滑动条
calib3d模块(从2D图像中找到有关3D世界的信息)
使用棋盘格来进行摄像机标定
1.载入图片
2.findChessboardCorners来检测图片中的棋盘
3.定义容器,存放三维坐标
4.从XML/YAML文件中读取摄像机参数
5.执行solvePnP,找到棋盘姿势
6.计算投影误差,参照calibration(computeReprojectionErrors)
这个当时没做笔记,好像是用matlab得到的自己想要的参数,获得的内参还是外参的值,下面会写出摄像机校准的步骤,具体实践看看有没有时间吧,再继续做,当时没有完全做完。
使用OpenCV进行摄像机校准
考虑到径向和切向的因素,径向扭曲的存在表现为’桶’或’鱼眼’效应
由于摄像机不完全平行于成像平面,出现切向畸变
1.设置寻找亚像素角点的参数,采用的停止准则是最大循环次数30和最大误差容限0.001
criteria = (cv2.TERM_CRITERIA_MAX_ITER | cv2.TERM_CRITERIA_EPS, 30, 0.001)
2.在图像中寻找角点
corners = cv2.findChessboardCorners(gray, (row, col), None)
3.在原角点中寻找亚像素角点
corners2 = cv2.cornerSubPix(gray, corners, (3, 3), (-1, -1), criteria)# 在原角点的基础上寻找亚像素角点
4.在图像中绘制角点
cv2.drawChessboardCorners(img, (row, col), corners, ret)
5.标定
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(obj_points, img_points, size, None, None)
mtx : 内参矩阵
dist: 畸变系数5个
rvecs : 旋转向量,外参
tvecs : 平移向量,内参
6.畸变矫正
newcameramtx, roi = cv2.getOptimalNewCameraMatrix(mtx, dist, (w, h), 1, (w, h))
7.去除畸变(undistort)
dst = cv2.undistort(img, mtx, dist, None, newcameramtx)
上面的方法是Pycharm的,大家可以看下Pycharm的opencv方法
举个最通用的例子吧,图像处理中的读取图片,我们看下Pycharm这里的定义:
img = cv2.imread(“D: est.png”)
python里面类型是不需要你去定义的,所以设置一个变量,然后让它等于后面方法的值就ok了
看如何使用这个方法,跳进定义方法里面:
这里我们看第三行,就是让我们用这个方法指定到一个变量上面去,后面等于的变量可能会有很多种,那么我举个例子(2个值的,多的同理):
test1,test2 = cv2.某一个方法(方法参数)
这里这样写就可以了
feature2d模块(OpenCV中的特征点检测,特征点描述,以及匹配算法)
Harris 角点检测
cornerHarris函数 通过 Harris-Stephens方法检测角点
因为角点是两个边缘的连接点,它代表了两个边缘变化的方向上的点。图像梯度有很高的变化。这种变化是可以用来帮助检测角点的。
Shi-Tomasi 角点检测
使用goodFeaturesToTrack来调用Shi-Tomasi方法检测角点
定制化创建检点检测
使用OpenCV函数cornerEigenValsAndVecs来计算像素对应的本征值和本征向量
来确定其是否是角点
使用OpenCV函数cornerMinEigenVal通过最小化本征值来进行角点检测实现一个
定制化的Harris detector ,类似Shi-Tomasi算子
亚像素级的角点检测
使用OpenCV函数cornerSubPix寻找更精确的角点位置
(不是整数类型的位置,而是更加精确的浮点类型位置)
特征点检测
使用FeatureDetector来发现感兴趣的点
使用SurfFeatureDetector以及detect来实现检测过程
使用函数drawKeypoints来绘制检测到的关键点
特征描述
使用DescriptorExtractor接口来寻找关键点对应的特征向量
使用SurfDescriptorExtracotr以及其函数compute来完成特定的计算
使用BruteForceMatcher来匹配特征向量
使用函数drawMatches来绘制检测到的匹配点
使用FLANN进行特征点匹配
使用FlannBasedMathcer接口以及FLANN实现快速高效匹配
(快速最近邻逼近搜索函数库(Fast Approximate Nearest Neighbor Search Library))
使用二维特征点(Features2D)和单映射(Homography)寻找已知物体
使用函数findHomography寻找匹配上的关键点的变换
使用函数perpectiveTransform来映射点
平面物体检测
使用features2d和calib3d模式来检测场景中的已知平面物体
video模块(视频流算法的使用,如:运动提取,特征跟踪和前景提取,图像差值法(二帧差,三帧差,光点检测法))
我这里没用Pycharm接入视频流,后面做些补充
objectect模块
级联分类器
使用CascadeClassifier类来检测视频流中的物体
特别地,我们将使用函数:load来加载一个.xml分类器文件。
它既可以是Harr特征也可以是LBP特征的分类器
detectMultiScale来进行图像的多尺度检测
ml模块 (机器学习:使用功能强大的机器学习类进行统计分类,回归和数据聚类)
暂时还没跟机器学习打交道,等有机会我做个实验尝试下,不然总感觉缺点啥。