c++ - 将 OpenCV-Matrix 转换为向量
问题描述
如何将 OpenCV 矩阵转换std::vector
为尽可能多的 OpenCV 类型(例如cv::Mat_<T>
,cv::Matx<T,M,N>
)?以下似乎不起作用,因为cv::Matx
没有begin
方法:
template <class T>
inline void foo(const T& data)
{
using value_type = typename T::value_type;
std::vector<value_type> v(data.begin(), data.end());
}
解决方案
在@rafix07 的建议下,我找到了解决方案:
#include <opencv2/opencv.hpp>
#include <vector>
#include <iostream>
template <class... T>
struct make_void
{
using type = void;
};
template <class... T>
using void_t = typename make_void<T...>::type;
template <class E, class = void>
struct has_iterator_interface : std::false_type
{
};
template <class E>
struct has_iterator_interface<E, void_t<decltype(std::declval<E>().begin())>>
: std::true_type
{
};
template <class T, typename = void>
struct as_vector
{
inline static auto get(const T& t)
{
using value_type = typename T::value_type;
cv::Mat_<value_type> s(t, false);
return std::vector<value_type>(s.begin(), s.end());
}
};
template <class T>
struct as_vector<T, typename std::enable_if_t<has_iterator_interface<T>::value>>
{
inline static auto get(const T& t)
{
using value_type = typename T::value_type;
return std::vector<value_type>(t.begin(), t.end());
}
};
int main()
{
cv::Mat_<double> A(2, 3, 0.0);
A(0, 0) = 0.0;
A(0, 1) = 1.0;
A(0, 2) = 2.0;
A(1, 0) = 3.0;
A(1, 1) = 4.0;
A(1, 2) = 5.0;
cv::Matx<double, 3, 4> B;
B(0, 0) = 0.0;
B(0, 1) = 1.0;
B(0, 2) = 2.0;
B(1, 0) = 3.0;
B(1, 1) = 4.0;
B(1, 2) = 5.0;
std::vector<double> a = as_vector<decltype(A)>::get(A);
std::vector<double> b = as_vector<decltype(B)>::get(B);
}
但是,我希望有更简单的东西。
推荐阅读
- android - 使用 Google @ Android、Kotlin 登录时出现错误 10
- javascript - 如何使用 vue 搜索过滤器 Firebase
- azure - 现在每个“az”命令都失败了,我该如何解决?
- asp.net-mvc - View.Render 后如何访问 ViewData/ViewBag?
- jquery - 使用 Jquery AJAX 调用、MVC 的路由行为
- rest - 我无法使用 Doctrine Rest Driver 向 Symfony API 平台发出正确的插入请求
- java - Maven 构建在 xsd 模式验证中失败
- javascript - 链接承诺 - 正确的方法
- vba - VBA 代码在调试模式下工作,但无法作为宏运行
- chatbot - Amazon Lex 机器人 - 如何删除或重命名槽