2017-01-05 7 views
0

У меня есть пара декартовых координат, которые представляют собой линию в изображении. Я хотел бы преобразовать эту строку в полярную форму и нарисовать ее поверх изображения.Преобразование 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; 
} 
+0

я исправил свой ответ и сделал пример – MBo

ответ

2

Rho-тета уравнения имеет вид

x * Cos(Theta) + y * Sin(Theta) - Rho = 0 

Мы хотим представить уравнение 'по двум точкам' в виде Rho-тета (page 92 in pdf here). Если мы имеем

x * A + y * B - C = 0 

и нуждаются коэффициенты в тригонометрической форме, можно разделить все уравнение на величину (A, B) вектора коэффициентов.

D = Length(A,B) = Math.Hypot(A,B) 
x * A/D + y * B/D - C/D = 0 

отмечают, что (A/D)^2 + (B/D)^2 = 1 - основное тригонометрическое равенство, поэтому мы можем рассмотреть A/D и B/D, как косинус и синус угла тета некоторого.

Ваша линия уравнение

(y-y1) * (x2-x1) - (x-x1) * (y2-y1) = 0 
or 
x * (y1-y2) + y * (x2-x1) - (y1 * x2 - y2 * x1) = 0 
let 
D = Sqrt((y1-y2)^2 + (x2-x1)^2) 
so 
Theta = ArcTan2(x2-x1, y1-y2) 
Rho = (y1 * x2 - y2 * x1)/D 

отредактировал

Если Rho отрицательна, изменение знака Rho и сдвиг Theta от Pi

Пример:

x1=1,y1=0, x2=0,y2=1 
Theta = atan2(-1,-1)=-3*Pi/4 
D=Sqrt(2) 
Rho=-Sqrt(2)/2 negative => 

Rho = Sqrt(2)/2 
Theta = Pi/4 

Назад substitutuon - найти точки пересечения с осями

0 * Sqrt(2)/2 + y0 * Sqrt(2)/2 - Sqrt(2)/2 = 0 
x=0 y=1 

x0 * Sqrt(2)/2 + 0 * Sqrt(2)/2 - Sqrt(2)/2 = 0 
x=1 y=0 
+0

Можете ли вы помочь в отношениях с объяснением, я понимаю, что вы написали, но я хотел бы узнать больше и ясно некоторые понятия. Я был бы признателен, если бы вы могли обратиться к какой-либо бумаге/книге или веб-сайту. Я хочу знать, почему rho делится на D. –

+1

Добавлены некоторые пояснения. Впервые я прочитал информацию о rho-тета-уравнении в «Математическом справочнике для ученых и инженеров» Г.Корна, Т.Корна. Связанный текст очень похож на эту книгу. – MBo