如何获得插值的极坐标?

时间:2019-11-26 14:57:06

标签: c++ opencv graphics interpolation

获取轮廓的离散序列时遇到问题。 我的想法:我想在图像的闭合轮廓的中间放置一个锚点,并使用极坐标来获得每个极坐标度的长度。

我已经创建了一个固定长度360的向量,并遍历所有轮廓点(约4000个),长度为l = contour.length / 360。在这里,我沿着长度为l的轮廓得到360个值。但是我想为从1到360的每个整数度有一个离散值。

我可以插值数组以将值固定为1到360吗?

vector<cv::Point> cn;
double theta = 0;
double dis = 0;
int polsize = 360;
int psize = 0;
for (int k = 0; k < cnts[0].size(); k++) {
    cn.push_back(cnts[0].at(k));
}

double pstep = cn.size() / polsize;
for (int m = 1; m < polsize; m++) {
    psize = (int)(m * pstep);
    polar(cn[psize].x, cn[psize].y, &dis, &theta);
    outputFile << theta << "/" << dis << ";";
}

void polar(int x, int y, double* r, double* theta)
{
   double toDegrees = 180 / 3.141593;
   *r = sqrt((pow(x, 2)) + (pow(y, 2)));
   double xt = x, yt = y;
   yt = 1024 - yt;
   if (xt == 0) xt = 0.1;
   if (yt == 0) yt = 0.1;
   *theta = atan(yt / xt) * toDegrees;
   if (*theta < 0) *theta = *theta+180;
   return;
}

1 个答案:

答案 0 :(得分:1)

您似乎错过了一些C ++基础知识。例如

1)如果使用at(),则添加不必要的范围检查。循环播放到cnts[0].size()时,您现在要执行两次。

2)您不需要在return函数中使用void

3)不要使用指针返回。这是C ++,而不是C。使用引用或std::tuple返回类型。

然后,您实际上是在复制std::complex类型。

代码可以非常简单。

#include <vector>
//#include <algorithm> // if using std::copy
#include <cmath>
#include <sstream> // only for the temporary output.

static constexpr auto toDeg = 180 / 3.141593;

struct Point{
    double x,y;

    double abs() const { 
        return std::sqrt(std::pow(x,2) + std::pow(y,2));
    }

    double arg() const {
        return std::atan2(y, x) * toDeg;
    }
};

int main(){
    std::vector<std::vector<Point>> cnts = {{{1,1}}};

    // copy constructor
    std::vector<Point> cn(cnts[0]);
    // range-based constructor
    //std::vector<Point> cn(std::cbegin(cnts[0]), std::cend(cnts[0]));
    // or copy-insert
    //std::vector<Point> cn
    //cn.reserve(cnts[0].size());
    //std::copy(std::cbegin(cnts[0]), std::cend(cnts[0]), std::back_inserter(cn));

    std::stringstream outputFile; // temp

    for (auto const& el : cn) {
        outputFile << el.arg() << "/" << el.abs() << ";";
    }
}