OpenCV Mat访问中的常见错误&使用Mat_

时间:2012-09-14 03:19:19

标签: opencv matrix

我使用以下代码访问Mat的元素并发现了这个难题: enter image description here

这里出现了两个问题:

  • nzpxl Mat很难定义类型CV_16UC2,或者它是从这个函数的调用者传入的
  • nzpxl被访问,其中也是一个硬表格

因此,当两者之间没有良好的对应关系时,函数崩溃。我几乎不知道哪些甚至兼容。例如,CV_16UC2是否与Vec2i ??

对应

问题1 :这只能硬编码吗? 问题2 :如何了解兼容类型?

编辑01: 对不起,缺少信息!关于Mat_模板,为了清楚起见,我看过使用Mat_定义自己类型的帖子,避免使用OpenCV默认类型。这是我第二个问题的答案吗?

1 个答案:

答案 0 :(得分:1)

有一段时间你必须决定你在矩阵中存储什么类型的数据,这必须在某处“硬编码”。

如果您确定数据矩阵的类型为CV_16UC2,那么您应该检查访问此矩阵中像素的所有函数(例如,使用at<>),矩阵是预期的形式:

void someFunction(cv::Mat &myMatrixOf16UC2) {
  // using asserts
  assert(myMatrixOf16UC2.type() == CV_16UC2);
  // or using exceptions
  if (myMatrixOf16UC2.type() != CV_16UC2)
    throw  someException;


  // do the job

}

顺便说一下,int是32位,所以Vec2i应该处理用CV_32SC2分配的矩阵。 CV_16UC2 - > cv :: Vec2s,甚至是在OpenCV中没有预定义typedef的cv :: Vec。

一个有用的实践是为你的程序定义你正在使用的数据与typedef和相应的type()函数,例如在标题中:

 typedef cv::Vec<unsigned short, 2> pixel_t;

 int getOpenCVTypeForMyPixelType() { return CV_16UC2; }

然后,如果你想从short更改为int或float,你只需要修改这些函数