用vec类型变量构造Mat(解决一个问题)

来源:互联网 发布:apache httpd安装配置 编辑:程序博客网 时间:2024/05/17 04:58

http://blog.csdn.net/zssureqh/article/details/7598750

文章要说的内容如题:用vec类型变量构造Mat

在OpenCV2.3.1的英文版官方手册的25页有一段实例代码:

std::vector<Point3f> vec;
...

Mat pointMat = Mat(vec).     // convert vector to Mat, O(1) operation
                         reshape(1). // make Nx3 1-channel matrix out of Nx1 3-channel.
                                               
// Also, an O(1) operation
                         t();                 // finally, transpose the Nx3 matrix.
                                               
// This involves copying all the elements

第一行,当我们利用Mat(vec)来构造了一个Mat类型的后,如果我们直接利用Mat中的Mat.at<float>(i,j)来输出元素的时候,我发现它只是输出了Point3f一个三维空间点的第一个坐标值,那么问题出在什么地方呢?

让我们在Mat pointMat = Mat(vec).    一行按F9插入断点,然后按F11进入程序中去查看真相:

程序进入到了mat.hpp文件中如下图中的位置:

 

然后我们仔细分析代码:

template<typename _Tp> inline Mat::Mat(const vector<_Tp>& vec, bool copyData)
    : flags(MAGIC_VAL | DataType<_Tp>::type | CV_MAT_CONT_FLAG),  //初始化列表
    dims(2), rows((int)vec.size()), cols(1), data(0), refcount(0),               //初始化列表
    datastart(0), dataend(0), allocator(0), size(&rows)                            //初始化列表

{
    if(vec.empty())
        return;
    if( !copyData )
    {
        step[0] = step[1] = sizeof(_Tp);
        data = datastart = (uchar*)&vec[0];
        datalimit = dataend = datastart + rows*step[0];
    }
    else
        Mat((int)vec.size(), 1, DataType<_Tp>::type, (uchar*)&vec[0]).copyTo(*this);
}

 

如红色部分显示,原来我们构造的Mat类型数据的行数row等于vec.size()。那么因为vec的元素类型是Point3f类型的,所以其实我们产生的Mat的行数就是1.自然当我们利用循环来显示Mat数据时,就只显示出了一个元素,如果想显示三个坐标:那么我们只能利用data(指向真实数据的char*类型指针来操作了)

如下:

 cout<<*((float*)pointMat.data)<<endl;
 cout<<*((float*)pointMat.data+1)<<endl;

 cout<<*((float*)pointMat.data+2)<<endl;

原创粉丝点击