房地产门户网站建设,wordpress 3.9 中文,如何做亚马逊备案的网站,wordpress分类页不要显示全文文章目录 概要图像矩凸包边界矩形 概要
OpenCV是一个流行的计算机视觉库#xff0c;它提供了许多图像处理和分析功能#xff0c;其中包括查找图像中物体的轮廓。通过查找轮廓#xff0c;可以提取许多有用的特征#xff0c;如面积、周长、质心、边界框等。
以下是几种使用… 文章目录 概要图像矩凸包边界矩形 概要
OpenCV是一个流行的计算机视觉库它提供了许多图像处理和分析功能其中包括查找图像中物体的轮廓。通过查找轮廓可以提取许多有用的特征如面积、周长、质心、边界框等。
以下是几种使用OpenCV查找轮廓时常见的特征
面积可以使用 cv2.contourArea() 函数计算轮廓的面积。该函数将轮廓作为输入并返回浮点数表示轮廓的面积。
周长可以使用 cv2.arcLength() 函数计算轮廓的周长。该函数将轮廓作为输入并返回浮点数表示轮廓的周长。
质心可以使用 cv2.moments() 函数计算轮廓的质心。该函数将轮廓作为输入并返回一个字典其中包含轮廓的各种矩形包括轮廓的质心。
边界框使用 cv2.boundingRect() 函数可以计算轮廓的边界框。该函数将轮廓作为输入并返回一个元组其中包括边界框的x和y坐标以及宽度和高度。
最小区域矩形使用 cv2.minAreaRect() 函数可以计算轮廓的最小区域矩形。该函数将轮廓作为输入并返回一个元组其中包括矩形的中心坐标、宽度和高度以及角度。
最小外接圆使用 cv2.minEnclosingCircle() 函数可以计算轮廓的最小外接圆。该函数将轮廓作为输入并返回一个元组其中包括圆心坐标和半径。
这些特征可以用于描述轮廓并提取有用的信息。例如面积和周长可以用于分类和识别物体质心可以用于跟踪物体的运动边界框和最小区域矩形可以用于确定物体的位置和方向最小外接圆可以用于确定物体的大小。
图像矩
图像矩可以帮助您计算一些特征如物体的质心、物体的面积等。函数 cv.moments() 提供了一个计算出所有矩值的字典。代码如下import numpy as np
import cv2 as cvimg cv.imread(star.jpg, 0)
ret, thresh cv.threshold(img, 127, 255, 0)
contours, hierarchy cv.findContours(thresh, 1, 2)cnt contours[0]
M cv.moments(cnt)
print(M)在这个M中你可以提取有用的数据如面积质心等等。质心由如下关系式给出 代码如下
cx int(M[m10] / M[m00])
cy int(M[m01] / M[m00])轮廓面积 轮廓面积可以通过函数 cv.contourArea() 或者是 M[‘m00’] 得到。
area cv.contourArea(cnt)轮廓周长 它也被称为弧长。它可以由函数 cv.arcLength() 得到。第二个参数需要指名形状是否闭合闭合传入 True否则传入 False。
perimeter cv.arcLength(cnt, True)轮廓近似 OpenCV中的approxPolyDP()函数是一个实现了Douglas-Peucker算法的轮廓近似函数。该函数可以将一个轮廓形状近似为另一个顶点数量较少的形状精度取决于我们指定的参数epsilon。
例如如果我们想要在图像中找到一个正方形但由于图像中的噪声或其他因素我们无法得到完美的正方形轮廓。此时我们可以使用approxPolyDP()函数来近似轮廓形状从而得到更接近真实形状的结果。在这种情况下我们需要选择一个合适的epsilon值来控制近似精度。通常建议将epsilon设置为原始轮廓周长的一定比例例如0.1*cv.arcLength(cnt, True)。
使用approxPolyDP()函数可以减少轮廓的顶点数量从而提高图像处理和分析的效率和准确性。
epsilon 0.1*cv.arcLength(cnt, True)
approx cv.approxPolyDP(cnt, epsilon, True)凸包
hull cv.convexHull(points[, hull[, clockwise[, returnPoints]]])参数详细信息
•points 是我们穿过的轮廓。 •clockwise方向标志。如果为True则输出凸包的方向为顺时针方向。否则其方向为逆时针方向。 •returnPoints默认情况下为True。它会返回外壳点的坐标。如果为False则返回与外壳点相对应的轮廓点的索引。
所以要得到上图中的凸包以下就足够了
hull cv.convexHull(cnt)但是如果要查找凸性缺陷则需要传递returnPointsFalse。为了理解它我们将拍摄上面的矩形图像。首先我发现它的轮廓是cnt。现在我找到了它的凸包returnPointsTrue我得到了以下值[[234 202]][[51 202]][[51 79]][[234 79]]它们是矩形的四个角点。现在如果returnPointsFalse也这样做我得到以下结果[[129][67][0][142]]。这些是等高线中对应点的索引。例如检查第一个值cnt[129][[234202]]该值与第一个结果相同其他值依此类推。
cv2.convexHull()函数的语法如下
hull cv2.convexHull(points[, hull[, clockwise[, returnPoints]]])
其中参数的详细信息如下
• points表示我们要找凸包的轮廓。
• clockwise方向标志。如果为True则输出凸包的方向为顺时针方向否则其方向为逆时针方向。
• returnPoints默认情况下为True。它会返回外壳点的坐标。如果为False则返回与外壳点相对应的轮廓点的索引。
因此如果我们只需要得到轮廓的凸包则可以使用以下代码
hull cv2.convexHull(cnt)
但是如果需要查找凸性缺陷则需要将returnPoints设置为False。为了更好地理解其含义考虑以下矩形图像。首先我们找到了矩形的轮廓cnt。接着我们使用returnPointsTrue选项来计算其凸包得到以下四个点的坐标值[[234 202]][[51 202]][[51 79]][[234 79]]。这些坐标值是矩形四个角的点。现在如果我们将returnPoints设置为False得到的将是以下四个点的索引值[[129], [67], [0], [142]]。这些是轮廓数组中对应点的索引值。例如第一个值129表示cnt[129][[234 202]]该值与前面求得的第一个凸包点的坐标值相同其他索引值也类似。
检查凸性 有一个函数可以检查曲线是否是凸的cv.isContourConvex()。它只返回True或False。
k cv.isContourConvex(cnt)边界矩形
边界矩形是用于包围对象或轮廓的矩形形状。有两种类型的边界矩形
7.a. 直边界矩形 直边界矩形是一个简单的矩形不考虑对象的旋转。它可以通过使用cv2.boundingRect()函数来找到。该函数返回一个四元组xywh其中xy表示矩形左上角的坐标wh表示矩形的宽度和高度。
x, y, w, h cv2.boundingRect(cnt)
cv2.rectangle(img, (x, y), (xw, yh), (0, 255, 0), 2)以上代码将在图像img上绘制一个矩形框住了轮廓cnt所代表的对象。
7.b. 旋转矩形 旋转矩形是根据对象的最小面积绘制的矩形并考虑了对象的旋转。要获得旋转矩形可以使用cv2.minAreaRect()函数。该函数返回一个Box2D结构其中包含矩形的中心坐标xy、宽度和高度wh以及旋转角度。
要绘制旋转矩形我们需要得到矩形的四个角点。可以使用cv2.boxPoints()函数获得这些角点该函数将旋转矩形作为参数并返回一个数组包含四个角点的坐标。
rect cv2.minAreaRect(cnt)
box cv2.boxPoints(rect)
box np.int0(box)
cv2.drawContours(img, [box], 0, (0, 0, 255), 2)以上代码将在图像img上绘制一个红色边界框该边界框是根据轮廓cnt的最小面积旋转矩形计算而来。 最小外接圆
# 导入OpenCV库
import cv2 as cv# 使用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)# 显示图像
cv.imshow(最小外接圆, img)
拟合椭圆
# 使用cv.fitEllipse()将椭圆拟合到对象上
ellipse cv.fitEllipse(cnt)# 在图像上绘制拟合的椭圆
cv.ellipse(img, ellipse, (0, 255, 0), 2)# 显示图像
cv.imshow(拟合椭圆, img)
直线拟合
# 获取图像的行和列数
rows, cols img.shape[:2]# 使用cv.fitLine()将直线拟合到一组点上
[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(直线拟合, img)