cv2.rectangle()和putText()的区别
时间: 2024-04-27 17:22:01 浏览: 99
cv2.rectangle()和cv2.putText()都是OpenCV中常用的绘图函数,但它们的作用有所不同。
cv2.rectangle()函数用于在图像上绘制矩形框,它需要指定矩形的左上角坐标和右下角坐标,以及矩形的颜色和线条粗细等参数。这个函数通常用于目标检测和跟踪等应用场景中,用来标注目标物体的位置和大小。
cv2.putText()函数用于在图像上绘制文本,它需要指定文本的内容、位置、字体、大小和颜色等参数。这个函数通常用于图像分类和识别等应用场景中,用来标注图像中物体的类别和属性。
因此,cv2.rectangle()函数和cv2.putText()函数的主要区别在于作用对象的不同。前者用于绘制矩形框,后者用于绘制文本。当需要在图像中同时绘制矩形框和文本时,可以结合使用这两个函数,以达到更好的可视化效果。
相关问题
回答一下代码: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
```
同样的方式也适用于其他模块。
给我解释以下代码outputs = sess.run(None, {input_name: inputs})[0] # 在图像中显示预测标签和预测框 label = outputs["label"] bbox = outputs["bbox"] cv2.putText(frame, label, (10, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2) cv2.rectangle(frame, (bbox[0], bbox[1]), (bbox[2], bbox[3]), (255, 255, 255), 2)
outputs = sess.run(None, {input_name: inputs})[0]
这段代码中, sess 是一个 TensorFlow 会话(Session)对象, run 方法用于执行图中的节点, 并返回其输出值.
None 表示需要运行的节点(node), 在这里是未指定的.
{input_name: inputs} 是输入的 feed_dict, 其中 input_name 是一个字符串, 表示要喂给的占位符的名字, inputs 是对应的输入值.
最后, [0] 表示返回第一个元素, 也就是第一个节点的输出值.
阅读全文