1 实验目的
熟悉opencv读入图片,高斯去噪,二值化,绘制目标矩形边框。
2 实验设备
安装了python和pychrm的电脑一台。
3 实验内容
包含图片的导入、绘制矩形、显示图片。
4实验原理
opencv中轮廓特征包括:如面积,周长,质心,边界框等。
我们将图像二值化后,用findContours函数就可以很方便的找出图像的轮廓信息,循环遍历每一个信息点,cv2.boundingRect()函数再计算轮廓的垂直边界最小矩形,矩形是与图像上下边界平行的,cv2.rectangle函数画出来即可。
函数原型:
findContours( image,mode, method, Point offset=Point())
第一个参数:image,单通道图像矩阵,可以是灰度图,但更常用的是二值图像,一般是经过Canny、拉普拉斯等边缘检测算子处理过的二值图像。
第二个参数:mode 检索轮廓的模式,若取值一:CV_RETR_EXTERNAL只检测最外围轮廓,包含在外围轮廓内的内围轮廓被忽略。
取值二:CV_RETR_LIST 检测所有的轮廓,包括内围、外围轮廓,但是检测到的轮廓不建立等级关系,彼此之间独立,没有等级关系,这就意味着这个检索模式下不存在父轮廓或内嵌轮廓。
取值三:CV_RETR_CCOMP 检测所有的轮廓,但所有轮廓只建立两个等级关系,外围为顶层,若外围内的内围轮廓还包含了其他的轮廓信息,则内围内的所有轮廓均归属于顶层。两个等级关系:顶层为连通域的外围边界,次层为孔的内层边界。
取值四:CV_RETR_TREE, 检测所有轮廓,所有轮廓建立一个等级树结构。外层轮廓包含内层轮廓,内层轮廓还可以继续包含内嵌轮廓。
第三个参数:int型的method,定义轮廓的近似方法:
取值一:CV_CHAIN_APPROX_NONE 保存物体边界上所有连续的轮廓点到contours向量内。
取值二:CV_CHAIN_APPROX_SIMPLE 仅保存轮廓的拐点信息,把所有轮廓拐点处的点保存入contours向量内,拐点与拐点之间直线段上的信息点不予保留
取值三和四:CV_CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS使用teh-Chinl chain 近似算法。
findContours函数最终会返回三个值,第一个是图像,其中找到的轮廓信息都会被保存到第二个参数contours列表里,其中存储这图像中的所有轮廓;第三个参数是(轮廓的)层析结构,这是一个ndarray,其中的元素个数和轮廓个数相同,对于每个轮廓contours[i]对应4个hierarchy元素hierarchy[i][0] ~hierarchy[i][3],分别表示后一个轮廓、前一个轮廓、父轮廓、内嵌轮廓的索引编号,如果没有对应项,则该值为负数。每一个轮廓都是一个 Numpy 数组,包含对象边界点(x,y)的坐标。
绘制轮廓
函数 cv2.drawContours() 可以被用来绘制轮廓。它可以根据你提供的边界点绘制任何形状。它的第一个参数是原始图像,第二个参数是轮廓,一个 Python 列表。第三个参数是轮廓的索引(在绘制独立轮廓是很有用,当设置为 -1 时绘制所有轮廓)。接下来的参数是轮廓的颜色和厚度等。
import numpy as np
import cv2
im = cv2.imread('../images/numb.png')
imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(imgray,127,255,0)
image, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
绘制独立轮廓,如第四个轮廓。
img = cv

最低0.47元/天 解锁文章
1015

被折叠的 条评论
为什么被折叠?



