opencv矩阵数据能保证连续吗?

2024-04-02

我知道 OpenCV 矩阵中包含的数据不能保证是连续的。为了让自己清楚,这里有一段Opencv 文档 https://docs.opencv.org/3.4.0/d3/d63/classcv_1_1Mat.html#details:

OpenCV提供了一个函数叫做isContinuous()测试给定矩阵的数据是否连续。我的问题是

  1. 如果我创建一个新矩阵如下
cv::Mat img = cv::imread(img_name)

数据是否在img保证连续?

  1. 我知道通过从现有矩阵借用数据来创建新矩阵会导致数据不连续
cv::Mat small_mat = large_mat.col(0);

The above code creates a new matrix small_mat by borrowing the 0th column of large_mat, leading to discontinuous data in small_mat. So the question is if I create a brand new matrix without borrowing data from the existing matrix, will the brand new matrix have continuous data or discontinuous data?

  1. 下面的代码是否保证创建一个具有连续数据的矩阵?
cv::Mat mat(nRows, nCols, CV_32FC1);

你可以在 OpenCV 文档中看到是连续的 http://docs.opencv.org/2.4/modules/core/doc/basic_structures.html#mat-iscontinuous:

如果矩阵元素连续存储且每行末尾没有间隙,则该方法返回 true。否则,返回 false。显然,1x1 或 1xN 矩阵始终是连续的。使用 Mat::create() 创建的矩阵始终是连续的。但是,如果您使用 Mat::col()、Mat::diag() 等提取矩阵的一部分,或者为外部分配的数据构造矩阵头,则此类矩阵可能不再具有此属性。

