轮廓可以简单地解释为一条曲线,连接所有连续点(沿边界),具有相同的颜色或强度。轮廓线是一个有用的工具,形状分析和目标检测和识别。
为了提高精确度,可以使用二进制图像。因此,在找到轮廓之前,应用阈值或canny边缘检测。
由于OpenCV 3.2, find等值线()不再修改源图像,而是返回一个修改后的图像作为三个返回参数中的第一个。
在OpenCV中,寻找轮廓就像从黑色背景中寻找白色物体。所以记住,要找到的对象应该是白色的和黑色的背景。
import numpy as np
import cv2 as cv
import os
img_path="\home\wuming\mydoc\data"
img_path=os.path.join(img_path,'5.jpg')
im = cv.imread("5.jpg")
#print(len(im))
img_gray = cv.cvtColor(im, cv.COLOR_BGR2GRAY)
ret, thresh = cv.threshold(img_gray, 127, 255, 0)
cv.imshow("thresh",thresh)
im2, contours, hierarchy = cv.findContours(thresh, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)
cv.imshow("im2",im2)
cv.imwrite("im2.jpg",im2)
cv.drawContours(im, contours, -1, (0,255,0), 3)
cv.imshow("result",im)
cv.imwrite("result.jpg",im)
cv.waitKey(0)
cv.destroyAllWindows()
cv.findContours()函数有三个参数,第一个是源图像,第二个是轮廓检索模式,最后一个是轮廓逼近方法。输出修改后的图像、轮廓和层次结构。轮廓是一个所有轮廓组成的Python列表的。每个单独的轮廓是对象边界点(x,y)的Numpy数组。
为了华轮廓,要用cv.drawContours()它还可以用于绘制任何形状,只要你有边界点。它的第一个参数是源图像,第二个参数是应该作为Python列表传递的轮廓,第三个参数是轮廓的索引(有用的时候画单独的轮廓。绘制所有的轮廓,通过-1)和其余的参数是颜色,厚度等。(https://docs.opencv.org/3.4.8/d6/d6e/group__imgproc__draw.html#ga746c0625f1781f1ffc9056259103edbc)