如何在 OpenCV 中设置指向 Mat 变量内容的指针

Posted

技术标签:

【中文标题】如何在 OpenCV 中设置指向 Mat 变量内容的指针【英文标题】:how can set a pointer to the content of a Mat variable in OpenCV 【发布时间】:2014-04-30 04:28:04 【问题描述】:

一个Mat可以是CV_8UC3, CV_8UC1, CV_32FC3等等。例如,对于一个CV_8UC3的Mat,我可以设置一个指针:Vec3b *p指向这个Mat。但是,如果我只知道可以使用Mat.type() 获得的 Mat 的数据类型,我该如何设置正确的指针?

【问题讨论】:

【参考方案1】:

使用空指针。 void 指针可以指向任何数据类型。

http://www.learncpp.com/cpp-tutorial/613-void-pointers/

【讨论】:

我不明白这个。例如,如果我想更改 Mat(CV_8UC3) 的第一个元素,我设置一个 void 指针指向它。但是我们不知道一个元素应该占据多少位。我们如何才能将 void 指针转换为正确的类型?我知道的唯一方法是使用 switch 来测试 Mat 的所有数据类型。但这应该没有效率。【参考方案2】:

可悲的答案是:你不能。数据类型应在编译时设置。但在您的示例中,实际类型仅在运行时决定。您必须在代码中的某处放置 switch。即,您需要对所有可能的类型有不同的算法实现。但是请注意,您可以通过使用模板来防止代码重复。

如果您确实知道数据类型,而您唯一不知道的是通道数,那么问题就简单了一点。例如,如果您的图像包含 unsigned char,您可以编写

uchar* p = img.ptr<uchar>();

您的图像是有一个通道还是三个通道并不重要。当然,在实际使用像素时,您确实需要这些信息。

【讨论】:

问题是如果类型是CV_32FC1,我们还能用uchar*p吗?谢谢! 理论上是的。如果您以与我相同的方式使用它。它将编译和运行而不会崩溃。它甚至会返回指向内存中正确位置的指针。但是你能用它做什么呢?另请注意,如果您将 .ptr() 或 .at() 与任何非零参数一起使用,它将给您错误的位置。 我想访问一个 Mat 中的每个元素。它的类型可以使用 Mat::type() 给出。但这只能在运行期间知道。我知道如果我使用你的方法,代码会运行但结果会出错。比如mat是CV_8UC3,但是我们使用uchar*p,那么结果就会混淆。 在这种情况下,您将需要对不同数量的通道进行不同的实现(每个实现都是数据类型的模板)

以上是关于如何在 OpenCV 中设置指向 Mat 变量内容的指针的主要内容,如果未能解决你的问题,请参考以下文章

如何在qmake中设置libs顺序?

如何在 mat-select 中设置自动对焦?

来自无符号短数组的 OpenCV Mat

安卓上的 OpenCV,Mat.rows() = 0

关于opencv中cv::Mat设置roi

Angular Material:如何在 TS 中设置具有不同背景颜色的每个 mat-h​​orizo​​ntal-stepper 步进器图标