gpt4 book ai didi

c++ - 将cv::Mat转换为std::vector的泛型函数

转载 作者:行者123 更新时间:2023-12-02 10:22:07 25 4
gpt4 key购买 nike

我想知道是否有通用方法将任何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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com