【发布时间】:2020-01-08 15:12:24
【问题描述】:
我想知道是否有一种通用方法可以将任何 cv::Mat 转换为 std::vector。 对于特定类型,例如uchar 我可以这样:
std::vector<uchar> convert(const cv::Ma& mat)
{
std::vector<uchar> array;
if (mat.isContinuous()) {
array.assign(mat.data, mat.data + mat.total());
} else {
for (int i = 0; i < mat.rows; ++i) {
array.insert(array.end(), mat.ptr<uchar>(i), mat.ptr<uchar>(i)+mat.cols);
}
}
return array;
}
但是,我想避免为不同类型重复我的代码,并有类似的内容:
template<typename T>
std::vector<T> convert(const cv::Mat_<T>& mat)
{
std::vector<T> array;
if (mat.isContinuous()) {
array.assign(mat.data, mat.data + mat.total());
} else {
for (int i = 0; i < mat.rows; ++i) {
array.insert(array.end(), mat.ptr(i), mat.ptr(i)+mat.cols);
}
}
}
这不起作用,因为例如 cv::Mat 是通过 cv::Vec4f 模板化的。 当然我现在可以做类似的事情
template<typename T, int C>
std::vector<T> convert(const cv::Mat_<cv::Vec<T,C>>& mat)
.. 但为此我收到一条错误消息:note: candidate template ignored: could not match 'Mat_<Vec<type-parameter-0-0, cn> >' against 'cv::Mat'
【问题讨论】:
-
标量矩阵和向量矩阵是不同的东西。您希望如何将后者转换为向量?
-
是的,确实这些是不同的东西,但它们仍然可以排列成一个大小为 rows*cols*depth 的标量向量。
-
所以你想“扁平化”向量矩阵?例如,您是否需要对矩阵矩阵进行泛化?
-
没错,我想把它展平。嗯,如果我们将向量视为
矩阵,那么输入就是一种矩阵矩阵。为什么要问? -
使用模板,您可以编写一个非常通用的解决方案。所以我想了解你是需要它还是
cv::Mat_<cv::Vec<T,C>>是你唯一关心的类型。