cv::Mat_ 到 std::vector 的转换
Posted
技术标签:
【中文标题】cv::Mat_ 到 std::vector 的转换【英文标题】:cv::Mat_ to std::vector conversion 【发布时间】:2011-03-23 12:14:02 【问题描述】:我使用的是OpenCV 2.0,cv::Mat_<_Tp>
类中有一个方法:
// conversion to vector.
operator vector<_Tp>() const;
实例化时,该实现无法在 MSVS 2005 上编译:
template<typename _Tp> inline Mat_<_Tp>::operator vector<_Tp>() const
CV_Assert( rows == 1 || cols == 1 );
return isContinuous() ? vector<_Tp>((size_t)(rows + cols - 1), (_Tp*)data) :
(vector<_Tp>)((Mat_<_Tp>)this->t());
它是 std::vector
的新奇特构造函数,它从 TR1 中获取 size_t
和 _Tp*
还是什么?
我认为他们可以通过迭代器来初始化向量:
vector<_Tp>((_Tp*)data, (_Tp*)data + rows + cols - 1)
这是一个错误,还是我不知道什么?
UPD。编译器错误文本:
...\lib\opencv\include\opencv\cxmat.hpp(691) : error C2665: 'std::vector<_Ty>::vector' : none of the 6 overloads could convert all the argument types
with
[
_Ty=double
]
c:\program files\microsoft visual studio 8\vc\include\vector(473): could be 'std::vector<_Ty>::vector(__w64 unsigned int,const _Ty &)'
with
[
_Ty=double
]
while trying to match the argument list '(size_t, double *)'
...\lib\opencv\include\opencv\cxmat.hpp(689) : while compiling class template member function 'cv::Mat_<_Tp>::operator std::vector<_Ty>(void) const'
with
[
_Tp=double,
_Ty=double
]
z:\dev\mine\temp\temp\entry.cpp(37) : see reference to class template instantiation 'cv::Mat_<_Tp>' being compiled
with
[
_Tp=double
]
【问题讨论】:
你能发布你得到的编译器错误吗? @Space_C0wb0y 我已经添加了它,但我怀疑它是否有帮助。消息只是说没有合适的过载。 【参考方案1】:不,C++0x 中有来自右值的新构造函数,但与这里使用的构造函数不同。
如果 isContinuous() 表示所有值都相同,您可以使用vector<_Tp>((size_t)(rows + cols - 1), *(_Tp*)data)
复制第一个值。
否则您的迭代器版本似乎正确。
【讨论】:
Bo,该函数可能会复制整个数据,因为它是一个转换例程。我猜 isContinuous() 表示矩阵是单行的,因此连续存储在内存中,我们不应该转置它。 isCONtinuous() 表示数据只是行*列,如果该行不是 32 位的倍数,openCV 填充数据,以便每个新行从 4 字节边界开始 好的,那么他们正在使用不可用的构造函数。对我来说看起来像一个错误!以上是关于cv::Mat_ 到 std::vector 的转换的主要内容,如果未能解决你的问题,请参考以下文章
将 Cv::Mat 的数据存储在 std::vector 中
OpenCV cv::Mat 使用 std::vector 导致潜在的内存泄漏
std::vector<cv::Vec3b> 到 cv::Mat