机器视觉入门之路(三九,霍夫(hough)图像,c++)
前面博文已经有了霍夫找直线的算法这里再补充一下:
第一,程序调试成功后,真实的hough图像对比原图像:
第二,其实(p,)是可以转换(k,b)的,转换关系如下:斜率k=sin
/cos
,b=p/sin(
),这样你就又有了一幅kb图像,其结果与hough图像差不多,原图像两条直线,那么结果就是两个闪亮的星星,为什么不是闪亮的点呢?看到下面结果就明白了:
因为直线不是两条,而是两直线簇。画直线的算法如下:
void DrawLine(BYTE** imageBuf, int w, int h, int a/*=*/,int p)
{
//在此找出直線起點,終點
double k,b;
int x,y;
if(a!=90) //如果斜率存在,这里使用的是角度,非弧度
{
//计算直线方程的参数
b=p/cos(a*3.1415926535/180);//公式明明是错的,为什么还要用?前面hough找直线博文有答案
k=-sin(a*3.1415926535/180)/cos(a*3.1415926535/180);//为什么结果画线正确?用b=p/sin()反而挂了!
y=0;
x=0;
//斜率小于1的情况
if(abs(k)<=1)
{
for(x=0;x<w-2;x++)
{
y=(int)(k*x+b);
if(y>=0 && y<h-2)
{
imageBuf[y][x*4]=0;
imageBuf[y][x*4+1]=0;
imageBuf[y][x*4+2]=250;//红色
imageBuf[y][x*4+3]=255;
}
}
}
//斜率大于1的情况
else
{
for(y=0;y<h-2;y++)
{
x=(int)(y/k-b/k);
if(x>=0 && x<w-2)
{
imageBuf[y][x*4]=0;
imageBuf[y][x*4+1]=0;
imageBuf[y][x*4+2]=250;//红色
imageBuf[y][x*4+3]=255;
}
}
}
}
//斜率不存在的情况
else
{
for(y=0;y<h-2;y++)
{
if(p>=0&&p<w-2)
{
imageBuf[y][p*4]=0;
imageBuf[y][p*4+1]=0;
imageBuf[y][p*4+2]=250;//红色
imageBuf[y][p*4+3]=255;
}
}
}
}
至于kb图像,可以尝试画一下。
为什么最后一幅图不是原图像?原因是当初为了加快计算p,,图像进行了canny处理,这样其实反而变慢了,但你收获了canny算法的喜悦,实际可以用梯度图像或者sobel图像,就可以使得边缘不相干像素就过滤掉了,速度就起来了。
实质hough找线计算量很大,自然很慢,我们机器视觉中,会用它吗?显然不会,但学习,要过此关。
有机会用时间测一下hough算子,canny算子,就一目了然了,否则,机器视觉怎么会走感兴趣区域这条路?发明那么多感兴趣工具?