[OpenCV]Hough变换

/*  这是一个命令行程序,以图像作为文件输入变量
   编译时选择“#if 1”或“#if 0”,可以使用标准和概率HOUGH变换两种方法 */
#include "cv.h"
#include "highgui.h"
#include <math.h>

int main(int argc, char** argv)
{
    IplImage* src;
    //if( argc == 2 && (src=cvLoadImage(argv[1], 0))!= 0)
	if(src=cvLoadImage(argc > 1? argv[1] : "c:\\TestImages\\pic1.png", 0))
    {
        IplImage* dst = cvCreateImage( cvGetSize(src), 8, 1 );
        IplImage* color_dst = cvCreateImage( cvGetSize(src), 8, 3 );
        CvMemStorage* storage = cvCreateMemStorage(0);
        CvSeq* lines = 0;
        int i;
        cvCanny( src, dst, 50, 200, 3 );
        cvCvtColor( dst, color_dst, CV_GRAY2BGR );
#if 1
        lines = cvHoughLines2( dst, storage, CV_HOUGH_STANDARD, 1, CV_PI/180, 150, 0, 0 );

        for( i = 0; i < lines->total; i++ )
        {
            float* line = (float*)cvGetSeqElem(lines, i);
            float rho = line[0];
            float theta = line[1];
            CvPoint pt1, pt2;
            double a = cos(theta), b = sin(theta);
            if( fabs(b) < 0.001 )
            {
                pt1.x = pt2.x = cvRound(rho);
                pt1.y = 0;
                pt2.y = color_dst->height;
            }
            else if( fabs(a) < 0.001 )
            {
                pt1.y = pt2.y = cvRound(rho);
                pt1.x = 0;
                pt2.x = color_dst->width;
            }
            else
            {
                pt1.x = 0;
                pt1.y = cvRound(rho/b);
                pt2.x = cvRound(rho/a);
                pt2.y = 0;
            }
            cvLine( color_dst, pt1, pt2, CV_RGB(255,0,0), 1, 8 );
        }
#else
        lines = cvHoughLines2( dst, storage, CV_HOUGH_PROBABILISTIC, 1, CV_PI/180, 80, 30, 10 );
        for( i = 0; i < lines->total; i++ )
        {
            CvPoint* line = (CvPoint*)cvGetSeqElem(lines,i);
            cvLine( color_dst, line[0], line[1], CV_RGB(255,0,0), 3, 8 );
        }
#endif
        cvNamedWindow( "Source", 1 );
        cvShowImage( "Source", src );

        cvNamedWindow( "Hough", 1 );
        cvShowImage( "Hough", color_dst );

        cvWaitKey(0);
    }
}

转载于:https://my.oschina.net/heartfly/blog/3856

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是关于OpenCV中霍夫变换的介绍: 1. 霍夫变换概述 霍夫变换是一种图像处理技术,用于检测几何形状,例如直线、圆和椭圆等。它的基本思想是将图像空间中的点映射到参数空间中,从而在参数空间中检测几何形状。 2. OpenCV中的霍夫线变换 OpenCV中的霍夫线变换有三种:标准霍夫变换(Standard Hough Transform, SHT),由HoughLines函数调用;多尺度霍夫变换(MSHT),由HoughLines函数调用;累计概率霍夫变换(PPHT),由HoughLinesP函数调用。 3. 霍夫线变换的原理 霍夫线变换的基本原理是将图像中的每个点转换为参数空间中的一条线,然后在参数空间中找到交点,这些交点表示了图像中的直线。在标准霍夫变换中,参数空间由两个参数组成:极角和极径。在累计概率霍夫变换中,参数空间由两个参数组成:直线的起点和终点。 4. 标准霍夫变换HoughLines()函数 标准霍夫变换HoughLines函数调用。该函数将图像转换为二值图像,并在二值图像中查找直线。它返回一个包含检测到的直线的数组。 5. 累计概率霍夫变换HoughLinesP()函数 累计概率霍夫变换HoughLinesP函数调用。该函数与HoughLines函数类似,但它使用概率方法来查找直线。它返回一个包含检测到的直线的数组。 6. 霍夫圆变换 霍夫圆变换是一种检测圆形的技术。它的基本思想是将圆心和半径映射到参数空间中,从而在参数空间中检测圆形。 6.1 霍夫梯度法的原理 霍夫梯度法是一种检测圆形的技术。它的基本思想是在图像中查找梯度,并在梯度方向上查找圆形。 6.2 霍夫梯度法的缺点 霍夫梯度法的缺点是它对噪声敏感,并且它只能检测较大的圆形。 6.3 霍夫圆变化:HoughCircles()函数 霍夫圆变换HoughCircles函数调用。该函数在图像中查找圆形,并返回一个包含检测到的圆形的数组。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值