我想知道是否有通用方法将任何cv::Mat转换为std::vector。
对于特定类型,例如我可以给类似的东西:
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'
最佳答案
您可以接受任何Mat
并使用SFINAE对其进行约束。
例如:
template<class Mat, std::enable_if_t<
std::is_arithmetic_v<typename Mat::value_type>, int> = 0>
auto convert(const Mat& mat) {
using T = typename Mat::value_type;
std::vector<T> arr;
// ...
return arr;
}
template<class Mat, std::enable_if_t<
std::is_arithmetic_v<typename Mat::value_type::value_type>, int> = 0>
auto convert(const Mat& mat) {
using T = typename Mat::value_type::value_type;
constexpr auto channels = typename Mat::value_type::channels; // = C
std::vector<T> arr;
// ...
return arr;
}
第一个函数将接受带有任何算术
cv::Mat_<T>
的T
。第二个将接受带有任何cv::Mat_<T>
的T
,以便T::value_type
是一种有效的算术类型(例如cv::Mat_<cv::Vec4f>
)。如果需要,可以使用SFINAE添加更多约束。
关于c++ - 将cv::Mat转换为std::vector的泛型函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59648756/