图像轮廓
和图像边缘不一样,边缘不连续。将边缘连接成一个整体构成轮廓。
提取图像轮廓的方法:先调用cv2.findContours(),后调用cv2.drawCont()
cv2.findCount函数使用方法:
参数mode的几种方式:
参数method的几种方法:
轮廓特征:
cv2.moments()会将计算得到的矩以一个字典的形式返回。
轮廓面积可以使用函数 cv2.contourArea() 计算得到
轮廓周长:cv2.arcLength(cnt,True) 函数的第二个参数用来指定对象的形状是闭合的(True),还是打开的。
轮廓近似:cv2.approxPolyDP(cnt,epsilon,True)
凸包:函数cv2.convexHull() 可以用来检测一个曲线是否具有凸性缺陷并能纠正凸性缺陷。凸性曲线总是凸出来的,至少是平的。如果有地方凹去了就叫做凸性缺陷。
凸性检测:cv2.isContourConvex()可以用来检测一个曲线是不是凸的,返回True和False。
边界矩形:直边界矩形和旋转的边界矩形。
直边界矩形:面积不是最小的。x,y,w,h=cv2.boundingRect()。x,y,为矩形左上角的坐标,w,h为矩形的宽和高
旋转的边界矩形:面积最小。考虑了对象的旋转。cv2.minAreaRect())。返回的是一个 Box2D 结构,其中包含矩形左上点的坐标x,y矩形的宽和高w,h以及旋度。但是绘制个矩形矩形的 4 个点可以函数cv2.boxPoints() 获 得。
最小外接圆:cv2.minEnlosingCircle()
椭圆拟合:旋转边界矩形的内切圆 cv2.fitEllipse(cnt)
形状匹配:cv2.matchShape()可以帮我们比较两个形状或轮廓的相似度。返回值越小,匹配越好。
getStructuringElement
构建一个核。前面腐蚀膨胀的numpy构建的结构化元素是正方形的
getStructuringElement 与 Numpy 定义的元素结构是完全一样的这个函数的第一个参数表示内核的形状,有三种形状可以选择。
矩形:MORPH_RECT;
交叉形:MORPH_CROSS;
椭圆形:MORPH_ELLIPSE;
第二和第三个参数分别是内核的尺寸以及锚点的位置。对于锚点的位置,有默认值(-1,-1),表示锚点位于中心点。element形状唯一依赖锚点位置,其他情况下,锚点只是影响了形态学运算结果的偏移。
透视变换
在不同的视觉拍摄同一个物体,会有不同的图像。透视变换就是类似于改变拍摄物体的角度
仿射变换:由平移、错切、缩放、反转、旋转复合而成,是透视变换的特殊形式
OpenCV提供了两个变换函数cv2.warpAffine(仿射变换)和cv2.warpPerspective(透视变换) ,cv2.warpAffine 接收的参数是 2×3 的变换矩阵,而cv2.warpPerspective 接收的参数是 3×3 的变换矩阵。
函数cv2.warpAffine() 的第三个参数的是输出图像的大小。它的格式应是图像的(宽,高)。注意的是图像的宽对应的是列数,高对应的是行数。可以实现图片平移。可以和cv2.getAffineTransform配合使用
其中两个参数是变换前后的位置关系
函数cv2.warpPerspective配合cv2.getPerspectiveTransform()使用。同时可以用findHomography返回的单应性矩阵。
getPersonspectiveTransform得出变换矩阵:
得出变换矩阵以后用warpPerspective():第一个参数是输入图像,M是变换矩阵,第三个参数是输出图像的大小
findHomography:提供正确估计的好的匹配被叫做inliers,而其他的叫做outliers。cv2.findHomography()返回一个掩图来指定inline和outline。第一个和第二个参数分别是原图像和目的图像,第三个参数可选为cv2.RANSAC、cv2.LMEDS.第二个参数取值范围在1到10。
getPerspectiveTransform和findHomography的区别: