【问题标题】:How do I declare a vector in OpenCV?如何在 OpenCV 中声明向量?
【发布时间】:2016-04-21 08:27:49
【问题描述】:

如何在 OpenCV 中编写向量?包含 3 个类似 v = [p1,p2,p3] 的值?这是我尝试过的:

int dim [1] = {3};
Mat v(1,dim,CV_32F, Scalar(p1,p2,p3));

但是当我在 Qt 中进行调试时,我在本地和表达式窗口中看到向量 v 确实有 1 列和 3 行,但也有 2 个暗淡。我想知道这是否是由于声明中的 Mat 类型。 我可以用哪种类型替换它以获得一个包含 3 个值的简单向量?

【问题讨论】:

  • cv::Scalar 已经是 4 个元素的向量。您也可以使用cv::Vec_std::vectorMat 是一个二维向量,确实是一个矩阵。但是您需要指定您打算如何使用它,否则这只是一个过于宽泛的问题。
  • 一个包含 3 个值的简单向量(例如 double)可以是:cv::Vec3d v(p1, p2, p3);std::vector<double> v{p1, p2, p3};
  • 谢谢你的回复,我想对这个向量做一些操作,比如使用规范并改变它的元素
  • @Miki 如何访问这个向量的元素?

标签: c++ qt opencv vector


【解决方案1】:

我可以使用哪种类型来获得一个包含 3 个值的简单向量?我想对这个向量做一些操作,比如使用规范并改变它的元素。

你可以使用cv::Vec类型。

假设您正在处理 double 值(同样适用于其他类型),您可以:

// Create a vector
Vec3d v;

// Assign values / Change elements
v[0] = 1.1;
v[1] = 2.2;
v[2] = 3.3;

// Or initialize in the constructor directly 
Vec3d u(1.1, 2.2, 3.3);

// Read values
double d0 = v[0];

// Compute the norm, using cv::norm 
double norm_L2 = norm(v, NORM_L2); // or norm(v);
double norm_L1 = norm(v, NORM_L1);

为:

  • double 键入使用 Vec3d
  • float 键入使用 Vec3f
  • int 键入使用 Vec3i
  • short 键入使用 Vec3s
  • ushort 键入使用 Vec3w
  • uchar 键入使用 Vec3b

【讨论】:

  • CV_8SC3 怎么样?应该是 cv::Vec3b 吗?
  • @Pro_gram_mer 正如您在source code 中看到的那样,char 没有 typedef。您可以自己制作,例如:typedef Vec<char, 3> Vec3c;
  • 是的,它有效,CV_16FC3,CV_16FC1 我如何自己定义这个?
  • @Pro_gram_mer 一样,只是把char换成float16对应的类型(C++标准中没有)
猜你喜欢
  • 2012-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多