Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenCV'中“`const Mat*samples``param”的加工;s``calcCovarMatrix``函数?_C++_Opencv_Opencv3.0 - Fatal编程技术网

C++ OpenCV'中“`const Mat*samples``param”的加工;s``calcCovarMatrix``函数?

C++ OpenCV'中“`const Mat*samples``param”的加工;s``calcCovarMatrix``函数?,c++,opencv,opencv3.0,C++,Opencv,Opencv3.0,我试图在OpenCV中计算多个矩阵的协方差矩阵,并看到了2个版本的。我很好奇,想使用重载版本,它将const Mat*samples,int nsamples作为前两个参数 问题:什么是samplesparam?它是指向矩阵向量的第一项的指针吗?为什么它本身不是一个向量?一个人要传递什么信息/参数是如何工作的 注意:我不想使用该函数的另一个重载版本!我想了解我询问的版本中使用的实际代码。我确信OpenCV的作者更喜欢const Mat*,int对参数,而不是std::vector,因为这更灵活

我试图在OpenCV中计算多个矩阵的协方差矩阵,并看到了2个版本的。我很好奇,想使用重载版本,它将
const Mat*samples,int nsamples
作为前两个参数

问题:什么是
samples
param?它是指向矩阵向量的第一项的指针吗?为什么它本身不是一个向量?一个人要传递什么信息/参数是如何工作的


注意:我不想使用该函数的另一个重载版本!我想了解我询问的版本中使用的实际代码。

我确信OpenCV的作者更喜欢
const Mat*
int
对参数,而不是
std::vector
,因为这更灵活

想象一个必须处理一系列特定对象的函数

<>在C++中,一系列对象可以用<代码> STD::vector < /代码>来存储。但是,如果该对象系列是静态常量,即可以在编译时定义,该怎么办?一个普通的旧C数组也可以完成这项工作

可以处理这一系列对象的函数可以接受
常量std::vector&
。如果应用于C数组,则必须构建临时向量实例。C++代码相对简单,但在胃部中留下一种不安的感觉,因为数组内容必须被复制到临时<代码> STD::vector < /COR>实例,以便将其传递给函数。 相反的情况:函数接受一个指向起始对象的指针和一个计数(与C中的常见情况相同)。这样的函数可以应用于C数组以及
std::vector
,因为
std::vector
提供了一个方法,该方法提供指向其第一个元素的常量指针和
size()
方法。此外,允许向量元素像在C数组中一样连续存储

因此,我举一个简单的例子:

#include <cassert>
#include <cmath>
#include <iostream>
#include <vector>

// Pi (from Windows 7 calculator)
const float Pi = 3.1415926535897932384626433832795;

struct Point {
  float x, y;
};

std::ostream& operator<<(std::ostream &out, const Point &point)
{
  return out << '(' << point.x << ", " << point.y << ')';
}

Point average(const Point *points, size_t size)
{
  assert(size > 0);
  Point sum = points[0];
  for (size_t i = 1; i < size; ++i) {
    sum.x += points[i].x; sum.y += points[i].y;
  }
  return { sum.x / (unsigned)size, sum.y / (unsigned)size };
}

static const Point square[] = {
  { -0.5f, -0.5f },
  { +0.5f, -0.5f },
  { +0.5f, +0.5f },
  { -0.5f, +0.5f }
};
static const size_t sizeSquare = sizeof square / sizeof *square;

int main()
{
  // process points of a static const square (using average() with an array)
  std::cout << "CoG of " << sizeSquare << " points of square: "
    << average(square, sizeSquare) << '\n';
  // build a tesselated circle
  std::vector<Point> circle;
  const unsigned n = 16;
  for (unsigned i = 0; i < n; ++i) {
    const float angle = i * 2 * Pi / n;
    circle.push_back({ std::sin(angle), std::cos(angle) });
  }
  // process points of that circle (using average() with a vector)
  std::cout << "CoG of " << circle.size() << " points of circle: "
    << average(circle.data(), circle.size()) << '\n';
  // done
  return 0;
}

为方便起见,可以为
std::vector
添加以下替代定义:

static inline Point average(const std::vector<Point> &points)
{
  return average(points.data(), points.size());
}
静态内联点平均值(const std::vector&points)
{
返回平均值(points.data(),points.size());
}
一个通用的解决方案将提供一个具有两个迭代器的替代方案,这两个迭代器可以应用于任何容器。(C++标准库中有很多例子)
我只能假设OpenCV的作者关注的是性能,而不是灵活性(但这只是我个人的猜测)。

那么为什么不检查一下呢?我有点不清楚我是否正确回答了你的问题,但我试着:假设你有一个取
std::vector
(当然,最好使用
const std::vector&
)现在,想象一下你有一个固定的静态数组,里面有一些你想输入的东西,如果没有一个副本,这是不可能的,因为它可能会像不必要的一样昂贵。现在,想象一下相反的情况:一个函数,它需要一个
常量某物*
和一个
大小\u t
。是的,它看起来很难看,很时髦,但是:你可以输入数组的地址和长度有一点
sizeof
magic…您还可以使用
std::vector::data()
std::vector::size()
输入
std::vector::vector
(这适用于除
bool
之外的所有类型,但这是另一回事。)因此,丑陋的C-Style函数实际上更灵活。顺便说一句,如果有疑问,只需生成第二个函数(作为内联函数),该函数接受
std::vector
,并使用
data()
size()
(如果我遇到了你的问题,我很乐意用一个简单的实际例子来回答);-)@Miki,因为源代码只显示正在做的事情,而不是为什么它是这样(即,没有解释为什么它不是一个
std::vector
)。@Scheff所以它是为了灵活性?谢谢你的解释!如果你回答我,我很乐意接受你的回答:)