OpenCV-图像轮廓 轮廓特征、轮廓周长和面积、轮廓近似、外接矩形和外接圆

目录

  • 概念
  • 代码实现
  • 得到轮廓之后,计算轮廓的周长和面积
  • 轮廓近似
  • 外接矩形和外接圆

概念

OpenCV-图像轮廓 轮廓特征、轮廓周长和面积、轮廓近似、外接矩形和外接圆_第1张图片
OpenCV-图像轮廓 轮廓特征、轮廓周长和面积、轮廓近似、外接矩形和外接圆_第2张图片
OpenCV-图像轮廓 轮廓特征、轮廓周长和面积、轮廓近似、外接矩形和外接圆_第3张图片
OpenCV-图像轮廓 轮廓特征、轮廓周长和面积、轮廓近似、外接矩形和外接圆_第4张图片

代码实现

OpenCV-图像轮廓 轮廓特征、轮廓周长和面积、轮廓近似、外接矩形和外接圆_第5张图片
OpenCV-图像轮廓 轮廓特征、轮廓周长和面积、轮廓近似、外接矩形和外接圆_第6张图片

OpenCV-图像轮廓 轮廓特征、轮廓周长和面积、轮廓近似、外接矩形和外接圆_第7张图片
OpenCV-图像轮廓 轮廓特征、轮廓周长和面积、轮廓近似、外接矩形和外接圆_第8张图片
OpenCV-图像轮廓 轮廓特征、轮廓周长和面积、轮廓近似、外接矩形和外接圆_第9张图片
OpenCV-图像轮廓 轮廓特征、轮廓周长和面积、轮廓近似、外接矩形和外接圆_第10张图片
OpenCV-图像轮廓 轮廓特征、轮廓周长和面积、轮廓近似、外接矩形和外接圆_第11张图片
OpenCV-图像轮廓 轮廓特征、轮廓周长和面积、轮廓近似、外接矩形和外接圆_第12张图片
OpenCV-图像轮廓 轮廓特征、轮廓周长和面积、轮廓近似、外接矩形和外接圆_第13张图片
OpenCV-图像轮廓 轮廓特征、轮廓周长和面积、轮廓近似、外接矩形和外接圆_第14张图片

得到轮廓之后,计算轮廓的周长和面积

得到轮廓的周长和面积

使用cv2.findCountor获得的轮廓contours是一个嵌套的类型,即我们可以通过cnt = contours获得第25个物体的轮廓值

cnt = contours[24]
#面积
cv2.contourArea(cnt)
length= cv2.arcLength(cnt, True)
print(area, length)

OpenCV-图像轮廓 轮廓特征、轮廓周长和面积、轮廓近似、外接矩形和外接圆_第15张图片
OpenCV-图像轮廓 轮廓特征、轮廓周长和面积、轮廓近似、外接矩形和外接圆_第16张图片

轮廓近似

轮廓不规则,然后让他近似为规整的。
OpenCV-图像轮廓 轮廓特征、轮廓周长和面积、轮廓近似、外接矩形和外接圆_第17张图片
OpenCV-图像轮廓 轮廓特征、轮廓周长和面积、轮廓近似、外接矩形和外接圆_第18张图片
有点类似于不断二分
OpenCV-图像轮廓 轮廓特征、轮廓周长和面积、轮廓近似、外接矩形和外接圆_第19张图片

# 轮廓近似
img = cv2.imread('girl.png')#读入图片
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)#灰度图
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)#二值变化

contours, h = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)#获得图片的轮廓值

cnt = contours[24]

# 使用周长的倍数作为阈值,阈值越小,图像的轮廓近似与轮廓越近似
epsilon = 0.1 * cv2.arcLength(cnt, True)

approx = cv2.approxPolyDP(cnt, epsilon, True)

draw_img = img.copy()
ret = cv2.drawContours(draw_img, [approx], -1, (0, 0, 255), 2)
cv_show(ret, 'ret')

OpenCV-图像轮廓 轮廓特征、轮廓周长和面积、轮廓近似、外接矩形和外接圆_第20张图片

OpenCV-图像轮廓 轮廓特征、轮廓周长和面积、轮廓近似、外接矩形和外接圆_第21张图片
OpenCV-图像轮廓 轮廓特征、轮廓周长和面积、轮廓近似、外接矩形和外接圆_第22张图片
OpenCV-图像轮廓 轮廓特征、轮廓周长和面积、轮廓近似、外接矩形和外接圆_第23张图片

外接矩形和外接圆

外接矩形: 使用cv2.boudingrect(cnt)获得轮廓的外接矩形,使用cv2.rectangle(img, (x, y), (x+w, y+h), (0, 0, 255), 2)画出矩阵的轮廓

外接圆: 使用cv2.minEnclosingCircle(cnt)获得轮廓的外接圆,使用cv2.circle(ret, centers, radius, (0, 0, 255), 2)画出圆的轮廓

代码:

第一步:载入图片,灰度化,二值化,使用cv2.findCountors找出图像的轮廓,使用轮廓索引获得第一个轮廓cnt

第二步:使用cv2.boundingrect(cnt) ,获得轮廓的x,y,w, h (x, y)表示左上角的坐标,w为宽,h为长

第三步: 使用cv2.rectangle 绘制外接的轮廓

第四步: 使用cv2.minEnclosingCircle(cnt), 获得center和radius,即圆心点的坐标和圆的半径

第五步: 使用cv2.circle(img, center, radius, (0, 0, 255), 2) 绘制圆心的外接轮廓

# 外接矩阵

img = cv2.imread('girl.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
res, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)

contours, h = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)

cnt = contours[24]

x, y, w, h = cv2.boundingRect(cnt)

ret = cv2.rectangle(img, (x, y), (x+w, y+h), (0, 0, 255), 2)
cv_show(ret, 'ret')

print('矩形面积 / 外接矩形面积', cv2.contourArea(cnt) / (w*h))
矩形面积 / 外接矩形面积 0.6702044025157232

OpenCV-图像轮廓 轮廓特征、轮廓周长和面积、轮廓近似、外接矩形和外接圆_第24张图片

OpenCV-图像轮廓 轮廓特征、轮廓周长和面积、轮廓近似、外接矩形和外接圆_第25张图片

#外接圆
(x, y), radius = cv2.minEnclosingCircle(cnt)
center = (int(x), int(y))
radius = int(radius)
ret = cv2.circle(ret, center, radius, (0, 255, 0), 2)
cv_show(ret, 'ret')

OpenCV-图像轮廓 轮廓特征、轮廓周长和面积、轮廓近似、外接矩形和外接圆_第26张图片
参考链接

你可能感兴趣的:(OpenCV,Python,opencv,caffe,深度学习)