矩(Moments)
图像矩可以帮助你计算一些特征, 例如对象的质心, 对象的面积等等. 具体可参考 Image Moments
函数**cv.moments()** 返回一个所有矩值的字典
import numpy as np import cv2 as cv img = cv.imread('star.jpg',0) ret,thresh = cv.threshold(img,127,255,0) im2,contours,hierarchy = cv.findContours(thresh, 1, 2) cnt = contours[0] M = cv.moments(cnt) print( M )
通过这些矩值, 你可以计算出有用的数据, 例如面积, 质心等等. 质心可以通过关系(Cx=M10/M00 and Cy=M01/M00)来获得. 通过如下计算获得
cx = int(M['m10']/M['m00']) cy = int(M['m01']/M['m00'])
轮廓面积
轮廓面积可以通过函数**cv.contourArea()**获得, 或者通过 M['m00']
area = cv.contourArea(cnt)
轮廓周长
轮廓周长可以使用**cv.arcLength()** 获得. 第二个参数指定图形是否闭环(如果是则为 True), 否则只是一条曲线.
perimeter = cv.arcLength(cnt,True)
轮廓逼近
它逼近一个轮廓形状到另一个顶点数目较少的形状, 这取决于我们指定的精度. 它是 Douglas-Peucker algorithm 算法的一种实现.
第一个参数是轮廓
第二个参数称为 ε, 它是从轮廓到近似轮廓的最大距离. 这是一个准确的参数。为了得到正确的输出, 需要明智地选择 ε。
epsilon = 0.1*cv.arcLength(cnt,True) approx = cv.approxPolyDP(cnt,epsilon,True)
如下的第二张图是 ε 设定为 10% 的结果, 第三张图是 ε 设定为 1% 的结果.
边框
直边界矩形
x,y,w,h = cv.boundingRect(cnt) cv.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
旋转矩形
rect = cv.minAreaRect(cnt) box = cv.boxPoints(rect) box = np.int0(box) cv.drawContours(img,[box],0,(0,0,255),2)
绿框是直边界矩形, 红框是旋转矩形
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于