向量的 OpenCV 向量到 cv::Mat
Posted
技术标签:
【中文标题】向量的 OpenCV 向量到 cv::Mat【英文标题】:OpenCV vector of vectors into cv::Mat 【发布时间】:2013-02-28 16:19:33 【问题描述】:我在 n 行和 m 列的 std::vector<std::vector<double>>
结构中有某些值,我想将其转换为等效的 cv::Mat 对象。这是我一直在使用的代码,但出现错误:
dctm 是一个本地参数,定义为:
std::vector<std::vector<double>>
cv::Mat dctmat = cvCreateMat(dctm.size(), dctm[0].size(), CV_16SC1);
for (size_t i = 0; i < dctm.size(); i++)
for (size_t j = 0; j < dctm[i].size(); j++)
dctmat.at<double>(i, j) = dctm[i][j];
【问题讨论】:
你得到的错误是什么? 【参考方案1】:dctmat
有一个CV_16SC1
类型,表示有符号短矩阵。但是您尝试使用不连贯的dctmat.at<double>(i, j)
访问它。将您的矩阵定义为CV_64FC1
或使用dctmat.at<short>(i, j)
访问它(第一个解决方案更好,因为您有一个double
的向量)。
【讨论】:
【参考方案2】:这是我的转换例程的模板版本
例程
template<typename _Tp> static cv::Mat toMat(const vector<vector<_Tp> > vecIn)
cv::Mat_<_Tp> matOut(vecIn.size(), vecIn.at(0).size());
for (int i = 0; i < matOut.rows; ++i)
for (int j = 0; j < matOut.cols; ++j)
matOut(i, j) = vecIn.at(i).at(j);
return matOut;
template<typename _Tp> static vector<vector<_Tp> > toVec(const cv::Mat_<_Tp> matIn)
vector<vector<_Tp> > vecOut(matIn.rows);
for (int i = 0; i < matIn.rows; ++i)
vecOut[i].resize(matIn.cols);
for (int j = 0; j < matIn.cols; ++j)
vecOut[i][j] = matIn.at<_Tp>(i, j);
return vecOut;
【讨论】:
【参考方案3】:Here 在 Opencv 文档中您可以找到:
Mat::Mat(int rows, int cols, int type, void* data, size_t step=AUTO_STEP)
Mat::Mat(Size size, int type, void* data, size_t step=AUTO_STEP)
...
那么,你可以这样使用:
Mat dctmat(dctm.size(), dctm[0].size(), CV_16SC1, dctm.data());
【讨论】:
你试过了吗?dctm.data()
不适用于我作为 vector 的vector以上是关于向量的 OpenCV 向量到 cv::Mat的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 OpenCV 将向量的结构复制到 C++ 中的另一个向量
如何在 C++/OpenCV 中将 cv::Point 添加到数组或向量?