試試這個代碼徵到CV:
template<typename _Tp, int _rows, int _cols, int _options, int _maxRows, int _maxCols>
void eigen2cv(const Eigen::Matrix<_Tp, _rows, _cols, _options, _maxRows, _maxCols>& src, cv::Mat& dst)
{
if (!(src.Flags & Eigen::RowMajorBit))
{
cv::Mat _src(src.cols(), src.rows(), cv::DataType<_Tp>::type,
(void*)src.data(), src.stride() * sizeof(_Tp));
cv::transpose(_src, dst);
}
else
{
cv::Mat _src(src.rows(), src.cols(), cv::DataType<_Tp>::type,
(void*)src.data(), src.stride() * sizeof(_Tp));
_src.copyTo(dst);
}
}
正如你可以看到這個執行復制。用一個你不需要關心的矩陣,但你可以改變代碼。要獲得第一列,請使用cv::Mat::column()
。
嘗試這些方法CV之一徵:
template<typename _Tp, int _rows, int _cols, int _options, int _maxRows, int _maxCols>
void cv2eigen(const Mat& src,
Eigen::Matrix<_Tp, _rows, _cols, _options, _maxRows, _maxCols>& dst)
{
CV_DbgAssert(src.rows == _rows && src.cols == _cols);
if(!(dst.Flags & Eigen::RowMajorBit))
{
Mat _dst(src.cols, src.rows, DataType<_Tp>::type,
dst.data(), (size_t)(dst.stride()*sizeof(_Tp)));
if(src.type() == _dst.type())
transpose(src, _dst);
else if(src.cols == src.rows)
{
src.convertTo(_dst, _dst.type());
transpose(_dst, _dst);
}
else
Mat(src.t()).convertTo(_dst, _dst.type());
CV_DbgAssert(_dst.data == (uchar*)dst.data());
}
else
{
Mat _dst(src.rows, src.cols, DataType<_Tp>::type,
dst.data(), (size_t)(dst.stride()*sizeof(_Tp)));
src.convertTo(_dst, _dst.type());
CV_DbgAssert(_dst.data == (uchar*)dst.data());
}
}
template<typename _Tp>
void cv2eigen(const Mat& src,
Eigen::Matrix<_Tp, Eigen::Dynamic, Eigen::Dynamic>& dst)
{
dst.resize(src.rows, src.cols);
if(!(dst.Flags & Eigen::RowMajorBit))
{
Mat _dst(src.cols, src.rows, DataType<_Tp>::type,
dst.data(), (size_t)(dst.stride()*sizeof(_Tp)));
if(src.type() == _dst.type())
transpose(src, _dst);
else if(src.cols == src.rows)
{
src.convertTo(_dst, _dst.type());
transpose(_dst, _dst);
}
else
Mat(src.t()).convertTo(_dst, _dst.type());
CV_DbgAssert(_dst.data == (uchar*)dst.data());
}
else
{
Mat _dst(src.rows, src.cols, DataType<_Tp>::type,
dst.data(), (size_t)(dst.stride()*sizeof(_Tp)));
src.convertTo(_dst, _dst.type());
CV_DbgAssert(_dst.data == (uchar*)dst.data());
}
}
template<typename _Tp>
void cv2eigen(const Mat& src,
Eigen::Matrix<_Tp, Eigen::Dynamic, 1>& dst)
{
CV_Assert(src.cols == 1);
dst.resize(src.rows);
if(!(dst.Flags & Eigen::RowMajorBit))
{
Mat _dst(src.cols, src.rows, DataType<_Tp>::type,
dst.data(), (size_t)(dst.stride()*sizeof(_Tp)));
if(src.type() == _dst.type())
transpose(src, _dst);
else
Mat(src.t()).convertTo(_dst, _dst.type());
CV_DbgAssert(_dst.data == (uchar*)dst.data());
}
else
{
Mat _dst(src.rows, src.cols, DataType<_Tp>::type,
dst.data(), (size_t)(dst.stride()*sizeof(_Tp)));
src.convertTo(_dst, _dst.type());
CV_DbgAssert(_dst.data == (uchar*)dst.data());
}
}
template<typename _Tp>
void cv2eigen(const Mat& src,
Eigen::Matrix<_Tp, 1, Eigen::Dynamic>& dst)
{
CV_Assert(src.rows == 1);
dst.resize(src.cols);
if(!(dst.Flags & Eigen::RowMajorBit))
{
Mat _dst(src.cols, src.rows, DataType<_Tp>::type,
dst.data(), (size_t)(dst.stride()*sizeof(_Tp)));
if(src.type() == _dst.type())
transpose(src, _dst);
else
Mat(src.t()).convertTo(_dst, _dst.type());
CV_DbgAssert(_dst.data == (uchar*)dst.data());
}
else
{
Mat _dst(src.rows, src.cols, DataType<_Tp>::type,
dst.data(), (size_t)(dst.stride()*sizeof(_Tp)));
src.convertTo(_dst, _dst.type());
CV_DbgAssert(_dst.data == (uchar*)dst.data());
}
}
來源:此代碼是從OpenCV的本身而論,他們用它作爲內部的OpenCV可以使用libeigen對國內一些任務。我不明白爲什麼格式轉換到這樣的庫和Qt沒有通過API公開。
可能重複[OpenCV的CV ::墊和本徵::矩陣(http://stackoverflow.com/questions/14783329/opencv-cvmat-and-eigenmatrix )。無需複製數據,請使用Eigen :: Map。看看這裏的答案:http://stackoverflow.com/questions/14783329/opencv-cvmat-and-eigenmatrix/21706778#21706778 – Ela782 2015-01-27 12:04:03