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

2 次元の 3x3 行列を 1 次元のベクトルに変換しようとしているようです。それからどのような結果が期待されるかはわかりませんが、おそらく行列のをベクトルに変換したいと思うでしょう。これを使用するには、ベクター コンストラクターに行データへのポインターを指定します。

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 に答える