Мне интересно, существует ли обобщенный c подход для преобразования любого cv :: Mat в std :: vector. Для определенных c типов, например, 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'