因此,只要您创建一个新矩阵(即您调用create http://docs.opencv.org/2.4/modules/core/doc/basic_structures.html#mat-create),你的矩阵将是连续的。

create工作原理如下:

  1. 如果当前数组形状和类型与新的匹配,则立即返回。否则,通过调用 Mat::release() 取消引用先前的数据。
  2. 初始化新的标头。
  3. 分配total()*elemSize()字节的新数据。
  4. 分配与数据关联的新引用计数器并将其设置为 1。

这意味着当您(隐式)调用 create 时,矩阵将是连续的(步骤 3)。


你的问题

如果我创建一个新矩阵imread数据是否保证连续

Yes, 因为imread内部调用create.

我知道通过借用现有矩阵的数据来创建新矩阵会导致数据不连续。

正确,数据将是非连续的。要使新矩阵连续,可以调用clone(),这称为create创建新的矩阵。

如果我创建一个全新的矩阵而不借用现有矩阵的数据,那么这个全新的矩阵是否会有不连续的数据?

Yes,构造函数内部调用create.

矩阵构造函数保证创建一个具有连续数据的矩阵吗?

Yes,构造函数内部调用create.

这是一个小例子来总结:

#include <opencv2\opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;

int main()
{
    // Read image
    Mat img = imread("path_to_image");
    cout << "img is continuous? " << img.isContinuous() << endl; 
    // Yes, calls create internally

    // Constructed a matrix header for externally allocated data
    Mat small_mat = img.col(0);
    cout << "small_mat is continuous? " << small_mat.isContinuous() << endl; 
    // No, you're just creating a new header.

    // Matrix (self) expression
    small_mat = small_mat + 2;
    cout << "small_mat is continuous? " << small_mat.isContinuous() << endl; 
    // No, you're not even creating a new header

    // Matrix expression
    Mat expr = small_mat + 2;
    cout << "expr is continuous? " << expr.isContinuous() << endl; 
    // Yes, you're creating a new matrix

    // Clone
    Mat small_mat_cloned = img.col(0).clone();
    cout << "small_mat_cloned is continuous? " << small_mat_cloned.isContinuous() << endl; 
    // Yes, you're creating a new matrix

    // Create
    Mat mat(10, 10, CV_32FC1);
    cout << "mat is continuous? " << mat.isContinuous() << endl; 
    // Yes, you're creating a new matrix

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

opencv矩阵数据能保证连续吗? 的相关文章

随机推荐

  • 如何在多线程应用程序中使用 StackExchange.Redis IDatabase 对象?

    我从 StackExchange Redis 文档中收到有关如何使用 IDatabase 的混合消息 在里面基本使用文档 https github com StackExchange StackExchange Redis blob mas
  • SQL Group By - 从单列生成多个聚合列

    我想按公司和日期进行分组 并为 2 个单独的值 Flag Y 和 Flag N 生成计数列 输入表如下所示 Company Date Flag 001 201201 Y 001 201201 N 001 201202 N 001 20120
  • 使用 Paypal IPN 订阅

    我正在使用 Paypal IPN 添加订阅到网站 效果非常好 我可以成功创建新订阅并验证它 该订阅有两周的免费试用期 不幸的是 该指南对订阅状态的描述有点含糊 目前 一旦收到 subscr signup 或 subscr payment 用
  • 什么会导致 Java 在 System.exit() 之后继续运行?

    我有一个 Java 程序 正在通过以下方式启动ProcessBuilder来自另一个 Java 程序 System exit 0 是从子程序调用的 但对于我们的一些用户 在 Windows 上 java exe与子进程关联的进程不会终止 子
  • Visual Studio 2015 项目缺少所有引用

    从今天开始 一个属于有20个项目的解决方案的WPF项目 将我的所有引用设置为缺失 我刚刚检查了 MS 的建议和 Stackoverflow 上的其他答案 但没有一个起作用 我尝试从 SVN 重新获取解决方案 但没有运气 其他同事没有遇到这个
  • 如何修复:致命异常:main android.os.NetworkOnMainThreadException [重复]

    这个问题在这里已经有答案了 我在 android 版本 18 上运行我的代码时遇到问题 我已经使用了 AsyncTask 但仍然收到错误 请帮助 我是编程新手 所以请原谅我的错误 package com example androidhiv
  • 提取 git 提交中更改的所有文件

    我需要为某人制作一个补丁 他们没有使用 git 由提交更改的文件的 zip 我想像 git archive format zip commitguid gt myfiles zip 但这会提取整个内容 而不仅仅是更改的文件 有什么办法可以做
  • 如何使用 Cocoa UI 制作 Java 应用程序?

    我必须在项目中使用 Java API 但由于我不喜欢 Java UI 并且我有一台 Mac 所以我想围绕 Java 代码构建一个本机 Cocoa 应用程序 我知道 Xcode 曾经为此类事情提供直接支持 但由于它不再提供 那么最好的方法是什
  • 在android webview中全屏播放HTML5视频

    好吧 我已经搜索了几天了 如何在 android WebView 上以全屏模式显示 HTML5 视频 我设法在我的网络视图上播放 HTML5 视频 以全屏模式显示视频时会出现问题 正如我所发现的 android 有两种处理 标签的方法 在
  • 将 Canvas 内容导出为 PDF

    我正在使用 HTML5 Canvas 做一些事情 一切都工作得很好 除了现在 我可以使用 Canvas2image 将画布内容导出为 PNG 但我想将其导出为 PDF 我做了一些研究 我很确定这是可能的 但我似乎无法理解我需要在代码中更改什
  • 网络共享的锁定行为有所不同

    我一直在尝试锁定文件 以便其他克隆服务无法访问该文件 然后我读取该文件 完成后移动该文件 通过使用允许移动FileShare Delete 然而 在后来的测试中 我们发现如果我们正在查看网络共享 则这种方法不起作用 我知道我的方法可能不是最
  • iPhone/iOS自定义控件

    我想知道如何从头开始创建自定义 iPhone 控件 或者使用现有的库或框架 我已经看到了 Three20 库 以及 Tapku 和 Touch Customs 它们对于专门的 iOS 控件 例如表格视图等 非常有用 但我在这里讨论的是制作完
  • Laravel - 如何设置 morphOne 关系

    我正在尝试为类别实现一个可变形表 现在我有以下内容 Snippet Table id title body Post Table id title body Category Table id name 我希望能够将帖子和片段改为只有一个类
  • 2038 年问题 - 64 位(Linux 操作系统、php、mysql)[重复]

    这个问题在这里已经有答案了 select unix timestamp 2038 01 19 回报2147472000 while select unix timestamp 2038 01 20 回报0 我查了一下年份2038问题 我的l
  • hibernate ManyToMany 与可连接的顺序

    我有以下数据库设置 T PARTICIPANT MOVEMENT ParticipantMove SID BigInt PK Participant SID BigInt FK MoveType SID BigInt FK MoveReas
  • cygdb ImportError:没有名为“Cython”的模块

    我想调试我的 Cython 代码并按照描述的确切步骤进行操作here http docs cython org src userguide debugging html 我的 Cython 代码编译 cython gdb xxx pyx进而
  • R strptime/as.POSIXct 中的未知时区名称

    在哪里可以找到 R 函数的所有合法时间名称的列表as POSIXct as POSIXct 1970 01 01 tz CST 生成一条警告 指出 CST 中部标准时间 未知 时区的东西可以驱动你NUTS 由于位于德国 我过去常常这样做来设
  • ASP.NET MVC:ValueProvider 的执行顺序

    我想知道不同的执行顺序ValueProviders在 ASP NET MVC 中 价值提供者 查询字符串值提供者 路由数据值提供者 表单值提供者 我没有找到信息 如果我没记错的话 优先顺序是这样的 请求中的表单数据 路线数据 请求参数 Ht
  • Matplotlib:图例未正确显示

    我有不同类别的数据点 我想将其可视化 这是我得到的图像 https i stack imgur com qwCLC jpg https i stack imgur com qwCLC jpg 有 10 个类别的 3000 个数据点 每个类别
  • opencv矩阵数据能保证连续吗?

    我知道 OpenCV 矩阵中包含的数据不能保证是连续的 为了让自己清楚 这里有一段Opencv 文档 https docs opencv org 3 4 0 d3 d63 classcv 1 1Mat html details OpenCV