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

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

【问题讨论】:

    标签: c++ opencv 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,那么结果就会混淆。
    • 在这种情况下,您将需要对不同数量的通道进行不同的实现(每个实现都是数据类型的模板)
    猜你喜欢
    • 2011-10-20
    • 1970-01-01
    • 2010-11-11
    • 2011-08-04
    • 2023-03-23
    • 1970-01-01
    • 2020-06-24
    • 2011-12-01
    • 2022-01-11
    相关资源
    最近更新 更多