有两种类型的边框
它是一个直边界矩形,它不考虑对象的旋转。所以矩形的面积不会最小。由cv.boundingRect()函数实现。
x, y, w, h = cv.boundingRect(cnt)
print(x, y, w, h)
cv.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
cv.imshow("img", img)
cv.waitKey()
在这里,边界矩形是用最小面积绘制的,所以它也考虑了旋转。使用的函数是cv.minarerect()。
它返回一个Box2D结构的数据,具体细节如下——(中心(x, y),(宽度、高度),转动角)。但是要画这个矩形,
rect = cv.minAreaRect(cnt)
box = cv.boxPoints(rect)
box = np.int0(box)
cv.drawContours(img, [box], 0, (0, 0, 255), 2)
两个矩形都显示在一个单独的图像中。绿色矩形显示普通边界矩形。红色矩形是旋转后的矩形。
接下来,我们使用函数cv.minEnclosingCircle()来查找对象的外圆。它是以最小面积完全覆盖物体的圆。
(x, y), radius = cv.minEnclosingCircle(cnt)
center = (int(x), int(y))
radius = int(radius)
cv.circle(img, center, radius, (0, 255, 0), 2)
下一个是将椭圆拟合到对象。它返回内接旋转矩形椭圆。
print("cnt:", cnt)
ellipse = cv.fitEllipse(cnt)
cv.ellipse(img, ellipse, (0, 255, 0), 2)
类似地,我们可以将一条直线拟合到点集上。下面的图像包含一组白色的点。我们可以把它近似成一条直线。
rows, cols = img.shape[:2]
[vx, vy, x, y] = cv.fitLine(cnt, cv.DIST_L2, 0, 0.01, 0.01)
lefty = int((-x * vy / vx) + y)
righty = int(((cols - x) * vy / vx) + y)
cv.line(img, (cols - 1, righty), (0, lefty), (0, 255, 0), 2)
cv.imshow("line", img)
cv.waitKey()
https://docs.opencv.org/4.x/d5/d45/tutorial_py_contours_more_functions.html
https://docs.opencv.org/4.x/dd/d49/tutorial_py_contour_features.html
本文是OpenCV图像视觉入门之路的第15篇文章,本文详细的介绍了图像轮廓检测的各种操作,例如:轮廓检索模式、轮廓逼近算子等操作。
图像轮廓是具有相同颜色或灰度的连续点的曲线,轮廓在形状分析和物体的检测和识别中很有用。图像轮廓的作用:图形分析、物体的检测和识别。
需要注意的是:为了检测的准确性,需要先对图像进行二值化或Canny操作; 画轮廓时会修改输入的图像,如果之后想继续使用原始图像,应该将原始图像存储到其他变量中。
简 介: 本文对于OpenCV中的轮廓检测算法进行了讨论,可以看到一些基于轮廓检测的应用。接着对四种不同的提取方式的结果进行了讨论。你还了解了如何将轮廓进行绘制的方法。
关键词: 轮廓检测,二值化
#mermaid-svg-OXATIvUPho88S9L2 .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-O..
边缘检测虽然能够检测出边缘,但边缘是不连续的,检测到的边缘并不是一个整体。图像
轮廓是指将边缘连接起来形成的一个整体,用于后续的计算。OpenCV 提供了查找图像轮廓的函数 cv2.findContours(),该函数能够查找图像内的轮廓信
息,而函数 cv2.drawContours()能够将轮廓绘制出来。
contours, hierarchy = cv2.findContours( image, mode, method)
式中的返回值为:
contours:返回的轮廓
RETR_EXTERNAL :只检索最外面的轮廓;
RETR_LIST:检索所有的轮廓,并将其保存到一条链表当中;
RETR_CCOMP:检索所有的轮廓,并将他们组织为两层:顶层是各部分的外部边界,第二层是空洞的边界;
RETR_TREE:检索所有的轮廓,并重构嵌套轮廓的整个层次;
method:轮廓逼近方法
CHAIN_APPROX_NONE:以Freeman链码的方式输出轮廓,所有其他方法输出多边形(