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

2024-04-05

我目前正在研究一些图像的可视化,并发现 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

以下是代码:

  1. 首先生成随机图像。
import numpy as np
import cv2
import copy

img = np.random.randint(0, 255, (100, 120, 3)).astype("uint8")
  1. 现在添加一个矩形
a = copy.deepcopy(img)
ret = cv2.rectangle(a, (0, 0), (10, 10), color=(255, 255, 255), thickness=2)
  1. 你会找到:

    • ret 是一个 np.ndarray
    • ret 的可视化和显示绘制了一个矩形
  2. 尝试另一种方式:

b = copy.deepcopy(img)
c = b[:, :, [2, 1, 0]]
ret = cv2.rectangle(c, (0, 0), (10, 10), color=(255, 255, 255), thickness=2)
  1. 你会找到:

    • ret 是一个 cv2.UMat
    • ret 或 c 的可视化显示没有绘制矩形

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


我会努力回答这个问题,因为我经常发现这个问题,并且在评论中我看到了很多正确的东西!

OpenCV只能处理连续数组,这意味着它们必须以某种方式在内存中排列。切片时np.array, numpy只是改变读取顺序以提高速度(而不是耗时的复制)并使其因此不连续的 (found here https://stackoverflow.com/questions/29947639/cheapest-way-to-get-a-numpy-array-into-c-contiguous-order/29948246).

@Das Masek 和 @Eric 的说法都是正确的。使用索引数组来切片np.array创造always有记录的副本here https://numpy.org/doc/stable/user/basics.indexing.html?highlight=indexing#index-arrays。然而,不幸的是numpy复制数组,但不会将其更改回连续数组(对我来说这似乎是不好的行为)。

解决方案是以下之一:

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

另一方面:根据文档 https://docs.opencv.org/2.4/modules/core/doc/drawing_functions.html#rectangle,所有的OpenCV绘图函数实际上都有一个None返回值,因为它们是就地函数。因此我建议这样使用它们。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 cv2.rectangle 有时返回 np.ndarray,而有时返回 cv2.UMat 的相关文章

随机推荐

  • 嵌入式 C++ (ARM9) 单元测试

    我来自 Java 和 JUnit 的世界 我演示了 Hudson 以及我使用 JUnit 取得的所有成果 我想在嵌入式设备上对 C 代码执行相同的操作 但找不到从哪里开始 该项目使用 iccarm exe IAR 编译器 进行编译 现在使用
  • Spring AOP 日志拦截器和 JAXB 问题

    我正在尝试将日志记录方面实现到我的应用程序中 这是我第一次尝试 AOP 所以如果我遗漏了一些明显的东西 请告诉我 为了实现编织外部 jar 我正在尝试实现加载时间编织器 我确实在应用程序上下文中指定了加载时编织器 并在 context xm
  • PHP Mysqli 语句返回单行,-1 行受影响,并且没有错误

    这太令人困惑了 我一定错过了一些简单的东西 我有一个查询 检查我插入的事务是否已经存在 以防止重复 这是代码 function isaDupe portableDB transactArray ref transactArray refer
  • 如何使用 UISwipeGestureRecognizer 将“点击”传递给 UIView 下方的 UIButton?

    我在 透明 UIView 下方有一个 UIButton 上面的 UIView 添加了一个 UISwipeGestureRecognizer 这是它的唯一目的 检测某些滑动手势 我希望该 UIView 忽略所有其他触摸 并传递给其他视图 例如
  • 当文本字段开始编辑 iPhone 时表视图滚动

    我在 iPhone 应用程序中有表视图控制器 表视图有两个部分 第一部分有两行 第二部分有一行 第二部分有一个自定义表格视图单元格 第二部分有一个文本字段 当文本字段开始编辑并且键盘弹出时 该文本字段会隐藏 我希望这个表格视图在键盘弹出时滚
  • Redis 写入 .ssh/authorized_keys

    当前设置 2 个主服务器 12 个工作服务器 工作人员通过 ssh copy id 连接到主设备 主设备和工作人员正在主设备上的 redis 队列中写入数据 过去一周我遇到的问题是 Redis 正在将数据写入authorized keys
  • 将坐标(地理位置)存储在数组中以计算距离

    我和我的搭档正在为我们的学校论文开发一个练习网络应用程序 我们正在尝试使用地理定位 API 的 watchposition 函数获取跑步者的位置并在锻炼期间跟踪他 跑步者可以在屏幕上查看他当前的距离 这是我们被卡住的点 我们只能计算起点和终
  • 在 Kafka 生产者上启用幂等性是否会降低吞吐量

    我有卡夫卡制作人启用幂等性 没有启用一次语义或事务 在休息端点调用中 我启用它的原因是因为我不希望卡夫卡重试导致任何重复 我担心以下几点 幂等性会减慢我的端点速度吗 这个端点需要非常快 我读了 kafka api 文档 启用幂等性将使重试无
  • 屏幕顶部的自定义 Toast

    请先阅读问题 然后再使用打印 Toast 的标准例程进行回答 我想在屏幕的左上角显示一个自定义 Toast 我使用以下代码来创建 Toast Toast mFixedToast new Toast getApplicationContext
  • PHP 脚本版本检查/通知

    如何根据在线文件检查脚本的版本以查看它是否是最新版本 为了澄清起见 我说的是我编写的脚本 而不是 PHP 的版本 我想采用一种方式让最终用户知道我何时更新了脚本 指定第二个 更简单 解决方案phjr https stackoverflow
  • Java动态澄清

    我在术语下看到了这段摘录Java 流行语在读一本关于Java的书时我不明白 Dynamic Java 程序带有大量的运行时类型信息 用于在运行时验证和解析对对象的访问 这使得以安全且方便的方式动态链接代码成为可能 这对于 Java 环境的稳
  • 每个页面有一个 CSS 文件还是单独的 CSS 文件?

    当我构建页面时 我想要为每个页面使用单独的样式表还是为整个网站使用一个大型样式表 出于加载目的 单个文件不是更好的做法吗 因为加载时的总 CSS 会更少 使用单个文件 CSS 文件会被缓存 因此减少了为每个访问的新页面下载新文件的需要 为了
  • CIDetector跟踪ID从不存在

    我正在 OSX Mavericks 上编写一些人脸检测代码 并尝试利用 CIDetector 提供的跨多个静止图像功能的新 截至 10 8 人脸跟踪 我的基本面部检测工作正常 如下所示 void captureOutput AVCaptur
  • 如何在面板数据中为不同年份创建单独的直方图?

    我有一个数据框报纸 年 其中包含每年一组报纸的发行量 CIRC 我想看看这些数字的分布如何随时间变化 所以我想为这些不同的年份创建多个单独的直方图 我已经尝试过以下方法 ggplot newspaper yearly aes x CIRC
  • YouTube URL 方案 tvOS

    我正在尝试使用 URL 方案或 YouTube com 域从我的应用程序打开 YouTube 的应用程序 从而直接在 iOS 设备上打开 YouTube 的应用程序 这是我尝试过的代码 UIApplication sharedApplica
  • 如何访问shinyapps.io上应用程序的R+Shiny代码?

    我发现了一个设计非常好的闪亮应用程序闪亮应用程序io https wuli shinyapps io QuoiR 网站 但我不知道如何访问它R代码或说出github其代码目录 我发现如果我们能够访问它的代码 这非常有启发性 无论如何 在最坏
  • SQLAlchemy 布尔值与 BOOLEAN 的比较

    我理解了BOOLEAN覆盖 visit name class BOOLEAN Boolean visit name BOOLEAN 控制调度程序选择的访问者方法 def compiler dispatch self visitor kw v
  • Java 编写单元测试,用于当用户在控制台中键入 quit 时退出程序

    我发现很难为这种方法编写单元测试 当用户键入退出命令时 它基本上会退出程序 系统退出类 public class SystemExit public void exit int status System exit status 我的静态方
  • 如何制作圆形按钮?

    我想制作一个圆形按钮 但我不知道该怎么做 我可以制作带有圆角的按钮 但是我怎样才能制作圆形 这是不一样的 请问一下 安卓上可以吗 谢谢 创建一个名为的 xml 文件roundedbutton xml在可绘制文件夹中
  • 为什么 cv2.rectangle 有时返回 np.ndarray,而有时返回 cv2.UMat

    我目前正在研究一些图像的可视化 并发现 opencv 的 cv2 rectangle 的奇怪行为 当输入图像是 np ndarray 时 例如 arr cv2 rectangle 返回一个 np ndarray 并且 arr 是用矩形绘制的