1、检测直线的霍夫变换原理
霍夫变换原理是将原空间中数据变换到一个新的空间(参数空间),通过进行这种变换去寻找原空间的直线,例如,我们与原空间中有一个点A(x0,y0),通过这这个点A有无数条直线,但是,都可以通过y=kx+b的形式将其表示出来,随着k,b的变化,直线会进行变化,但是这里面y和x是一个定值,因为其通过的点A,我们可以使用一个变换的形式将k,b作为我们的自变量,这样可以得到一个参数空间,这个参数空间实际上就是以我们原空间中用于表示直线的参数作为自变量的空间,这样的一个变换就会将原空间中这些所有通过点A的直线映射成为一条直线,如果原空间中有多个这样的点,映射在参数空间中就会有多条直线,多条直线可能相交于一点,也可能不相交于一点,如果两条直线相交于一点表示这两条直线中有一个点的两个参数是相同的,那么映射在原空间中也就意味着这个点对应的那条直线是经过原空间中的两个点。有了这些基础,我们就可以进行霍夫变换,但是,在这里我们需要知道一点,如果有三个点是在同一个y轴上,那么则没有办法进行y=kx+b的形式来表示的,因为这里斜率k不存在,因此将这种形式映射到参数空间中得到的结果是一些平行的线,这些线是没有办法相交于一点的,也就是原空间的这条直线没有办法通过参数空间中一个点表示,因为其是不存在k的。
由此引入一种新的表示直线的形式,我们可以通过直线距离坐标原点以及坐标原点到这条直线的垂线与x轴的夹角来表示一条直线,这样就可以把原空间的直线中的一个点映射到参数空间中就是一些曲线,那么这些曲线是可以相交于一点的。通过这样的变换方式就实现了避免了原空间中那条没有k的直线的寻找,通过这样的方式我们就能够找到在原空间中被一条直线所经过的所有的点,也就是通过我们的方式找到了原空间中的直线,这种方式我们可以在参数空间中通过寻找某个点被通过的次数来去寻找原空间中这条直线一共经过了多少个点,例如,要求在原空间中只有通过了50个点的直线才检测出来,那么在参数空间中就找到一个像素点,这个点被经过了50次,这样我们就可以通过这样的参数去寻找不同的条件的直线,进而去寻找更加精确的直线。
OpenCV中提供的API:
检测直线流程:
Step1:将参数空间中的坐标离散化。
Step2:将图像中每个非0像素通过映射关系求取在参数空间通过的方格。
Step3:统计参数空间内每个方格出现的次数,选取次数大于某一阈值的方格作为表示直线的方格。
Step4:将参数空间中表示直线的方格的参数作为图像中直线的参数。
HoughLines(){}
2、相关函数