У меня есть пара декартовых координат, которые представляют собой линию в изображении. Я хотел бы преобразовать эту строку в полярную форму и нарисовать ее поверх изображения.Преобразование cv :: Vec4f line to cv :: Vec2f
например
cv::Vec4f line {10,20,60,70};
float x1 = line[0];
float y1 = line[1];
float x2 = line[2];
float y2 = line[3];
Я хочу, чтобы эта линия будет представлена в резюме :: Vec2f форма (Rho, тета).
Забота о ро & theta со всеми возможными склонами.
Приведенные размеры изображения :: w и h;
ш = image.cols ч = image.rows
Как я могу добиться этого.
N.B: Мы также можем предположить, что линия может быть расширенной, проходящей через изображение.
for (size_t i = 0; i < lines.size(); i++)
{
int x1 = lines[i][0];
int y1 = lines[i][1];
int x2 = lines[i][2];
int y2 = lines[i][3];
float d = sqrt(((y1-y2)*(y1-y2)) + ((x2-x1)*(x2-x1)));
float rho = (y1*x2 - y2*x1)/d;
float theta = atan2(x2 - x1,y1-y2) ;
if(rho < 0){
theta *= -1;
rho *= -1;
}
linv2f.push_back(cv::Vec2f(rho,theta));
}
выше подход оленья кожа дать мне результаты, когда я сюжет линии я не получаю строки, которые накладываются друг на друга свою первоначальную форму vec4f.
Я использую это для преобразования vec2f в vec4f для тестирования:
cv::Vec4f cvtVec2fLine(const cv::Vec2f& data, const cv::Mat& img)
{
float const rho = data[0];
float const theta = data[1];
cv::Point pt1,pt2;
if((theta < CV_PI/4. || theta > 3. * CV_PI/4.)){
pt1 = cv::Point(rho/std::cos(theta), 0);
pt2 = cv::Point((rho - img.rows * std::sin(theta))/std::cos(theta), img.rows);
}else {
pt1 = cv::Point(0, rho/std::sin(theta));
pt2 = cv::Point(img.cols, (rho - img.cols * std::cos(theta))/std::sin(theta));
}
cv::Vec4f l;
l[0] = pt1.x;
l[1] = pt1.y;
l[2] = pt2.x;
l[3] = pt2.y;
return l;
}
я исправил свой ответ и сделал пример – MBo