在 opencv 中索引矩阵的最佳方法

2024-01-13

可以说,A and B是相同大小的矩阵。 在Matlab,我可以使用简单的索引,如下所示。

idx = A>0;
B(idx) = 0

我怎样才能做到这一点OpenCV?我应该只使用

for (i=0; ... rows)
    for(j=0; ... cols)
        if (A.at<double>(i,j)>0) B.at<double>(i,j) = 0;

像这样的东西?有没有更好(更快、更有效)的方法?

此外,在OpenCV,当我尝试

Mat idx = A>0;

变量idx似乎是一个CV_8U矩阵(不是布尔值而是整数)。


您可以轻松转换此 MATLAB 代码:

idx = A > 0;
B(idx) = 0;

// same as 

B(A>0) = 0;

OpenCV 为:

Mat1d A(...)
Mat1d B(...)

Mat1b idx = A > 0;
B.setTo(0, idx) = 0;

// or

B.setTo(0, A > 0);

关于性能,在 C++ 中,处理原始指针通常更快(这取决于启用的优化)(但速度更慢)readable):

for (int r = 0; r < B.rows; ++r)
{
    double* pA = A.ptr<double>(r);
    double* pB = B.ptr<double>(r);
    for (int c = 0; c < B.cols; ++c)
    {
        if (pA[c] > 0.0) pB[c] = 0.0;
    }
}

另请注意,在 OpenCV 中没有任何boolean矩阵,但它是一个CV_8UC1矩阵(又名单通道矩阵unsigned char), 在哪里0 means false,以及任何值>0是真的(通常255).

评估

注意这可能会有所不同根据 OpenCV 启用的优化。您可以在 PC 上测试下面的代码以获得准确的结果。

时间(毫秒):

          my results           my results      @AdrienDescamps
          (OpenCV 3.0 No IPP)  (OpenCV 2.4.9)

Matlab  : 13.473     
C++ Mask: 640.824              5.81815         ~5
C++ Loop: 5.24414              4.95127         ~4

注意:我不完全确定 OpenCV 3.0 的性能下降,所以我只是说:在您的 PC 上测试下面的代码以获得准确的结果。

正如@AdrienDecamps 在评论中所说:

OpenCV 3.0 的性能下降似乎与 OpenCL 选项有关,该选项现在在比较运算符中启用。

C++ Code

#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main()
{
    // Random initialize A with values in [-100, 100]
    Mat1d A(1000, 1000);
    randu(A, Scalar(-100), Scalar(100));

    // B initialized with some constant (5) value
    Mat1d B(A.rows, A.cols, 5.0); 

    // Operation: B(A>0) = 0;

    {
        // Using mask

        double tic = double(getTickCount());
        B.setTo(0, A > 0);
        double toc = (double(getTickCount()) - tic) * 1000 / getTickFrequency();

        cout << "Mask: " << toc << endl;
    }
    {
        // Using for loop

        double tic = double(getTickCount());
        for (int r = 0; r < B.rows; ++r)
        {
            double* pA = A.ptr<double>(r);
            double* pB = B.ptr<double>(r);
            for (int c = 0; c < B.cols; ++c)
            {
                if (pA[c] > 0.0) pB[c] = 0.0;
            }
        }
        double toc = (double(getTickCount()) - tic) * 1000 / getTickFrequency();

        cout << "Loop: " << toc << endl;
    }


    getchar();
    return 0;
}

Matlab代码

% Random initialize A with values in [-100, 100]
A = (rand(1000) * 200) - 100;
% B initialized with some constant (5) value
B = ones(1000) * 5; 

tic
B(A>0) = 0; 
toc

UPDATE

OpenCV 3.0在函数中使用IPP优化setTo。如果您启用了该功能(您可以检查cv::getBuildInformation()),您将获得更快的计算速度。

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

