机器视觉入门之路(三九,霍夫(hough)图像,c++)

前面博文已经有了霍夫找直线的算法这里再补充一下:

第一,程序调试成功后,真实的hough图像对比原图像:

机器视觉入门之路(三九,霍夫(hough)图像,c++)机器视觉入门之路(三九,霍夫(hough)图像,c++)

第二,其实(p,机器视觉入门之路(三九,霍夫(hough)图像,c++))是可以转换(k,b)的,转换关系如下:斜率k=sin机器视觉入门之路(三九,霍夫(hough)图像,c++)/cos机器视觉入门之路(三九,霍夫(hough)图像,c++),b=p/sin(机器视觉入门之路(三九,霍夫(hough)图像,c++)),这样你就又有了一幅kb图像,其结果与hough图像差不多,原图像两条直线,那么结果就是两个闪亮的星星,为什么不是闪亮的点呢?看到下面结果就明白了:

机器视觉入门之路(三九,霍夫(hough)图像,c++)

因为直线不是两条,而是两直线簇。画直线的算法如下:

void DrawLine(BYTE** imageBuf, int w, int h, int a/*=机器视觉入门之路(三九,霍夫(hough)图像,c++)*/,int p)
{
    //在此找出直線起點,終點
    double k,b;
    int x,y;
    if(a!=90)    //如果斜率存在,这里机器视觉入门之路(三九,霍夫(hough)图像,c++)使用的是角度,非弧度
    {
        //计算直线方程的参数
        b=p/cos(a*3.1415926535/180);//公式明明是错的,为什么还要用?前面hough找直线博文有答案
        k=-sin(a*3.1415926535/180)/cos(a*3.1415926535/180);//为什么结果画线正确?用b=p/sin(机器视觉入门之路(三九,霍夫(hough)图像,c++))反而挂了!
        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,机器视觉入门之路(三九,霍夫(hough)图像,c++),图像进行了canny处理,这样其实反而变慢了,但你收获了canny算法的喜悦,实际可以用梯度图像或者sobel图像,就可以使得边缘不相干像素就过滤掉了,速度就起来了。

实质hough找线计算量很大,自然很慢,我们机器视觉中,会用它吗?显然不会,但学习,要过此关。

有机会用时间测一下hough算子,canny算子,就一目了然了,否则,机器视觉怎么会走感兴趣区域这条路?发明那么多感兴趣工具?