Средство поиска контуров OpenCV 2 возвращает vector<Point2i>
, но иногда вы хотите использовать их с функцией, которая требует vector<Point2f>
. Какой самый быстрый, самый элегантный способ конвертации?
Вот несколько идей. Очень общая функция преобразования для всего, что может быть преобразовано в Mat
:
template <class SrcType, class DstType>
void convert1(std::vector<SrcType>& src, std::vector<DstType>& dst) {
cv::Mat srcMat = cv::Mat(src);
cv::Mat dstMat = cv::Mat(dst);
cv::Mat tmpMat;
srcMat.convertTo(tmpMat, dstMat.type());
dst = (vector<DstType>) tmpMat;
}
Но здесь используется дополнительный буфер, поэтому он не идеален. Вот подход, который предварительно выделяет вектор, затем вызывает copy()
:
template <class SrcType, class DstType>
void convert2(std::vector<SrcType>& src, std::vector<DstType>& dst) {
dst.resize(src.size());
std::copy(src.begin(), src.end(), dst.begin());
}
Наконец, используя back_inserter
:
template <class SrcType, class DstType>
void convert3(std::vector<SrcType>& src, std::vector<DstType>& dst) {
std::copy(src.begin(), src.end(), std::back_inserter(dst));
}