【问题标题】:Acces Matrix value without knowing the type opencv在不知道 opencv 类型的情况下访问 Matrix 值
【发布时间】:2016-01-13 19:39:40
【问题描述】:

我正在编写一个函数,我需要在其中访问Mat 的元素,但该函数可以接收不同类型的Mat。所以,如果我有:

filtered.at<TypeofMat>(i) = (typeofmat) somevalue;

我只是想到做这样的事情filtered.at&lt;myMat.type()&gt;(i),但显然这不起作用,因为type 返回一个int

我卡住了,谁能给点灯?

【问题讨论】:

  • 你能把你想做的功能的简化版展示一下吗?
  • 我正在创建用于应用平滑过滤器的内核。我有两个函数,一个创建内核(也访问 Mat 元素),一个计算卷积。
  • 通常,如果您知道通道数(这里应该是 1,对吗?),您只需在内部将所有矩阵转换为双精度 CV_64F,并在内部使用双精度。然后将结果转换回原始类型。
  • 我要试试,谢谢!,它有效,让你的评论成为答案:-)
  • 您可以在内部将图像转换为 CV_64FC3,并处理双打

标签: c++ opencv mat


【解决方案1】:

您可以将源矩阵转换为双精度矩阵(类型为CV_64F)。这样您就不会因为投射而丢失任何数据。然后你可以像往常一样处理这个矩阵,因为你知道它的类型。最后一步是将目标图像转换回源类型。

不过,您需要知道矩阵的通道数。 CV_assert 将确保您使用正确的类型。

#include <opencv2/opencv.hpp>
using namespace cv;

void foo(const Mat& src, Mat& dst)
{
    // Assert number of channels
    CV_Assert(src.channels() == 3);

    // Convert to CV64F
    Mat3d _src, _dst;
    src.convertTo(_src, CV_64F);
    _dst.create(_src.size());

    // Work on _src and _dst (you know the type)
    _dst(0,0) = _src(0,0) + Vec3d(1,2,3);

    // Convert _dst to src type
    _dst.convertTo(dst, src.type());
}

int main()
{
    Mat3b img(10,10,Vec3b(0,0,0));

    Mat res;
    foo(img, res);

    // res will be CV_8UC3

    return 0;
}

这种方法还有其他选择:

  • 创建一个模板函数并调用适当的特化。见here
  • 处理原始指针。见here
  • 仅使用能够正确处理每种类型的 OpenCV 函数。见here。如果可用,这通常是最佳选择。

【讨论】:

  • 只是一个普遍的疑问,下面答案中的模板方法可以工作吗?
  • 是的,但是您需要switch 才能在调用函数中选择具有正确模板的函数。这相当于我提到的第一种替代方法
【解决方案2】:

如果有可能,将接收openCV Mat的函数设为模板函数:

void f<typename T>(const Mat& m)
{
    (void) m.at<T>(0, 0);
}

这样使用它:

Mat m1/* ... */;
m1.at<int>(0, 0) = 0;
f<int>(m);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-28
    • 1970-01-01
    • 2012-09-19
    • 1970-01-01
    • 2016-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多