У меня есть vector
из Point2f
, которые имеют цветовое пространство CV_8UC4
, и мне нужно преобразовать их в CV_64F
, правильный ли следующий код?
points1.convertTo(points1, CV_64F);
Подробнее:
Я пытаюсь использовать эту функцию для вычисления основной матрицы (поворот/перевод) с помощью 5-точечного алгоритма вместо использования findFundamentalMath, включенного в OpenCV, который основан на 8-точечном алгоритме:
https://github.com/prclibo/relative-pose-estimation/blob/master/five-point-nister/five-point.cpp#L69
Как видите, сначала он преобразует изображение в CV_64F
. Мое входное изображение - это изображение CV_8UC4
, BGRA
. Когда я тестировал функцию, изображения в BGRA
и оттенках серого давали правильные матрицы с математической точки зрения, но если я передаю изображение в градациях серого вместо цвета, для вычисления требуется гораздо больше времени. Что заставляет меня думать, что я что-то не так делаю в одном из двух случаев.
Я читал, что когда изменение цветового пространства не является линейным (что, я полагаю, происходит, когда вы переходите с 4 каналов на 1, как в этом случае), вы должны нормализовать значение интенсивности. Это правильно? Какой вход я должен дать этой функции?
Еще одно замечание, в моем коде функция вызывается так:
vector<Point2f>imgpts1, imgpts2;
for (vector<DMatch>::const_iterator it = matches.begin(); it!= matches.end(); ++it)
{
imgpts1.push_back(firstViewFeatures.second[it->queryIdx].pt);
imgpts2.push_back(secondViewFeatures.second[it->trainIdx].pt);
}
Mat mask;
Mat E = findEssentialMat(imgpts1, imgpts2, [camera focal], [camera principal_point], CV_RANSAC, 0.999, 1, mask);
Тот факт, что я передаю не Mat
, а вместо этого vector
из Point2f
, кажется, не создает проблем, поскольку он компилируется и выполняется правильно.
Это тот случай, когда я должен хранить спички в Mat
?