2

我试图在图像中绘制一些矩形,但系统给了我这个错误:在此处输入图像描述

这是我的代码:

cv2.rectangle(img=sample,
                      pt1=(box[0], box[1]),
                      pt2=(box[2], box[3]),
                      color=(220, 0, 0), thickness=2)

任何建议将被认真考虑!

PS:我在 kaggle notebok 上尝试了这段代码,它运行成功,但是当我想应用 streamlit 部署 Web 应用程序(使用我的本地机器)时它崩溃了。不知道它是否有所作为,仅供参考。

4

3 回答 3

1

我想通了这个问题,它与版本有关。当我降级到 4.1.0.25 时,问题就解决了。

于 2020-06-27T16:15:24.687 回答
0

cv2.rectangle有错误;如果您向其传递无效值的参数,它将尝试调用错误的重载。

这是因为在 c++ 中,矩形有两个重载,请参阅文档

void cv::rectangle (InputOutputArray img, Point pt1, Point pt2, const Scalar &color, int thickness=1, int lineType=LINE_8, int shift=0)

void cv::rectangle (InputOutputArray img, Rect rec, const Scalar &color, int thickness=1, int lineType=LINE_8, int shift=0)

但是,python 包装器不会将其表示为两个函数,python 包装器将尝试根据提供给它的参数的类型而不是参数的名称来调用正确的函数。

如果您阅读https://docs.opencv.org/master/da/d49/tutorial_py_bindings_basics.html,您将看到:

可以使用 CV_EXPORTS_AS 扩展重载函数。但是我们需要传递一个新名称,以便在 Python 中使用该名称调用每个函数。下面以积分函数为例。三个函数可用,因此每个函数在 Python 中都以后缀命名。同样 CV_WRAP_AS 可用于包装重载方法。

但是,如果您检查源代码,则不会这样做。

这已在此处此处作为 opencv 中的错误提交,具体请参见此处的 opencv 开发人员的评论:https ://github.com/opencv/opencv/issues/15465#issuecomment-758025129

问题的根本原因是生成的 Python 绑定中重载解决方案的当前实现。在我看来,要解决不恰当/误导性消息的问题,应该执行以下步骤: ... 如果最后一个重载适合 - 使用它并忘记以前的错误。否则,使用先前收集的消息引发 OverloadError 类型的自定义 OpenCV 异常。

这在https://github.com/opencv/opencv/pull/19312中得到了解决,它被合并到一些未来版本的 opencv 中。

IE。长话短说:这是一个错误。它现在已修复,但可能不在您之前使用的 opencv 版本上。

原因很可能是 pt1 和 pt2 类型不是“int”,这导致 opencv 尝试调用错误的重载,但它引发了不正确的错误消息。

于 2021-06-19T08:17:10.930 回答
-1

你的pt1orpt2一定有问题,因此cv2.rectangle在构造矩形时遇到了寻找 pt1 或 pt2 的问题。

我可以通过以下代码重现您的错误:

fig, ax = plt.subplots(1, 1, figsize=(10, 10))
img = np.ones((128, 128))
x1, y1, x2, y2 = 20, 30, 70, 90
line_width = 2
color = (0, 255, 255)

img = cv2.rectangle(img=img,
                    pt2=(x1, y1),
                    color=color,
                    thickness=line_width)

ax.imshow(img)

但是,如果你给出正确cv2.rectangle的pt1 和 pt2,你就能得到正确的答案。

fig, ax = plt.subplots(1, 1, figsize=(10, 10))
img = np.ones((128, 128))
x1, y1, x2, y2 = 20, 30, 70, 90
line_width = 2
color = (0, 255, 255)
img = cv2.rectangle(img=img,
                    pt1=(x1, y1),
                    pt2=(x2, y2),
                    color=color,
                    thickness=line_width)

ax.imshow(img)

您可以尝试上面的代码进行调试。

于 2020-06-25T05:24:07.813 回答