2017-02-15 18 views
0

я реализовал Houghlinesp в OpenCV с помощью VS 15. Код в following-Как узнать, какие координаты принадлежат к строкам после HoughLinesp?

#include "stdafx.h" 


#include "opencv2/highgui/highgui.hpp" 
#include "opencv2/imgproc/imgproc.hpp" 
#include <math.h> 
#include <iostream> 

using namespace cv; 
using namespace std; 

static void help() 
{ 
    cout << "\nThis program demonstrates line finding with the Hough transform.\n" 
     "Usage:\n" 
     "./houghlines <image_name>, Default is pic1.png\n" << endl; 
} 

int main(int argc, char** argv) 
{ 
    const char* filename = argc >= 2 ? argv[1] : "Turbine.jpg"; 

    Mat src = imread(filename, 0); 
    if (src.empty()) 
    { 
     help(); 
     cout << "can not open " << filename << endl; 
     return -1; 
    } 

    Mat dst, cdst; 
    Canny(src, dst, 50, 200, 3); 
    cvtColor(dst, cdst, CV_GRAY2BGR); 
    vector<Vec4i> lines; 
    HoughLinesP(dst, lines, 1, CV_PI/180, 50, 110, 10); 

    for (size_t i = 0; i < lines.size(); i++) 
    { 
     Vec4i l = lines[i]; 
     line(cdst, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(0, 0, 255), 3, CV_AA); 

     Point p1, p2; 
     p1 = Point(l[0], l[1]); 
     p2 = Point(l[2], l[3]); 
     //calculate angle in radian, if you need it in degrees just do angle * 180/PI 
     double angle = atan2(p1.y - p2.y, p1.x - p2.x); 
     double angles = angle * 180/3.14159265358979323846; 
     cout << "line coordinates are " << l << endl; 
     cout << "Angles are " << angles << endl; 
    } 

    imshow("source", src); 
    imshow("detected lines", cdst); 


    waitKey(); 

    return 0; 
} 

я получаю следующее output- Image after Houghlinesp Coordinates and angles obtained

Как я могу знать, какие координаты, какие строки? Можно ли это сделать? Или, может быть, я могу сгруппировать более близкие линии, чтобы дать мне всего три лезвия, их фрагменты кода, которые я могу использовать для этого?

Кроме того, я не понимаю углы, которые были рассчитаны. [Я хочу углы относительно горизонтальной линии]. Может ли кто-нибудь помочь мне понять это?

Есть ли способ, что я могу ограничить найденные строки в только линии лопастных (без ограничения вертикальных линий найдено, потому что в другом случае лезвие может также находиться в вертикальном положении)

Любая помощь оценили.

+0

Для ограничения линий на лопатки только, вам придется удалить полюс в предварительной обработке. Это помогает, если это другой цвет. –

+0

Для маркировки линий вы можете добавить метки к своим точкам в l-векторе http://stackoverflow.com/questions/21256914/add-text-labels-in-opencv-image –

+0

Углы вычисляются в соответствии с матрицей, 0,0 начинается в верхнем левом углу. -160 углов - углы линий дальнего правого клинка. –

ответ

1

Линии, рассчитанные с HugeLinesP(), дают две точки, которые определяют линию. Оттуда вы можете вычислить функцию f(x) = k*x + n, которая является определением линии. (просто замените f (x) на y и x с x и вы получите систему из двух уравнений с двумя переменными).

Координатная система cv :: Mat начинается с 0,0 в верхнем левом углу. В то время как в общей системе координат, где мы используем x, растущую слева направо, и y, растущую снизу вверх, здесь мы имеем x, все еще растущий слева направо, но y идет в обратном направлении и растет сверху вниз. Это повлияет на ваш расчет угла.

Для вашего последнего вопроса я не могу вам помочь. Сначала вам нужно как-то удалить шест с вашего изображения, прежде чем делать преобразование Huges. Если единственное, что вас интересует, это углы, вы можете просто собрать все углы, которые находятся в небольшом интервале, и вычислить средний угол. Если вы пытаетесь следовать за лезвиями в серии изображений, вы можете предположить, что угол одного лезвия не будет сильно изменяться между двумя изображениями (это означает, что вам необходимо взять как минимум два изображения, прежде чем лезвие начнет делать 60 градусов в самом быстром вращение).

Надеется, что это помогает