gpt4 book ai didi

python - 为什么 cv2.rectangle 有时返回 np.ndarray,有时返回 cv2.UMat

转载 作者:行者123 更新时间:2023-12-02 15:09:20 31 4
gpt4 key购买 nike

我目前正在对一些图像进行可视化,并发现了 opencv 的 cv2.rectangle 的这种奇怪的行为:

  • 当输入图像是 np.ndarray 时,比如说 arr,cv2.rectangle() 返回一个 np.ndarray,而 arr 是用矩形绘制的。
  • 当输入图像是 arr 的某种变体时,例如 arr[:, :, [2, 0, 1]],cv2.rectangle() 返回一个 cv2.UMat,并且没有绘制矩形。

  • 我目前的环境是:
  • Python 3.7
  • Opencv 4.1

  • 以下是代码:
  • 首先生成一个随机图像。

  • import numpy as np
    import cv2
    import copy

    img = np.random.randint(0, 255, (100, 120, 3)).astype("uint8")
  • 现在添加一个矩形

  • a = copy.deepcopy(img)
    ret = cv2.rectangle(a, (0, 0), (10, 10), color=(255, 255, 255), thickness=2)
  • 你会找到:
  • ret 是一个 np.ndarray
  • ret 的可视化并显示绘制了一个矩形
  • 换一种方式试试:

  • b = copy.deepcopy(img)
    c = b[:, :, [2, 1, 0]]
    ret = cv2.rectangle(c, (0, 0), (10, 10), color=(255, 255, 255), thickness=2)
  • 你会找到:
  • ret 是一个 cv2.UMat
  • ret 或 c 的可视化显示 没有绘制矩形

  • 我真的很好奇我的代码有什么问题吗?还是背后隐藏着什么?

    最佳答案

    我会努力回答这个问题,因为我经常遇到这个问题,并且在评论中我看到了很多正确的东西!
    OpenCV 只能处理 连续数组 ,这意味着它们必须以某种方式在内存中排列。当切片 np.array , numpy只是更改读取顺序以提高速度(而不是耗时的复制)并因此 非连续 (找到 here )。
    @Das Masek 和@Eric 的陈述都是正确的。使用索引数组对 np.array 进行切片创建 总是 记录的副本 here .然而,不幸的是numpy复制数组但不会将其更改回连续数组(对我来说这似乎是不好的行为)。
    解决方案将是以下之一:

  • copy() np.array ;通过明确复制,numpy将布局改回连续,与索引数组切片不同。您可以查看 flags您的阵列的 a.flags等等。如果您想自动化某些东西,这显然是最昂贵的,因为您实际上每次都在复制。
  • 对我来说更优雅的版本是使用 np.ascontiguousarray() .此函数仅在数组已经不连续时才更改数组的布局,并且不会 copy它。

  • 换个说法:根据 documentation ,所有OpenCV绘图函数其实都有一个 None返回值,因为它们是就地函数。因此,我建议使用它们。

    关于python - 为什么 cv2.rectangle 有时返回 np.ndarray,有时返回 cv2.UMat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57586449/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com