我使用以下代码访问Mat的元素并发现了这个难题:
这里出现了两个问题:
因此,当两者之间没有良好的对应关系时,函数崩溃。我几乎不知道哪些甚至兼容。例如,CV_16UC2是否与Vec2i ??
对应问题1 :这只能硬编码吗? 问题2 :如何了解兼容类型?
编辑01:
对不起,缺少信息!关于Mat_模板,为了清楚起见,我看过使用Mat_定义自己类型的帖子,避免使用OpenCV
默认类型。这是我第二个问题的答案吗?
答案 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,你只需要修改这些函数