Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将笛卡尔坐标转换为极坐标_C++_Opencv_Image Processing_Polar Coordinates_Cartesian - Fatal编程技术网

C++ 将笛卡尔坐标转换为极坐标

C++ 将笛卡尔坐标转换为极坐标,c++,opencv,image-processing,polar-coordinates,cartesian,C++,Opencv,Image Processing,Polar Coordinates,Cartesian,我试图将图像从极坐标转换为笛卡尔坐标,但应用这些公式后,我得到了浮点坐标(r和teta),我不知道如何使用x和y的浮点来表示空间中的点。也许有一种方法可以将它们转换成整数,并且仍然保持分布,但我不知道如何。我知道OpenCV中有一些函数,比如说,可以用来工作,但我想自己实现它。任何想法都会有帮助:) 这是我的代码: struct Value { double r; double teta; int value; // pixel intensity }; void ir

我试图将图像从极坐标转换为笛卡尔坐标,但应用这些公式后,我得到了浮点坐标(r和teta),我不知道如何使用x和y的浮点来表示空间中的点。也许有一种方法可以将它们转换成整数,并且仍然保持分布,但我不知道如何。我知道OpenCV中有一些函数,比如说,可以用来工作,但我想自己实现它。任何想法都会有帮助:)

这是我的代码:

struct Value
{
    double r;
    double teta;
    int value;  // pixel intensity
};
void irisNormalization(Mat img, Circle pupilCircle, Circle irisCircle, int &matrixWidth, int &matrixHeight)
{
    int w = img.size().width;
    int h = img.size().height;
    int X, Y;
    double r, teta;
    int rayOfIris = irisCircle.getRay();
    std::vector<Value> polar;
    // consider the rectangle the iris circle is confined in
    int xstart = irisCircle.getA() - rayOfIris;
    int ystart = irisCircle.getB() - rayOfIris;
    int xfinish = irisCircle.getA() + rayOfIris;
    int yfinish = irisCircle.getB() + rayOfIris;
    for (int x = xstart; x < xfinish; x++)
        for (int y = ystart; y < yfinish; y++)
        {
            X = x - xstart - rayOfIris;
            Y = y - ystart - rayOfIris;
            r = sqrt(X * X + Y * Y);
            if (X != 0)
            {
                teta = (atan(abs(Y / X)) * double(180 / M_PI));
                if (X > 0 && Y > 0) // quadrant 1
                    teta = teta;
                if (X > 0 && Y < 0)
                    teta = 360 - teta; // quadrant 4
                if (X < 0 && Y > 0) // quadrant 2
                    teta = 180 - teta;
                if (X < 0 && Y < 0) // quadrant 3
                    teta = 180 + teta;
                if (r < rayOfIris)
                {
                    polar.push_back({ r, teta, int(((Scalar)(img.at<uchar>(Point(x, y)))).val[0]) });
                }
            }
        }
    std::sort(polar.begin(), polar.end(), [](const Value &left, const Value &right) {
        return left.r < right.r && left.teta < right.teta;
    });
    for (std::vector<Value>::const_iterator i = polar.begin(); i != polar.end(); ++i)
        std::cout << i->r << ' ' << i->teta << endl;
struct值
{
双r;
双teta;
int值;//像素强度
};
无效虹膜不规则化(Mat img、圆瞳孔圆、圆虹膜圆、整数和矩阵宽度、整数和矩阵高度)
{
int w=img.size().宽度;
int h=img.size().高度;
int X,Y;
双r,teta;
int rayOfIris=irisCircle.getRay();
向量极性;
//考虑矩形虹膜圈被限制在
int xstart=irisCircle.getA()-rayOfIris;
int-ystart=irisCircle.getB()-rayOfIris;
int xfinish=irisCircle.getA()+rayOfIris;
int-yfinish=irisCircle.getB()+rayOfIris;
for(int x=xstart;x0&&Y>0)//象限1
teta=teta;
如果(X>0&&Y<0)
teta=360-teta;//象限4
如果(X<0&&Y>0)//象限2
teta=180-teta;
如果(X<0&&Y<0)//象限3
teta=180+teta;
if(rstd::cout r您的实现尝试用极坐标表示给定圆内的每个整数坐标点。但是,通过这种方式,您将以坐标数组和一个值终止

如果您想对图像进行几何变换,则应:

  • 创建具有适当宽度(
    rho
    分辨率)和高度(
    theta
    分辨率)的目标图像
  • 循环遍历目标图像的每个像素,并使用逆变换将其映射回原始图像
  • 通过最终插值近值,将后向变换点的值转换为原始图像
对于插值,可以使用不同的方法。非详尽列表包括:

  • )
  • )

您可以查看
warpPolar
的实现,了解它是如何实现的。几何变形的最佳实现方式是获取输出像素的坐标,进行反向映射以找到(浮点)在输入中定位,然后在输入图像中插值。非常感谢,但我仍然不知道如何在输出中用浮点坐标插值点image@MariaNoaptes我补充了一些建议。