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&lt;_Tp&gt;((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

如何在不复制数据的情况下将 cv::Mat 转换为 2d std::vector

向量的 OpenCV 向量到 cv::Mat

将一行 cv::Mat 转换为 std::vector