c – 将一行cv :: Mat转换为std :: vector

c – 将一行cv :: Mat转换为std :: vector,第1张

概述我有一个相当简单的问题:如何采取一行cv :: mat并获取std :: vector中的所有数据? cv :: Mat包含双精度(为了问题的目的,它可以是任何简单的数据类型). 通过OpenCV文档是非常令人困惑的,除非我将页面加入书签,否则Googling无法找到两次文档页面,只需要很多的 *** 作即可. 我找到了cv :: Mat :: at(..)来访问Matrix元素,但是我记得从C Open 我有一个相当简单的问题:如何采取一行cv :: mat并获取std :: vector中的所有数据? cv :: Mat包含双精度(为了问题的目的,它可以是任何简单的数据类型).

通过OpenCV文档是非常令人困惑的,除非我将页面加入书签,否则Googling无法找到两次文档页面,只需要很多的 *** 作即可.

我找到了cv :: Mat :: at(..)来访问Matrix元素,但是我记得从C OpenCV到至少有3种不同的访问元素,所有这些都用于不同的目的…可以不记得用了什么:/

所以,在复制Matrix元素的时候一定会发挥作用,我正在寻找一种更有效的方法,如果可能的话,比每行的for循环要好一点.

解决方法 OpenCV矩阵中的数据以行主顺序布置,以便保证每一行都是连续的.这意味着您可以将一行中的数据解释为普通C数组.以下示例直接来自 the documentation:
// compute sum of positive matrix elements// (assuming that M is double-precision matrix)double sum=0;for(int i = 0; i < M.rows; i++){    const double* Mi = M.ptr<double>(i);    for(int j = 0; j < M.cols; j++)        sum += std::max(Mi[j],0.);}

因此最有效的方式是将plain指针传递给std :: vector:

// Pointer to the i-th rowconst double* p = mat.ptr<double>(i);// copy data to a vector.  Note that (p + mat.cols) points to the// end of the row.std::vector<double> vec(p,p + mat.cols);

这肯定比使用begin()和end()返回的迭代器快,因为这些涉及额外的计算以支持行之间的间隙.

总结

以上是内存溢出为你收集整理的c – 将一行cv :: Mat转换为std :: vector全部内容,希望文章能够帮你解决c – 将一行cv :: Mat转换为std :: vector所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1233387.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存