for cnt in contours: area = cv.contourArea(cnt) arclength = cv.arcLength(cnt, True) print('area=%.2f, arcLength=%.2f' % (area, arclength)) print('轮廓个数', len(contours))什么意思
时间: 2024-04-03 11:36:40 浏览: 67
这段代码是用于计算轮廓的面积和周长,并输出每个轮廓的面积和周长以及轮廓的个数。其中,contours是之前通过cv.findContours()函数检测到的轮廓列表。
for cnt in contours: # 对于每一个轮廓
area = cv.contourArea(cnt) # 计算轮廓面积
arclength = cv.arcLength(cnt, True) # 计算轮廓周长
print('area=%.2f, arcLength=%.2f' % (area, arclength)) # 输出面积和周长
上述代码中,通过循环遍历contours,对于每一个轮廓cnt,使用cv.contourArea()函数计算轮廓面积,并使用cv.arcLength()函数计算轮廓周长。最后,使用print()函数输出每个轮廓的面积和周长。
print('轮廓个数', len(contours))
上述代码中,使用len()函数获取轮廓列表contours中轮廓的个数,并使用print()函数输出轮廓的个数。
相关问题
cv2.error: OpenCV(3.4.2) C:\projects\opencv-python\opencv\modules\imgproc\src\shapedescr.cpp:272: error: (-215:Assertion failed) npoints >= 0 && (depth == 5 || depth == 4) in function 'cv::contourArea'
这个错误提示通常是由于传入的轮廓参数不正确导致的。可能是以下几种原因:
1. 轮廓检测函数返回的轮廓列表为空,导致后续计算轮廓面积时出错。可以通过打印轮廓列表的长度来检查是否为空。
2. 在计算轮廓面积时,传入的轮廓参数不是一个有效的Numpy数组。可以通过打印轮廓参数的类型和维度来检查是否正确。
3. 在计算轮廓面积时,传入的轮廓参数深度不符合要求。通常情况下,深度应该为CV_32S或CV_32F。可以通过打印轮廓参数的深度来检查是否正确。
针对这个错误,可以尝试以下解决方法:
1. 确认轮廓列表不为空,或者检查轮廓检测函数的参数是否正确。
2. 确认传入的轮廓参数是一个有效的Numpy数组,或者检查轮廓检测函数返回的轮廓列表是否正确。
3. 确认传入的轮廓参数深度符合要求,或者尝试将其转换为CV_32S或CV_32F深度的Numpy数组。可以使用cv2.convertScaleAbs()函数将深度转换为CV_32S。
下面是一个可能的解决方法:
```
import cv2
# 读取图像
img = cv2.imread('image.jpg')
# 预处理图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (5, 5), 0)
edges = cv2.Canny(blur, 50, 150)
# 轮廓检测
contours, hierarchy = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 筛选轮廓
for cnt in contours:
area = cv2.contourArea(cnt.astype('float32'))
if area < 1000 or area > 10000:
continue
perimeter = cv2.arcLength(cnt, True)
approx = cv2.approxPolyDP(cnt, 0.03 * perimeter, True)
if len(approx) != 4:
continue
# 透视变换
pts1 = np.float32([approx[0][0], approx[1][0], approx[2][0], approx[3][0]])
pts2 = np.float32([[0, 0], [0, 300], [300, 300], [300, 0]])
M = cv2.getPerspectiveTransform(pts1, pts2)
dst = cv2.warpPerspective(img, M, (300, 300))
# 显示结果
cv2.imshow('original', img)
cv2.imshow('perspective', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
在计算轮廓面积时,将轮廓参数转换为float32类型的数组,并使用astype()函数进行转换。这样可以确保在计算轮廓面积时不会出现类型错误。
# 寻找轮廓并计算周长 contours, hierarchy = cv2.findContours(opening, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) for cnt in contours: perimeter = cv2.arcLength(cnt, True) if 500 < perimeter < 600: # 画出矩形框 x, y, w, h = cv2.boundingRect(cnt) cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)把这段改为计算面积来画框
可以将计算周长的部分改为计算轮廓面积,然后根据面积大小来画矩形框。修改后的代码如下:
```
contours, hierarchy = cv2.findContours(opening, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for cnt in contours:
area = cv2.contourArea(cnt)
if 500 < area < 600:
x, y, w, h = cv2.boundingRect(cnt)
cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
```
这里使用了 `cv2.contourArea()` 函数来计算轮廓的面积,然后根据面积大小来判断是否画矩形框。
阅读全文