1


我在将 cv::Mat 转换为 std::vector 时遇到了麻烦:

cv::Mat m = cv::Mat_<int>::eye(3, 3);    
std::vector<int> vec = m;

给了我以下内容:

OpenCV Error: Assertion failed (dims == 2 && (size[0] == 1 || size[1] == 1 || size[0]*size[1] == 0)) in create, file /build/buildd-opencv_2.3.1-11-i386-tZNeKk/opencv-2.3.1/modules/core/src/matrix.cpp, line 1225
terminate called after throwing an instance of 'cv::Exception'
  what():  /build/buildd-opencv_2.3.1-11-i386-tZNeKk/opencv-2.3.1/modules/core/src/matrix.cpp:1225: error: (-215) dims == 2 && (size[0] == 1 || size[1] == 1 || size[0]*size[1] == 0) in function create

来自 mat.hpp:

template<typename _Tp> inline Mat::operator vector<_Tp>() const
{
    vector<_Tp> v;
    copyTo(v);
    return v;
}

稍后在 copyTo 中执行以下代码:

//mat.hpp 
template<typename _Tp> inline _OutputArray::_OutputArray(vector<_Tp>& vec) : _InputArray(vec) {}

template<typename _Tp> inline _InputArray::_InputArray(const vector<_Tp>& vec)
    : flags(STD_VECTOR + DataType<_Tp>::type), obj((void*)&vec) {}

// operations.hpp
template<typename _Tp> inline Size_<_Tp>::Size_()
    : width(0), height(0) {}

然后我得到一个例外。

任何的想法?它是一个错误吗?可能,我不明白的东西......提前谢谢你!

4

3 回答 3

3

您似乎正在尝试将二维 3x3 矩阵转换为一维向量。不确定您期望从中得到什么结果,但您可能希望将矩阵的一行转换为向量。您可以通过给向量构造函数一个指向行数据的指针来使用它:

int *p = eye.ptr<int>(0); // pointer to row 0
std::vector<int> vec(p, p+eye.cols); // construct a vector using pointer
于 2013-05-30T12:25:45.503 回答
1

那好吧!

cv::Mat 存储为字节数组!
因此,如果您想将矩阵表示为向量,您可以执行以下操作:

cv::Mat m = cv::Mat_<int>::eye(3, 3);
int* data = reinterpret_cast<int*>(m.data);
int len = m.rows * m.cols;
std::vector<int> vec(len);
std::copy(data + 0, data + len, vec.begin());
于 2013-05-30T16:40:17.147 回答
0

从错误消息来看,您似乎只能将一维为 1 的矩阵转换为std::vector,即仅行向量或列向量(从数学上讲):

dims == 2 && (size[0] == 1 || size[1] == 1)

哪种有意义...

于 2013-05-30T12:20:50.183 回答