我有一个问题,无法获得轮廓的离散序列。 我的想法:我想在图像中封闭轮廓的中间放置一个锚点,并使用极坐标来获取每个极坐标度的长度。
我已经创建了一个固定长度为 360 的向量,并遍历长度为 l=contour.length/360 的所有轮廓点(约 4000(。在这里,我沿长度为 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;
}
您似乎错过了一些C++基础知识。 例如
1(如果使用at()
则添加不必要的范围检查。当你循环到cnts[0].size()
你现在正在这样做两次。
2(您不需要在void
函数中使用return
。
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() << ";";
}
}