opencv for python (17) 绘制轮廓、轮廓特征

函数 cv2.findContours() 有三个参数,第一个是输入图像,第二个是轮廓检索模式,第三个是轮廓近似方法。返回值有两个,第一个是图像,第二个是轮廓,第三个是(轮廓的)层析结构。轮廓(第一个返回值)是一个 Python列表,其中存储这图像中的所有轮廓。每一个轮廓都是一个 Numpy 数组,包含对象边界点(x,y)的坐标。
函数 cv2.drawContours() 可以被用来绘制轮廓。它可以根据你提供的边界点绘制任何形状。它的第一个参数是原始图像,第二个参数是轮廓,一个 Python 列表。第三个参数是轮廓的索引(在绘制独立轮廓是很有用,当设置为 -1 时绘制所有轮廓)。接下来的参数是轮廓的颜色和厚度等

import cv2   
import numpy as np  

im = cv2.imread('t1_1.png')
imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(imgray,150,255,0)
contours,hierarchy=cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(imgray,contours,-1,(125,15,125),2)
cv2.imshow('original',im)
cv2.imshow('thresh',thresh)
cv2.imshow('final',imgray)
cv2.waitKey(0)

图像的矩可以帮助我们计算图像的质心,面积等
函数 cv2.moments() 会将计算得到的矩以一个字典的形式返回
根据这些矩M的值,我们可以计算出对象的重心
cx = int(M[‘m10’]/M[‘m00’])
cy = int(M[‘m01’]/M[‘m00’])
函数 cv2.contourArea() 计算得到轮廓的面积
函数 cv2.arcLength() 计算得到轮廓的周长,第二参数可以用来指定对象的形状是闭合的(True),还是打开的(一条曲
线)
假设我们要在一幅图像中查找一个矩形,但是由于图像的种种原因,我们不能得到一个完美的矩形,而是一个“坏形状”(如下图所示)。现在就可以使用这个函数来近似这个形状()了。这个函数的第二个参数叫
epsilon,它是从原始轮廓到近似轮廓的最大距离。它是一个准确度参数。选择一个好的 epsilon 对于得到满意结果非常重要。
opencv for python (17) 绘制轮廓、轮廓特征_第1张图片
opencv for python (17) 绘制轮廓、轮廓特征_第2张图片
opencv for python (17) 绘制轮廓、轮廓特征_第3张图片

import cv2   
import numpy as np  

im = cv2.imread('t1_.png')
imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(imgray,180,255,cv2.THRESH_BINARY)
contours,hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
cnt = contours[0]
epsilon = 0.07*cv2.arcLength(cnt,True)
approx =  cv2.approxPolyDP(cnt,epsilon,True)
cv2.drawContours(imgray,[approx],-1,(125,25,0),5)
cv2.imshow('a',im)
cv2.imshow('b',thresh)
cv2.imshow('c',imgray)
cv2.waitKey(0)
M = cv2.moments(cnt)
cx = int(M['m10']/M['m00'])
cy = int(M['m01']/M['m00'])
area = cv2.contourArea(cnt)
perimeter = cv2.arcLength(cnt,True)
print cx,cy,area,perimeter

你可能感兴趣的:(opencv for python (17) 绘制轮廓、轮廓特征)