конвертировать вектор OpenCV 2к вектору - PullRequest
7 голосов
/ 12 сентября 2011

Средство поиска контуров 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));
}

Ответы [ 2 ]

11 голосов
/ 15 сентября 2011

Предполагая, что src и dst являются векторами, в OpenCV 2.x вы можете сказать:

cv::Mat(src).copyTo(dst);

А в OpenCV 2.3.x вы можете сказать:

cv::Mat(src).convertTo(dst, dst.type());  

ОБНОВЛЕНИЕ: type () является функцией Mat , а не класса std :: vector . Следовательно, вы не можете вызвать dst.type () .

Если вы создаете экземпляр Mat с использованием dst в качестве входных данных, вы можете вызвать функцию type () для вновь созданного объекта:

cv::Mat(dst).type();
2 голосов
/ 12 сентября 2015

Имейте в виду, что преобразование из cv :: Point2f в cv :: Point2i может привести к неожиданным результатам.

float j = 1.51;    
int i = (int) j;
printf("%d", i);

Результатом будет "1".

, а

cv::Point2f j(1.51, 1.49);
cv::Point2i i = f;
std::cout << i << std::endl;

приведет к «2, 1».

Это означает, что от Point2f к Point2i будут округляться, а приведение типов будет усечено.

http://docs.opencv.org/modules/core/doc/basic_structures.html#point

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...