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

标签 c++ opencv templates

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

相关文章:

python - 什么时候安装 imgaug.py 我得到这个错误

python - OpenCV 相机校准的均方根太高

c++ - 使用 NVAPI 从 NVidia GPU 获取温度

c++ - 在 OpenCV 2.3.1 中使用特征库

c++ - asn1c 不会从 asn.1 模块中提取 OCTET STRING 的默认值

c++ - 为成对容器的第一个元素提供迭代器

c++ - 将结构作为模板参数传递 - 如何修复此代码?

c++ - 在运行时根据 CUDA 计算能力切换主机功能

opencv - 使用图像的轮廓创建单独的图像?

c++ - std::normal_distribution 的类型取决于模板