opencv多通道元素访问

2024-01-07

我正在尝试学习如何使用 OpenCV 的新 C++ 界面。

如何访问多通道矩阵的元素?例如:

Mat myMat(size(3, 3), CV_32FC2);

for (int i = 0; i < 3; ++i)
{
    for (int j = 0; j < 3; ++j)
    {
        //myMat_at_(i,j) = (i,j);
    }
}

做到这一点最简单的方法是什么?类似于旧界面的 cvSet2D 之类的东西。
最有效的方法是什么?与旧接口中使用直接指针类似。


typedef struct elem_ {
        float f1;
        float f2;
} elem;
elem data[9] = { 0.0f };
CvMat mat = cvMat(3, 3, CV_32FC2, data );

float f1 = CV_MAT_ELEM(mat, elem, row, col).f1;
float f2 = CV_MAT_ELEM(mat, elem, row, col).f2;

CV_MAT_ELEM(mat, elem, row, col).f1 = 1212.0f;
CV_MAT_ELEM(mat, elem, row, col).f2 = 326.0f;

更新:适用于OpenCV2.0

1.选择一种类型来表示元素

Mat(或 CvMat)有 3 个维度:行、列、通道。
我们可以通过指定行和列来访问矩阵中的一个元素(或像素)。

CV_32FC2表示该元素是 32 位浮点值,具有 2 个通道。
所以上面代码中的 elem 是一种可接受的表示CV_32FC2.

您可以使用您喜欢的其他表示形式。例如 :

typedef struct elem_ { float val[2];    } elem;
typedef struct elem_ { float x;float y; } elem;

OpenCV2.0添加了一些新的类型来表示矩阵中的元素,例如:

template<typename _Tp, int cn> class CV_EXPORTS Vec // cxcore.hpp (208)

所以我们可以使用Vec<float,2>代表CV_32FC2,或使用:

typedef Vec<float, 2> Vec2f; // cxcore.hpp (254)

请参阅源代码以获取更多可以代表您的元素的类型。
这里我们使用Vec2f

2. 访问元素

访问 Mat 类中的元素的最简单有效的方法是 Mat::at。
它有 4 个重载:

template<typename _Tp> _Tp& at(int y, int x);                // cxcore.hpp (868)
template<typename _Tp> const _Tp& at(int y, int x) const;    // cxcore.hpp (870)
template<typename _Tp> _Tp& at(Point pt);                    // cxcore.hpp (869)
template<typename _Tp> const _Tp& at(Point pt) const;        // cxcore.hpp (871)
// defineded in cxmat.hpp (454-468)

// we can access the element like this :
Mat m( Size(3,3) , CV_32FC2 );
Vec2f& elem = m.at<Vec2f>( row , col ); // or m.at<Vec2f>( Point(col,row) );
elem[0] = 1212.0f;
elem[1] = 326.0f;
float c1 = m.at<Vec2f>( row , col )[0]; // or m.at<Vec2f>( Point(col,row) );
float c2 = m.at<Vec2f>( row , col )[1];
m.at<Vec2f>( row, col )[0] = 1986.0f;
m.at<Vec2f>( row, col )[1] = 326.0f;

3.与旧界面交互

Mat提供了2个转换函数:

// converts header to CvMat; no data is copied     // cxcore.hpp (829)
operator CvMat() const;                            // defined in cxmat.hpp
// converts header to IplImage; no data is copied
operator IplImage() const;

// we can interact a Mat object with old interface :
Mat new_matrix( ... );
CvMat old_matrix = new_matrix;  // be careful about its lifetime
CV_MAT_ELEM(old_mat, elem, row, col).f1 = 1212.0f;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

opencv多通道元素访问 的相关文章

