【问题标题】:template initialization of opencv Mat from Vector来自 Vector 的 opencv Mat 模板初始化
【发布时间】:2013-01-12 07:10:19
【问题描述】:

我正在编写一个函数,其中包含一些行来将二维 STL 向量转换为 OpenCV Mat。因为,OpenCV 支持使用 Mat(vector) 从向量初始化 Mat。但这一次,我尝试了一个 2D 矢量,但没有成功。

函数很简单:

template <class NumType>
Mat Vect2Mat(vector<vector<NumType>> vect)
{
    Mat mtx = Mat(vect.size(), vect[0].size(), CV_64F, 0);  // don't need to init??
    //Mat mtx;

    // copy data
    for (int i=0; i<vect.size(); i++)
        for (int j=0; j<vect[i].size(); j++)
        {
            mtx.at<NumType>(i,j) = vect[i][j];
            //cout << vect[i][j] << " ";
        }   

    return mtx;
}

那么有没有办法用 NumType 相应地初始化 Mat mtx?语法总是固定为 CV_32F, CV_64F, .... 因此,非常受限

谢谢!

【问题讨论】:

    标签: opencv stl vector mat


    【解决方案1】:

    我想我已经找到了 OpenCV 文档中给出的答案。他们通过使用 DataType 类将该技术称为“类特征”。

    就像:

    Mat mtx = Mat::zeros(vect.size(), vect[0].size(), DataType<NumType>::type);
    

    例如:

      template <class NumType>
    cv::Mat Vect2Mat(std::vector<std::vector<NumType>> vect)
    {
        cv::Mat mtx = cv::Mat::zeros(vect.size(), vect[0].size(), cv::DataType<NumType>::type);  
        //Mat mtx;
    
        // copy data
        for (int i=0; i<vect.size(); i++)
            for (int j=0; j<vect[i].size(); j++)
            {
                mtx.at<NumType>(i,j) = vect[i][j];
                //cout << vect[i][j] << " ";
            }   
    
            return mtx;
    }
    

    【讨论】:

    • +1 以获得最佳答案。举个例子可能会有所帮助,我在弄清楚要更换哪些零件时遇到了一些麻烦,例如Mat mtx=Mat::zeros(vect.size(),vect[0].size(), DataType::type);
    猜你喜欢
    • 1970-01-01
    • 2023-03-30
    • 2018-09-21
    • 1970-01-01
    • 2019-08-28
    • 2017-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多