【问题标题】:Open CV generic Mat function headers打开 CV 通用 Mat 函数头
【发布时间】:2013-04-12 07:55:09
【问题描述】:

在 OpenCV 中,像这样访问 Mat 对象中的像素是很常见的:

float b = A.at<float>(4,5);

问题是,如果您不知道先验数据的类型,就会陷入困境。有没有一种方法可以编写接受模板类型为TMat 的通用函数头?我想为线性代数计算构建函数,我不想有一个if 子句分隔doublefloat。比如:

 void func(Mat <T> a) { 
     a.at<T>(3,4) = ...

这在 OpenCV 中可行吗?

【问题讨论】:

    标签: c++ templates opencv


    【解决方案1】:

    似乎另一种方法是使用Mat_ 对象而不是Mat

    template<typename T>
    void func(Mat_ <T> a) {
       cout << a(0,0) << endl;
    }
    

    如果要将Mat 传递给func,则必须指定类型:

    Mat a;
    func(Mat_<float>(a)); 
    

    如果您使用与原始Mat 类型不同的类型,OpenCV 将为您执行转换。

    【讨论】:

      【解决方案2】:

      这可以通过模板化你的函数来实现:

      template<typename T>
      void func(Mat a) { 
          a.at<T>(3,4) = ...
      

      但请注意,您没有简单的方法将类型 T 限制为仅 double 或 float,并且您的算法可能不适用于其他类型,但它可能不是实际问题。

      还要注意使用模板的缺点:What are the disadvantages of using templates?

      【讨论】:

      • 这段代码无法编译 - 你试过这个还是你只是猜测?
      • 我没有猜到但我不得不承认我没有尝试编译它抱歉,函数内部有一个错字。
      • 其实我并没有太在意 openCV 的 Mat 类,我认为它是 Mat 类,正如你的代码所暗示的那样被模板化,但它实际上只是方法,所以错字是其他方式。最后的编辑应该编译到 openCV Mat 类。
      【解决方案3】:

      OpenCV 2 Cookbook 第 40 页声称这是不可能的。另外,关于 Mat_:

      " 使用 cv::Mat 类的 at 方法有时会很麻烦 因为返回的类型必须指定为模板参数 每次通话。在矩阵类型已知的情况下,可以 使用 cv::Mat_ 类,它是 cv::Mat 的模板子类。

      cv::Mat_<uchar> im2= image; // im2 refers to image 
      im2(50,100)= 0; //access to row 50 and column 100 
      

      由于 cv::Mat_ 的类型 元素在创建变量时声明,operator() 方法在编译时就知道要返回哪种类型。”

      编辑:使用 Mat.type()

      Mat image=imread("image.bmp");
      cout<<image.type();
      

      控制台输出:

      16
      

      Wiki:该方法返回矩阵元素类型,一个id,兼容CvMat类型系统,如CV_16SC3或16位有符号3通道数组等。

      【讨论】:

        猜你喜欢
        • 2014-06-21
        • 1970-01-01
        • 1970-01-01
        • 2014-06-01
        • 1970-01-01
        • 2017-06-06
        • 2016-08-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多