【发布时间】:2014-04-30 04:28:04
【问题描述】:
一个Mat可以是CV_8UC3, CV_8UC1, CV_32FC3等等。例如,对于一个CV_8UC3的Mat,我可以设置一个指针:Vec3b *p指向这个Mat。但是,如果我只知道可以使用Mat.type() 获得的 Mat 的数据类型,我该如何设置正确的指针?
【问题讨论】:
一个Mat可以是CV_8UC3, CV_8UC1, CV_32FC3等等。例如,对于一个CV_8UC3的Mat,我可以设置一个指针:Vec3b *p指向这个Mat。但是,如果我只知道可以使用Mat.type() 获得的 Mat 的数据类型,我该如何设置正确的指针?
【问题讨论】:
使用空指针。 void 指针可以指向任何数据类型。
【讨论】:
可悲的答案是:你不能。数据类型应在编译时设置。但在您的示例中,实际类型仅在运行时决定。您必须在代码中的某处放置 switch。即,您需要对所有可能的类型有不同的算法实现。但是请注意,您可以通过使用模板来防止代码重复。
如果您确实知道数据类型,而您唯一不知道的是通道数,那么问题就简单了一点。例如,如果您的图像包含 unsigned char,您可以编写
uchar* p = img.ptr<uchar>();
您的图像是有一个通道还是三个通道并不重要。当然,在实际使用像素时,您确实需要这些信息。
【讨论】: