我想将Jpeg图像(坐标(x,y))转换为圆柱坐标..
opencv中是否有可以直接执行此操作的功能?或者我可以用opencv中的哪些函数来创建自己的函数?
我在2d坐标,3d坐标和圆柱坐标之间感到困惑..有人可以简单地讨论这个吗?
是否有可用于将2d转换为3d的数学算法? 2d到圆柱坐标? 3d到圆柱坐标?
我阅读了有关此主题的上一篇文章,但不理解..
我没有参加图像处理课程,但我急于阅读书籍.. 我通过经验和学习其他程序员代码来学习..所以源代码将非常感激..
感谢大家,对不起我的小学发帖,
答案 0 :(得分:7)
在2D领域,你有Polar坐标。 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;
}
Cylindrical coordinates是Polar坐标的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;
}
如果您对图像拼接感兴趣,请查看OpenCV提供的stitching.cpp和stitching_detailed.cpp样本。
编辑:
您可以在cylindrical projection上找到这些资源:
Computer Vision: Mosaics
Why Mosaic?
Automatic Panoramic Image Stitching using Invariant Features
Creating full view panoramic image mosaics and environment maps