В 2D-сфере у вас есть полярные координаты.OpenCV имеет две удобные функции для преобразования декартовой и полярной координат cartToPolar и polarToCart .Кажется, нет хорошего примера использования этих функций, поэтому я сделал для вас одну из них, используя функцию cartToPolar
:
#include <opencv2/core/core.hpp>
#include <iostream>
#include <vector>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
vector<double> vX;
vector<double> vY;
for(int y = 0; y < 3; y++)
{
for(int x = 0; x < 3; x++)
{
vY.push_back(y);
vX.push_back(x);
}
}
vector<double> mag;
vector<double> angle;
cartToPolar(vX, vY, mag, angle, true);
for(size_t i = 0; i < mag.size(); i++)
{
cout << "Cartesian (" << vX[i] << ", " << vY[i] << ") " << "<-> Polar (" << mag[i] << ", " << angle[i] << ")" << endl;
}
return 0;
}
Цилиндрические координаты являются 3D-версиейПолярные координаты.Ниже приведен небольшой пример, показывающий, как можно реализовать цилиндрические координаты.Я не уверен, где вы будете получать свою трехмерную z-координату, поэтому я просто сделал ее произвольной (например, x + y
):
Mat_<Vec3f> magAngleZ;
for(int y = 0; y < 3; y++)
{
for(int x = 0; x < 3; x++)
{
Vec3f pixel;
pixel[0] = cv::sqrt((double)x*x + (double)y*y); // magnitude
pixel[1] = cv::fastAtan2(y, x); // angle
pixel[2] = x + y; // z
magAngleZ.push_back(pixel);
}
}
for(int i = 0; i < magAngleZ.rows; i++)
{
Vec3f pixel = magAngleZ.at<Vec3f>(i, 0);
cout << "Cylindrical (" << pixel[0] << ", " << pixel[1] << ", " << pixel[2] << ")" << endl;
}
Если вы заинтересованы в сшивании изображений,взгляните на stitching.cpp и stitching_detailed.cpp примеры, предоставленные OpenCV.
РЕДАКТИРОВАТЬ:
Вы можете найти эти ресурсы цилиндрическая проекция полезно:
Computer Vision: Mosaics
Почему Mosaic?
Автоматическое сшивание панорамных изображений с использованиемИнвариантные функции
Создание полноразмерных панорамных изображений, мозаик и карт окружающей среды