Преобразование изображения из 2D координат в цилиндрические координаты - PullRequest
3 голосов
/ 17 декабря 2011

Я хотел бы преобразовать изображение Jpeg (его координаты (x, y)) в цилиндрические координаты ..

Есть ли в opencv функция, которая может сделать это напрямую?или какие функции в opencv я могу использовать для создания своих собственных ??

У меня путаница между 2D-координатами, 3D-координатами и цилиндрическими координатами. Может кто-нибудь кратко обсудить это?

Есть ли математические алгоритмы для преобразования 2D в 3D?2d к цилиндрическим координатам?3d к цилиндрическим координатам?

Я прочитал предыдущий пост по этой теме, но не понимаю его.

Я не изучал курс обработки изображений, но спешу читать книги .. Я учусьопыт и изучение кода других программистов .. поэтому исходный код будет высоко оценен ..

спасибо всем и извините за мой элементарный пост ,,

1 Ответ

7 голосов
/ 17 декабря 2011

В 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?
Автоматическое сшивание панорамных изображений с использованиемИнвариантные функции
Создание полноразмерных панорамных изображений, мозаик и карт окружающей среды

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