有时您必须决定将哪种数据存储在矩阵中,并且必须在某处“硬编码”。
如果您决定您的数据矩阵是 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,您只需修改这些函数