cnts = cv2.findContours(edged.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)[0] cnts = sorted(cnts, key = cv2.contourArea, reverse = True)[:5]
时间: 2024-04-17 12:29:01 浏览: 14
这段代码使用OpenCV的cv2.findContours函数从边缘图像中查找轮廓。
首先,edged.copy()创建了 edged 的副本,以确保原始图像不会被修改。
然后,cv2.findContours函数被调用,它接受三个参数:
- 第一个参数是边缘图像
- 第二个参数是轮廓检索模式,这里使用cv2.RETR_LIST表示检索所有的轮廓
- 第三个参数是轮廓近似方法,这里使用cv2.CHAIN_APPROX_SIMPLE表示使用简单的近似方法来存储轮廓的点
cv2.findContours函数的返回值是一个包含所有轮廓的列表,其中每个轮廓都是一个NumPy数组。
接下来,使用sorted函数对轮廓进行排序。排序的依据是每个轮廓的面积,通过调用cv2.contourArea函数来计算。参数reverse=True表示按照面积从大到小进行排序。
最后,通过切片操作[:5]取出前5个面积最大的轮廓,并将结果保存在cnts变量中。
相关问题
cnts, hierarchy = cv2.findContours
cnts, hierarchy = cv2.findContours(edged.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) 和 cnts, hierarchy = cv2.findContours(imgray.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) 是使用OpenCV库中的函数来检测图像中的轮廓。这些函数返回轮廓的坐标和层次结构信息。
在第一个引用中,使用了cv2.findContours函数来检测edged图像中的轮廓。其中,edged.copy()是输入图像,cv2.RETR_EXTERNAL表示只检测外部轮廓,cv2.CHAIN_APPROX_SIMPLE表示使用简单的轮廓近似方法。
在第二个引用中,使用了cv2.findContours函数来检测imgray图像中的轮廓。其中,imgray.copy()是输入图像,cv2.RETR_EXTERNAL表示只检测外部轮廓,cv2.CHAIN_APPROX_NONE表示不进行轮廓近似,保留所有的轮廓点。
关于method参数,cv2.RETR_EXTERNAL表示只检测外部轮廓,cv2.RETR_LIST表示检测的轮廓不建立等级关系,都是同级,cv2.RETR_CCOMP表示建立两个等级的轮廓,上面一层为外边界,里面一层为内孔的边界信息,cv2.RETR_TREE表示建立一个等级树结构的轮廓。
综上所述,cnts, hierarchy = cv2.findContours是用于检测图像中轮廓的函数,可以根据需要选择不同的参数来获取不同的轮廓信息。
#### 引用[.reference_title]
- *1* *2* *3* [OpenCV findContours函数参数](https://blog.csdn.net/jacke121/article/details/90483863)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item]
[ .reference_list ]
调用cv2.findContours()函数实现轮廓检测,检测图像中物体的轮廓。 2、调用imutils.grab_contours()函数获取图像轮廓。 3、调用contours.sort_contours()函数将轮廓从左到右进行排序。 4、初始化比例系数pixelsPerMetric为空,用于后续真实长度计算。 5、初始化参照物宽度width为3,用于后续真实长度计算。python
非常好的问题!以下是代码示例:
```python
import cv2
import imutils
from imutils import contours
# 读取图像
image = cv2.imread("example.jpg")
# 灰度化
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 边缘检测
edged = cv2.Canny(gray, 50, 100)
# 轮廓检测
cnts = cv2.findContours(edged.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)
# 轮廓排序
(cnts, _) = contours.sort_contours(cnts)
# 初始化比例系数和参照物宽度
pixelsPerMetric = None
width = 3
# 真实长度计算
for c in cnts:
if cv2.contourArea(c) < 100:
continue
orig = image.copy()
box = cv2.minAreaRect(c)
box = cv2.boxPoints(box)
box = np.array(box, dtype="int")
box = perspective.order_points(box)
cv2.drawContours(orig, [box.astype("int")], -1, (0, 255, 0), 2)
for (x, y) in box:
cv2.circle(orig, (int(x), int(y)), 5, (0, 0, 255), -1)
(tl, tr, br, bl) = box
(tltrX, tltrY) = midpoint(tl, tr)
(blbrX, blbrY) = midpoint(bl, br)
(tlblX, tlblY) = midpoint(tl, bl)
(trbrX, trbrY) = midpoint(tr, br)
cv2.circle(orig, (int(tltrX), int(tltrY)), 5, (255, 0, 0), -1)
cv2.circle(orig, (int(blbrX), int(blbrY)), 5, (255, 0, 0), -1)
cv2.circle(orig, (int(tlblX), int(tlblY)), 5, (255, 0, 0), -1)
cv2.circle(orig, (int(trbrX), int(trbrY)), 5, (255, 0, 0), -1)
dA = dist.euclidean((tltrX, tltrY), (blbrX, blbrY))
dB = dist.euclidean((tlblX, tlblY), (trbrX, trbrY))
if pixelsPerMetric is None:
pixelsPerMetric = dB / width
dimA = dA / pixelsPerMetric
dimB = dB / pixelsPerMetric
cv2.putText(orig, "{:.1f}in".format(dimA),
(int(tltrX - 15), int(tltrY - 10)), cv2.FONT_HERSHEY_SIMPLEX,
0.65, (255, 255, 255), 2)
cv2.putText(orig, "{:.1f}in".format(dimB),
(int(trbrX + 10), int(trbrY)), cv2.FONT_HERSHEY_SIMPLEX,
0.65, (255, 255, 255), 2)
cv2.imshow("Image", orig)
cv2.waitKey(0)
```
这段代码可以实现轮廓检测、轮廓排序和真实长度计算。