2013-05-30 101 views
1


我有一個麻煩的轉換CV ::墊到std ::向量:OpenCV 2.3.1。 CV ::墊到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) {} 

然後我得到一個例外。

有什麼想法?這是一個錯誤嗎?也許,我不明白什麼... 謝謝你提前!

回答

3

看起來你似乎試圖將一個二維3×3矩陣轉換爲一維向量。不知道你期待什麼結果,但你可能想要將矩陣的轉換成一個向量。你可以通過給矢量構造函數一個指向行數據的指針來使用它:

int *p = eye.ptr<int>(0); // pointer to row 0 
std::vector<int> vec(p, p+eye.cols); // construct a vector using pointer 
+0

我想將矩陣的行放入單個向量中。如果你對Octave/Matlab很熟悉,可以這樣做:m(:) –

+0

非常好!整個矩陣是不可能的。然後我應該遍歷所有的行。不管怎樣,謝謝你! –

+0

不確定OpenCV是否具有該功能,但您可以隨時自行完成。一次保存一行/一行(也許以後再合併)聽起來就像是一個計劃! –

0

從錯誤信息,它看起來像你只能轉換矩陣,其中的一個尺寸爲1至std::vector,即只有行或列向量(從數學上講):

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

哪一種有意義...

+1

我明白。但我認爲不允許將矩陣表示爲單個向量是奇怪的。這種表示在實踐中非常有用! =) –

+0

我當然同意! – DCS

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());