You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

为何Python版OpenCV无法使用cv2.cv.BoxPoints?如何绘制标记物边界框?

解决OpenCV中"cv2没有cv模块"的问题

嘿,这个问题我之前帮不少OpenCV初学者踩过坑——这其实是OpenCV版本升级带来的API变化问题!

为什么会出错?

你用的应该是OpenCV 3.x或更高版本(毕竟搭配Python3.6的话,基本不会是老旧的2.x版本)。从OpenCV 3.0开始,官方把原来独立的cv2.cv子模块彻底整合到了主cv2模块里,原来在cv2.cv下的函数全部迁移到了顶层的cv2命名空间,所以你再调用cv2.cv.BoxPoints自然会提示找不到cv子模块。

具体解决方案

只需要两步就能搞定:

  • 把旧的函数调用cv2.cv.BoxPoints(marker)替换成新版本的cv2.boxPoints(marker),注意函数名的首字母从大写B改成了小写b,这是新版本API的规范。
  • 你原来的np.int0()转换可以保留,不过如果后续遇到numpy的警告提示,换成np.int32()也完全没问题,两者在这个场景下效果一致。

完整示例代码

这里给你一个包含检测标记物、绘制边界框的完整示例,方便你参考:

import cv2
import numpy as np

# 模拟检测得到的标记物旋转矩形(实际场景中你会从cv2.minAreaRect等函数获取)
marker_rect = ((150, 150), (80, 50), 30)  # 格式:(中心坐标, 宽高, 旋转角度)

# 替换后的正确代码获取边界框点
box_points = np.int0(cv2.boxPoints(marker_rect))

# 创建空白图像并绘制边界框
img = np.zeros((300, 300, 3), dtype=np.uint8)
cv2.drawContours(img, [box_points], 0, (0, 255, 0), 2)  # 绿色边框,线宽2

# 显示结果
cv2.imshow("Marker Bounding Box", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

额外小提示

如果你不确定自己的OpenCV版本,可以运行下面的代码查看:

import cv2
print(cv2.__version__)

只要版本是3.0及以上,上面的解决方案就完全适用。

内容的提问来源于stack exchange,提问作者leo90

火山引擎 最新活动