1

我使用以下代码访问 Mat 的元素并发现了这个困难: 在此处输入图像描述

这里出现2个问题:

  • nzpxl Mat 是硬定义的类型 CV_16UC2 或者它是从这个函数的调用者传入的
  • nzpxl 的访问方式是 at which 也是一种硬形式

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

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

编辑01:抱歉信息不足!关于 Mat_ 模板,我已经看到使用 Mat_ 来定义自己的类型以清楚起见并避免使用OpenCV默认类型的帖子。这是我第二个问题的答案吗?

4

1 回答 1

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,您只需修改这些函数

于 2012-09-14T08:52:27.760 回答