从2D坐标到圆柱坐标的图像转换

njm*_*njm 3 opencv image-processing projection-matrix

我想将Jpeg图像(其坐标(x,y))转换为圆柱坐标.

opencv中是否有可以直接执行此操作的功能?或者我可以用opencv中的哪些函数来创建自己的函数?

我在2d坐标,3d坐标和圆柱坐标之间感到困惑..有人可以简单地讨论这个吗?

有没有可用于将2d转换为3d的数学算法?2d到圆柱坐标?3d到圆柱坐标?

我阅读了关于这个主题的上一篇文章但是不理解它.

我没有参加图像处理课程,但我急于阅读书籍.我通过经验和学习其他程序员代码来学习..所以源代码将非常感激..

感谢大家,对不起我的小学发帖,

mev*_*ron 7

在2D领域,您有Polar坐标.OpenCV有两个很好的函数,用于在笛卡尔坐标和极坐标cartToPolarpolarToCart之间进行转换.似乎没有使用这些函数的好例子,所以我使用该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;
}
Run Code Online (Sandbox Code Playgroud)

圆柱坐标是极坐标的3D版本.下面是一个小样本,展示如何实现圆柱坐标.我不确定你将在哪里得到你的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;
}
Run Code Online (Sandbox Code Playgroud)

如果您对图像拼接感兴趣,请查看OpenCV提供的stitching.cppstitching_detailed.cpp示例.

编辑:
您可以在圆柱投影上找到这些资源有用:

电脑视觉:马赛克
为何选择马赛克?
使用不变特征的自动全景图像拼接创建全视图全景图像拼接
和环境贴图