2015-05-06 9 views
0

Я пытаюсь модифицировать следующий код OpenCV для Java.Android OpenCV получить точку пересечения

std::vector<cv::Vec4i> lines; 
    cv::HoughLinesP(bw,lines,1,CV_PI/180,70,30,10); 

    for (unsigned int i = 0;i<lines.size();i++) 
    { 
     cv::Vec4i v = lines[i]; 
     lines[i][0] = 0; 
     lines[i][1] = ((float)v[1] - v[3])/(v[0] - v[2])* -v[0] + v[1]; 
     lines[i][2] = src.cols; 
     lines[i][3] = ((float)v[1] - v[3])/(v[0] - v[2])*(src.cols - v[2]) + v[3];  
    } 

    std::vector<cv::Point2f> corners; 
    for (unsigned int i = 0;i<lines.size();i++) 
    { 
     for (unsigned int j=i+1;j<lines.size();j++) 
     { 
      cv::Point2f pt = computeIntersect(lines[i],lines[j]); 
      if (pt.x >= 0 && pt.y >=0) 
      { 
       corners.push_back(pt); 
      } 
     } 
    } 
+1

В чем проблема? – Robert

ответ

0

Так у вас есть два сегмента линии (lines[i] и lines[j]) с учетом их конечных точек, и вы заинтересованы в оценке их пересечения (функция computeIntersect()):

computeIntersect(lines[i], lines[j]);

Точка, в которой пересечения сегментов задаются путем решения двух простых уравнений. Вы должны прочитать description here для более подробной информации. А также здесь у вас есть хороший SO answer о проблеме.

/** 
* Computes the intersection between two lines. The calculated point is approximate, 
* since integers are used. If you need a more precise result, use doubles 
* everywhere. 
* (c) 2007 Alexander Hristov. Use Freely (LGPL license). http://www.ahristov.com 
* 
* @param x1 Point 1 of Line 1 
* @param y1 Point 1 of Line 1 
* @param x2 Point 2 of Line 1 
* @param y2 Point 2 of Line 1 
* @param x3 Point 1 of Line 2 
* @param y3 Point 1 of Line 2 
* @param x4 Point 2 of Line 2 
* @param y4 Point 2 of Line 2 
* @return Point where the segments intersect, or null if they don't 
*/ 
public Point intersection(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4) { 
    int d = (x1-x2)*(y3-y4) - (y1-y2)*(x3-x4); 
    if (d == 0) return null; 

    int xi = ((x3-x4)*(x1*y2-y1*x2)-(x1-x2)*(x3*y4-y3*x4))/d; 
    int yi = ((y3-y4)*(x1*y2-y1*x2)-(y1-y2)*(x3*y4-y3*x4))/d; 

    return new Point(xi,yi); 
} 
+0

Большое спасибо. У меня есть еще один вопрос: как объявить вектор и вектор в Java? Благодарю. –

+0

По существу 'cv :: Vec4i' представляет собой четырехэлементный массив целых чисел, а' cv :: Point2f' - это 2-элементная точка, которая представлена ​​координатами x, y с одинарной точностью. – Kornel

Смежные вопросы