在 opencv 中索引矩阵的最佳方法 的相关文章

  • 为什么使用数组索引循环数组比指针访问慢?

    我正在读Kochan的书 Programming in C 在第 14 页的 指针和数组 部分中 264 他说 一般来说 索引数组的过程比执行索引过程花费更多的时间 访问指针内容的过程 其实这也是主要原因之一 为什么使用指针来访问数组的元素
  • 如何转发声明要在 unique_ptr 的标准容器中使用的类

    在智能指针的标准容器中使用它时 是否可以避免完整的类定义可见 例如 我无法编译以下内容 include
  • 结果显示图像上有衬里

    我正在使用 opencv 和 android ndk 下面是我的 jni 代码 void Vignete Mat img1 Mat img2 Mat out resize img1 img1 img2 size img1 convertTo
  • C++:字符串流有什么好处?

    谁能告诉我一些在 C 中使用字符串流的实际例子 即使用流插入和流提取运算符输入和输出到字符串流 您可以使用字符串流来转换任何实现operator lt lt 到一个字符串 include
  • opencv不失真图像有一个奇怪的圆圈

    我尝试使用 opencv 针孔模型来计算校准参数 然后使图像不失真 问题是 未失真的图像中有一个奇怪的圆圈 如下所示 代码 原始图像和结果图像是here https github com wennycooper A004 pinhole 任
  • 等待运算符错误

    我的代码有问题 我怎么解决这个问题 这个问题出现在await操作符中 public MyModel HttpClient client new HttpClient HttpResponseMessage response await cl
  • 为什么 fgets 接受 int 而不是 size_t?

    功能如strcpy malloc strlen 和其他各种接受他们的参数或返回值作为size t代替int or an unsigned int出于显而易见的原因 一些文件功能 例如fread and fwrite use size t以及
  • 使用 LINQ 展平嵌套字典

    所以我有一本形式的字典Dictionary
  • 有没有办法找到dll公开的所有函数

    我一直在寻找一种方法来获取映射到 dll 中函数名称的所有字符串 我的意思是您可以调用 GetProcAddress 的所有字符串 如果你对 dll 进行十六进制转储 符号 字符串 就在那里 但我认为必须有一个系统调用来获取这些名称 如果您
  • _MM_TRANSPOSE4_PS 在 GCC 中导致编译器错误?

    我第一次在 GCC 而不是 MSVC 中编译我的数学库 并经历了所有的小错误 我遇到了一个根本没有意义的错误 Line 284 error lvalue required as left operand of assignment 284号
  • 编译器消息“警告:格式‘%s’需要类型‘char *’,但参数 2 具有类型‘char (*)’”

    我正在尝试运行一个简单的 C 程序 但收到此错误 警告 格式 s 需要类型 char 但参数 2 的类型为 char 20 我在跑步Mac OS X v10 8 https en wikipedia org wiki OS X Mounta
  • FFplay成功移入我的Winform中,如何设置它无边框?

    用这个代码 在 C 应用程序中显示 tcp 视频流 来自 FFPLAY FFMPEG https stackoverflow com questions 14201894 show a tcp video stream from ffpla
  • 如何解析多态 JSON 数组?

    我有一个 JSON 格式的文件 其中包含个人用户的记录 一些用户的记录中间有一个评论字段 我只想解析顶级项目 全名 贡献者姓名 电子邮件 使用 Newtonsoft JSON 解析器 但我似乎无法让它识别单个对象 当我将整个字符串解析为一个
  • 为什么最小的 int -2147483648 的类型为“long”? [复制]

    这个问题在这里已经有答案了 对于一个学校项目 我必须编写 C 函数 printf 的代码 一切进展顺利 但有一个问题我找不到好的答案 所以我来了 printf PRINTF d t d n 2147483648 告诉我 gcc Werror
  • WCF 服务中的缓冲区大小

    我们有一个 WCF 服务 它执行某些存储过程并将结果返回给 silverlight 客户端 某些存储过程最多返回 80K 行 下面给出的是 web config 中服务的设置
  • Rx 在不同的线程上生产和消费

    我试图通过此处的示例代码来简化我的问题 我有一个生产者线程不断地输入数据 并且我尝试在批次之间添加时间延迟来对其进行批处理 以便 UI 有时间渲染它 但结果并不如预期 生产者和消费者似乎在同一个线程上 我不希望批处理缓冲区在正在生成的线程上
  • C中使用JNI从对象获取对象

    public class Student private People people private Result result private int amount 这是 Java 中类的示例 在C中 我试图获取 学生 中的 人 但失败了
  • C++ 在预处理器 #if 中对 sizeof() 比较抛出编译错误

    我有这个 它不会从 Visual Studio 编译错误 致命错误 C1017 无效的整数常量表达式 我该怎么做 template
  • 从数据库配置中的连接字符串中删除 SSIS 密码

    我有一个 SSIS 包 它使用 SQL 服务器中的 SSIS 配置表来检索 OLE DB 连接管理器的连接字符串属性 问题是我还需要相同的连接字符串来调用使用实体框架的程序集 我尝试访问连接管理器连接字符串属性 但 SSIS 总是删除密码
  • 打印任何类型的数组和列表的通用方法[重复]

    这个问题在这里已经有答案了 每当我调试一段涉及整数 双精度 字符串等数组或列表的代码时 有时我更喜欢打印它们 我为此所做的是为不同类型编写重载的 printArray printList 方法 for e g 我可能有这 3 种方法来打印各

