用vec类型变量构造Mat(解决一个问题)
2012-07-23 21:25
78 查看
/article/1568714.html
文章要说的内容如题:用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;
文章要说的内容如题:用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;
相关文章推荐
- Linux下shell脚本在crontab中一个周期执行不完,下周期任务被重复执行的问题解决
- 解决一个sis包含n个exe的问题
- C++使用出问题,菜鸟一个,不知怎么解决,郁闷
- 在CHtmlView中,判断一个页面加载完成的准确方法,解决OnDocumentComplete多次调用问题
- 64位win7下PL/SQL Developer 报“ORA-12154: TNS:无法解析指定的连接标识符”问题的一个解决办法
- 超简单的一个解决JAVA Enumeration问题的方案
- 一段对话,解决一个Exchange问题
- 为什么一个这样的小问题都没人解决得了??
- 一个实际问题分析及解决之六:java keystore的操作
- [Debug实践]windbg+性能监视器解决一个内存泄漏问题(非托管资源)
- 一个项目中遇到的若干问题-提出问题-分析问题-解决问题
- Client Copy中碰到的一个常见问题解决.
- 开心:解决一个osgi里hibernate事务transaction的问题
- 今天解决了困扰我几天的一个问题(F5与Shift+F5)
- 一个由于锁的作用域导致core dump的问题的解决
- 开发Struts 2项目遇到的一个问题,就是在struts-tags标签库下没有了s:datetimepicker标签的解决办法
- Mac OS X: MS Office for Mac问题解决的一个思路
- 解决Sql Server2000重新安装时”已经有一个程序挂起“的问题。
- JAVA策略模式(3)之解决具体遇到的一个问题
- 完美解决UI-Grid表格元素中多个空格显示为一个空格的问题