cv2.boundingRect()用法
时间: 2024-02-06 07:03:54 浏览: 202
`cv2.boundingRect()` 是 OpenCV 库中的一个函数,用于计算轮廓的边界矩形。该函数可以接收一个轮廓作为输入,然后返回一个矩形,该矩形紧密地包围轮廓的边缘,并返回矩形的左上角坐标和宽度、高度。
函数原型如下:
```python
x, y, w, h = cv2.boundingRect(contour)
```
其中,`contour` 是输入的轮廓,`x` 和 `y` 表示矩形的左上角坐标,`w` 和 `h` 表示矩形的宽度和高度。
使用 `cv2.boundingRect()` 函数可以很方便地将轮廓包围在一个矩形中,从而进行一些后续的操作,例如图像裁剪、对象检测等。
相关问题
def sort_contours(cnts, method="left-to-right"): reverse = False i = 0 if method == "right-to-left" or method == "bottom-to-top": reverse = True if method == "top-to-bottom" or method == "bottom-to-top": i = 1 boundingBoxes = [cv2.boundingRect(c) for c in cnts] #用一个最小的矩形,把找到的形状包起来x,y,h,w (cnts, boundingBoxes) = zip(*sorted(zip(cnts, boundingBoxes), key=lambda b: b[1][i], reverse=reverse)) return cnts, boundingBoxes
这是一个名为 `sort_contours` 的函数,用于对轮廓进行排序。它接受两个参数 `cnts` 和 `method`,其中 `cnts` 是一个包含轮廓的列表,`method` 是指定排序方法的字符串,默认值为 "left-to-right"。
首先,函数初始化了一个布尔变量 `reverse` 和一个整数变量 `i`,并将它们的初始值分别设置为 `False` 和 `0`。
接下来,根据 `method` 参数的不同取值,会改变 `reverse` 和 `i` 的赋值。当 `method` 为 "right-to-left" 或 "bottom-to-top" 时,将 `reverse` 设置为 `True`,表示要进行反向排序。当 `method` 为 "top-to-bottom" 或 "bottom-to-top" 时,将 `i` 设置为 `1`,表示按照轮廓的 y 坐标进行排序。
然后,函数使用列表推导式和 `cv2.boundingRect()` 函数对每个轮廓进行处理,将其转换为最小的包围矩形,并将结果保存在名为 `boundingBoxes` 的列表中。
最后,函数使用 `zip()` 函数将 `cnts` 和 `boundingBoxes` 列表进行组合,并使用 `sorted()` 函数对组合后的列表进行排序。排序的依据是通过 `lambda` 表达式指定的 `key` 参数,该参数指定了按照 `boundingBoxes` 中元素的第 `i` 个索引进行排序。最后,使用 `zip(*...)` 将排序后的列表解压缩为两个分离的列表,分别赋值给 `cnts` 和 `boundingBoxes`。
最后,函数返回经过排序后的 `cnts` 和 `boundingBoxes` 列表。
回答一下代码:import numpy as np import cv2 import Products as product # 加载视频 cap = cv2.VideoCapture("../sample/1.mp4") # 变量 font = cv2.FONT_HERSHEY_SIMPLEX products = [] pid = 1 areaTh = 18000 # 获取图像width, height width = cap.get(3) height = cap.get(3) while cap.isOpened(): ret, frame = cap.read() try: # 复制图片,用于绘制 img = frame.copy() gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)[1] except: print("EOF") break # 边缘检测,识别工件 contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) for cnt in contours: area = cv2.contourArea(cnt) if area > areaTh: M = cv2.moments(cnt) cx = int(M['m10'] / M['m00']) cy = int(M['m01'] / M['m00']) x, y, w, h = cv2.boundingRect(cnt) new = True if cx > 100: for i in products: if abs(cx - i.getX()) <= 25 and abs(cy - i.getY()) <= 25: new = False i.updateCoords(cx, cy, x, y, w, h) if new: p = product.Product(pid, cx, cy, x, y, w, h) p.save_pic(frame) products.append(p) product.count = pid defects = p.defect_detect() pid += 1 cv2.circle(img, (cx, cy), 5, (0, 0, 255), -1) img = cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2) for i in products: # 标记ID if i.getX() <= 600: cv2.putText(img, str(i.getId()), (i.getX(), i.getY()), font, 1.0, i.getRGB(), 1, cv2.LINE_AA) # 绘制缺陷 for j in i.defects: if j.getState() == 1: img = cv2.rectangle(img, (i.getBoundX() + j.getX(), i.getBoundY() + j.getY()), (i.getBoundX() + j.getX() + j.getW() + 5, i.getBoundY() + j.getY() + j.getH() + 5), (0, 255, 255), 1) elif j.getState() == 2: img = cv2.rectangle(img, (i.getBoundX() + j.getX(), i.getBoundY() + j.getY()), (i.getBoundX() + j.getX() + j.getW() + 5, i.getBoundY() + j.getY() + j.getH() + 5), (255, 255, 0), 1) # 绘制sum cv2.putText(img, "sum:" + str(product.count), (10, 30), font, 0.7, (255, 255, 255), 1, cv2.LINE_AA) cv2.putText(img, "scratch_sum:" + str(product.Product.scratch_sum), (10, 50), font, 0.7, (0, 255, 255), 1, cv2.LINE_AA) cv2.putText(img, "blot_sum:" + str(product.Product.blot_sum), (10, 70), font, 0.7, (255, 255, 0), 1, cv2.LINE_AA) cv2.imshow("test", img) k = cv2.waitKey(10) & 0xff if k == 27: break cv2.destroyAllWindows()
这段代码导入了三个Python模块:numpy、cv2和Products。下面是每个模块的简要说明:
1. numpy:是一个Python库,用于在Python中进行数值计算。它支持大量的数学操作和运算,如矩阵操作、线性代数、随机数生成等等。
2. cv2:是一个Python库,用于计算机视觉和图像处理。它是OpenCV(开源计算机视觉库)的Python接口,提供了许多处理图像的函数和方法。
3. Products:这是一个自定义的Python模块,它很可能包含了一些与产品相关的代码。由于我们没有看到这个模块的代码,所以不能对它做出具体的解释。
需要注意的是,这段代码中导入的模块需要在系统中预先安装好,否则会导致 ImportError 错误。如果你在运行时遇到了这个错误,你需要在终端或命令行界面中使用 pip 命令安装相应的模块。例如,要安装 numpy 模块,可以在命令行中输入:
```python
pip install numpy
```
同样的方式也适用于其他模块。
阅读全文