2017-02-15 98 views
0

我实现Houghlinesp OpenCV中使用VS 15的代码是为以下各项如何找出哪些坐标属于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; 
} 

我碰到下面的输出 - 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这是一条线的定义。 (用y代替f(x),用x代替x,得到两个有两个变量的方程组)。

cv :: Mat的坐标系以0,0开头于左上角。在通用坐标系统中,我们使用x从左到右增长,y从下到上增长,这里我们从左到右依次增长x,但是y反过来并且从上到下增长。这会影响你的角度计算。

对于你最后一个问题,我帮不了你。首先,在进行Huges变换之前,你必须以某种方式去除图像中的极点。如果您唯一感兴趣的是角度,那么您可以收集所有处于某个较小间隔的角度并计算平均角度。如果您试图在一系列图像中跟踪刀片,则可以推测一张刀片的角度在两张图片之间不会发生很大变化(这意味着相机在刀片以最快速度旋转60度之前必须至少拍摄两张图像回转)。

希望这会有所帮助