随机推荐

  • 在pythonplotly包中操作散点图中的图例

    我想使用 python 中的plotly 和特定标记颜色来绘制散点图 但当我成功做到这一点时 图例并不对应 现在 图例中的所有标签都具有相同的颜色 蓝色 我想要图例代表risks从我的数据中 颜色与代码中提到的相同 像这样 蓝色标记 中等低
  • jQuery:获取 jQuery 中隐藏元素的高度

    我需要获取隐藏 div 内元素的高度 现在我显示 div 获取高度并隐藏父 div 这似乎有点傻 有没有更好的办法 我正在使用 jQuery 1 4 2 select show optionHeight firstOption height
  • 在 iPad 中创建交互式视频 - 用于产品演示的应用程序

    我想创建需要在 iPad 本机应用程序上运行的视频 该应用程序需要通过 iPad 展示产品演示 它也需要具有互动性 我知道我们可以在 Flash 中执行这些操作 因为 iPad 不支持 Flash 我有什么选择 我很感激任何指导或提示 先感
  • 如何将 C# 中的“where”关键字与通用接口和继承一起使用

    我想要实现的是 声明一个泛型类 将 T 限制为实现 IMySpecialInterface 的类型 其中 X 不是已知类型 并让该类继承父类 举一个不正确的例子 public class MyClass
  • 层次结构查看器结果解释

    几天前 我在 Eclipse 中安装了 ADT 插件的更新 并且刚刚尝试了新的层次结构查看器工具 除了我花了一段时间才发现测量值仅在第一个 父 视图中计算之外 我还观察到每次显示的值都不相同 即使我的应用程序中没有任何更改 例如 我在模拟器
  • .NET 序列化排序

    我正在尝试使用 XmlSerializer 和继承序列化一些对象 但在排序结果时遇到一些问题 下面是一个与我设置类似的示例 public class SerializableBase XmlElement Order 1 public bo
  • C++ 从 Linux 访问 SQL Server

    我需要用 C 将一些数据从 Linux 写入 SQL Server 数据库 我找到了这个sqlapi com 但我认为 首先必须安装 ODBC 驱动程序并且必须工作 我关注了这个 adminlife net allgemein mssql
  • AVPlayer,播放/暂停状态通知?

    我正在寻找一种方法 以便在发生时准确收到通知AVPlayer开始播放 有 费率 属性 但目前我正在定期检查它NSTimer获取更新 我尝试了 KVO 但显然它不符合 KVO 标准 我知道有events https developer app
  • 使用 jquery 动态生成的列表项上的单击事件

    我有一个动态生成的列表 然后我单击该项目并传递index 到另一个函数 问题是这个列表是动态填充的 当我这样做时我的代码没有响应click事件 但是 如果我在动态填充的元素之外添加几个静态 li 元素到列表中 那么这些静态元素就可以工作 这
  • 未通过 .where() 从云函数获取结果

    我正在使用此代码通过比较从集合中获取数据 eslint disable const functions require firebase functions const admin require firebase admin admin
  • 嵌入 Flash 对象上的 HTML 包装器 div 无法通过 jQuery“点击”

    我一直在尝试按照客户的要求进行操作 一旦客户单击 swf 格式的顶部横幅 就重定向到活动页面 然后重定向到目标页面 您可以在以下位置查看已完成的操作 http ausdcf org http ausdcf org 如果您使用 Firefox
  • 在gnuplot中绘制不同颜色的区域

    我制作了以下脚本来在 gnuplot 中绘制图表 有几个点 每个点都封闭在一定的区域内 我想给每个封闭区域指定颜色 我的脚本如下 set terminal wxt set yrange 0 100 set xrange 0 100 unse
  • 检测我正在哪台计算机上运行 R 脚本

    我正在寻找一个 R 函数来返回正在运行脚本的计算机的标识符 或者至少区分两台已知计算机中的一台 我有两台 PC 均运行 Windows 和 RStudio 我通过 VPN 使用办公室的台式机和笔记本电脑 通常处理相同的项目 并且始终使用 R
  • 是否可以等到其他线程处理发布到它的输入消息?

    我想可靠地模拟用户输入到其他窗口 我用SendInput为此 但我需要等到目标应用程序处理输入后再发送更多内容 据我所知 SendInput尽管它的名字如此 但它实际上将消息发布到队列中 并且不会等到它们被处理 我的尝试是基于等待消息队列至
  • jQuery:使用退出按钮退出全屏模式时如何执行代码?

    以下问题 使用我的代码 我通过单击列表中的图像进入全屏模式 我通过 jQuery 将下一个按钮和上一个按钮移动到屏幕边缘 但离开全屏模式后 我希望它们回到原来的位置 但是如何检测全屏模式是否被取消呢 这是我的代码 HTML div span
  • C++ 标准是否保证“a”“b”合并为“ab”? [复制]

    这个问题在这里已经有答案了 下面的代码是cpp标准吗 我以前见过它并且效果很好 但是 我不确定这个标准是否已经存在 include
  • 增强 java.util.Date 类时,cglib 抛出 IllegalArgumentException

    我正在努力增强java util Date与cglib 它不起作用 而且我对 cglib 没有经验 所以我想知道出了什么问题 例如 下面的代码增强了ArrayList works Test public void enhance Array
  • 合并 data.frame 但只保留唯一的列?

    假设我想合并两个 data frames 但有些列是多余的 相同 我如何合并这些 data frames 但删除冗余列 X1 data frame id c a b c same c 1 2 3 different1 c 4 5 6 X2
  • GoogleMock:如何精确预期具有特定参数的一次调用,并查看失败诊断?

    也许是一个技巧问题 我的问题是 如果我写 EXPECT CALL mock handleMessage Times 0 expectation 1 EXPECT CALL mock handleMessage Pointee IsLike
  • 在 opencv 中索引矩阵的最佳方法

    可以说 A and B是相同大小的矩阵 在Matlab 我可以使用简单的索引 如下所示 idx A gt 0 B idx 0 我怎样才能做到这一点OpenCV 我应该只使用 for i 0 rows for j 0 cols if A at