随机推荐

  • NHibernate 3 - 扩展 Linq 提供程序 BaseHqlGeneratorForMethod.BuildHql 问题

    我想用我自己的方法扩展 NHibernate 3 的默认 LINQ 提供程序 我希望能够使用 POCO 中的一些方法 我有一个名为 Range 的组件 它在我的许多 POCO 中经常使用 这个 nhibernate 组件类有一个 Conta
  • 为什么Dev C++编译后PE文件中多了这么多节?

    我用C C 写了一些简单的代码 在win10上用Dev C MinGW 编译为PE格式 我使用 Stud PE 工具查看编译后的exe的PE文件结构如下 正如您所看到的 除了正常的文件部分 如 text data bss 之外 还有一些其他
  • 结帐单个产品:验证购物车中是否有任何产品,并给出错误

    我无法想象如何验证购物车内是否有某些产品 我只需要允许一种产品进行结账 这是 class wc cart php 中使用的代码 用于防止在购物车中已存在相同产品的情况下添加产品 并且我确信应该非常相似 但我缺少一些 WP 变量来定义任何产品
  • 空字符串上的 ToString

    为什么其中第二个会产生异常 而第一个却不会 string s null MessageBox Show s MessageBox Show s ToString 更新 我可以理解的异常 对我来说 令人困惑的是为什么第一部分没有显示异常 这与
  • 如何在 PHP 7.1.1 中对浮点值进行 json_encode?

    PHP好像有a bug https bugs php net bug php id 72567它在 json encode 中处理小数精度的方式 只需对一个简单的浮点数进行编码就很容易看出 echo json encode testVal
  • Collectionview PerformBatchUpdates 崩溃

    我正在尝试使用 insertItemsAtIndexPaths 将新项目添加到我的集合视图中 我的应用程序在执行 Batchupdate 时崩溃 void addItems NSArray newProducts 1 2 3 4 self
  • WPF 的 Windows Phone 7 枢轴控件?

    是否有实施WP7 枢轴控制 https web archive org web 20150715170117 http blogs msdn com 80 b stephanc archive 2010 05 09 windows phon
  • git config --get-all 在哪里查看

    我找不到任何文档准确描述正在检查的 git 配置文件git config get all command正在运行 这是我为 core autocrlf 运行时的输出 git config get all core autocrlf fals
  • 在 ActionBarSherlock 上显示自定义按钮以显示滑动菜单

    我正在开发一个 Android 应用程序 使用动作栏夏洛克 http actionbarsherlock com with 滑动菜单 https github com jfeinstein10 SlidingMenu 现在 这就是我显示打开
  • numpy 中两个浮点数之间以对数间隔的数字

    我正在尝试使用 python 获取两个浮点数之间对数间隔的 1000 个数字 例如 0 674 到 100 0 之间 这样做的目的是获得更多接近 0 674 的数字 而不仅仅是接近 100 的几个大数字 我尝试使用 numpy logspa
  • Python3'无法导入名称'cached_property'

    我无法让它发挥作用 我不断添加模块 但每次都找不到新模块 为什么这段代码在Python3 6中不起作用 Code from robobrowser import robobrowser from bs4 import BeautifulSo
  • 区分 Javascript 中的触摸和交换事件

    我有一个用于交换图像的图片库 在画廊中 我使用了 touchstart touchmove touchend 和 touchcancel 事件 但现在我还需要处理触摸事件 那么 我应该在移动设备上分别区分触摸和交换事件吗 我正在使用这个技巧
  • python `str()` 函数是否调用类的 `__str__()` 函数?

    如果我定义一个有自己的类 str 函数 是str a 相当于a str where a是我班级的一个实例吗 我检查了蟒蛇文档 https docs python org 2 library functions html str 它没有明确说
  • 在 Groovy 中使用字符串访问地图的地图元素

    鉴于我有一张这样的地图 def myMap b c X 还有一根绳子 def key b c 我想查看使用密钥获取值 X 的选项 我自己想出了两种方法来实现这一目标 但我对这些解决方案不太满意 1 Eval me theMap myMap
  • 加密:在javascript和python中模拟SSL

    由于中国防火墙阻止了 google appengine 的 https 端口 所以我想通过javascript和python模拟一个安全套接字层来保护我的用户信息不会被那些ISP和GFW捕获 我的计划 握手 浏览器请求服务器 服务器生成加密
  • jaxb 当 xsi:nil=true 如果任何子元素存在它仍然显示

    我有以下 xml 输出 当父元素具有属性 xsi nil true 即使子元素为 nillable true 时 我们如何隐藏子元素 endDate XML输出
  • REST API 中错误 HTTP 方法的返回代码?

    我们的API用户可以获得root发送文件 收集清单 GET请求根 API 地址 如果他发送POST 我们应该返回一些东西 同样的问题也适用于其他资源路径 例如发送PATCH在查询路径等上 并非所有方法在某些路径上都有意义 正如我从 HTTP
  • 使用插值在模板中渲染 html 字符串?

    使用角度 4 3 0 假设我有一个像这样的字符串 它是组件的属性 p test 2 bla bla p p test1234 56 p p test test p 所以 我按照文档进行操作 https angular io guide te
  • 有没有办法知道哪个编译器生成了静态库?

    第三方为我提供了一个静态库 a 用于在 Solaris 站上链接 我尝试使用 sunpro 进行编译 但在链接步骤失败 我想这个问题来自我使用的编译器 而不是 gcc 或者只是它的版本 因为编译器提供的 std lib 可能会从库预期的版本
  • opencv多通道元素访问

    我正在尝试学习如何使用 OpenCV 的新 C 界面 如何访问多通道矩阵的元素 例如 Mat myMat size 3 3 CV 32FC2 for int i 0 i lt 3 i for int j 0 j lt 3 j myMat a