Opencv中直线的表示方法

时间:2021-01-30 16:25:04
                           【blog算法原理】Opencv中直线的表示方法
 一、问题的提出:​       
  在实际项目编写过程中,需要对直线(Line)进行特定的处理。在以前的项目设计实现中,直线(Line)多是用来绘图使用的,而不是用来进行分析的。
  经过较为仔细地研究Opencv提供的相关内容,感觉这个问题很有搞头,所以分离出来研究。先看refman
Opencv中直线的表示方法
 
Opencv中直线的表示方法
Opencv中直线的表示方法
 
 
 
 
可以看到,opencv自己提供的3种直线寻找的函数,最后得到的表示line的数据结构和表示内容的表示都是不一样的。出现这个原因,可能是因为编写这几个函数的不是一个开发者;也可能是认为地选择了最适合特定函数使用的数据结构。那么这3个函数效果到底怎么样?如何灵活使用到自己的项目中?最后我将提出结合自己实际编写的函数。
 
二、函数测试
由于后2个函数都能够直接以图像(MAT)作为参数,所以用一副标准图像进行测试;而后针对Linefit能够以点集作为输入的情况单独测试(如果要使用同样的图像需要先细化再找边缘,比较麻烦),并且提出自己编写的方法。
测试图像为
Opencv中直线的表示方法
编写代码
#);
    board , CV_PI, , ,  );
    , CV_PI, , ,  );
    ; i ], l[]), Point(l[], l[]), Scalar(), , CV_AA);
    }
    ; i ], theta ];
        Point pt1, pt2;
        ),, CV_AA);
    }
    imshow("src",src);
    waitKey();
}
 
结果
Opencv中直线的表示方法
(HoughLineP)
Opencv中直线的表示方法
 
(HoughLine)
从结果上来看,HoughlineP识别的要更准确。这两个函数一个是识别出来图形上的点,一个是识别出来角度和图像上的点。两个函数的结果都是自己编写代码打印出来的。
 
三、结合实际
实际上我需要的是识别出直线,并且对图像进行旋转。这部分的代码是这样的
       Point pt1;
    Point pt2;
    ] ]]]]]]]),, CV_AA);
    , src.rows );]]);
    angle   );
    /// 旋转已扭曲图像
    warpAffine( src, dst, rot_mat, src.size() );