资源简介

霍夫线变换源代码, 有注释方便快速掌握源代码。 希望能够帮助大家。

资源截图

代码片段和文件信息


int main( int argc char** argv )  
{  
    Mat src edgecolor_edge;  
    src=imread(“building.jpg“);  
    if(!src.data)    
        return -1;    
  
    Canny(srcedge502003);  
    cvtColor(edge color_edge CV_GRAY2BGR);  
    vector lines;  //保存直线的首端和尾端。
    HoughLinesP(edge lines 1 CV_PI/180 80 30 10);  
    for( size_t i = 0; i     {  
        Vec4i l = lines[i];  
        line(color_edge Point(l[0] l[1]) Point(l[2] l[3]) Scalar(00255) 2);  
    }  
  
    namedWindow( “lines“ CV_WINDOW_AUTOSIZE );  
    imshow( “lines“ color_edge );  
    waitKey(0);  
  
    return 0;  
}

static void  
icvHoughLinesProbabilistic( CvMat* image  
                            float rho float theta int threshold  
                            int lineLength int lineGap  
                            CvSeq *lines int linesMax )  //
{  
    //accum 为累加器矩阵,mask 为掩码矩阵    
    cv::Mat accum mask;  //收集图像中的所有非零点保存在掩码矩阵中  非零点就是边缘点
    cv::vector trigtab;    // 用于存储事先计算好的正弦和余弦值  
    // 开辟一段内存空间  
    cv::MemStorage storage(cvCreateMemStorage(0));  
    // 用于存储特征点坐标,即边缘像素的位置  
    CvSeq* seq;    //??? seq 为所有边缘点坐标位置的序列
    CvSeqWriter writer;  //???存储序列容器
    int width height;    // 图像的宽和高  
    int numangle numrho;    // 角度和距离的离散数量  
    float ang;                     //普通变量
    int r n count;      // count用来得到边缘点的数量
    CvPoint pt;         //像素点
    float irho = 1 / rho;    // 距离分辨率的倒数  
    CvRNG rng = cvRNG(-1);    // 随机数  
    const float* ttab;    // 向量 trigtab 的地址指针  
    uchar* mdata0;    // 矩阵 mask 的地址指针  
    // 确保输入图像的正确性  
    CV_Assert(CV_IS_MAT(image) && CV_MAT_TYPE(image->type) == CV_8UC1 );  
  
    width = image->cols;    // 提取出输入图像的宽  
    height = image->rows;    // 提取出输入图像的高  
    // 由角度和距离分辨率,得到角度和距离的离散数量
//numangle霍夫空间的 wigth也就是 theta的个数,theta为一个单位 
    numangle = cvRound(CV_PI / theta);   //霍夫空间的 wigth   cvRound(double value):对一个double型的数进行四舍五入,并返回一个整型数
    numrho = cvRound(((width + height) * 2 + 1) / rho);//霍夫空间的 hight  为什么hight是这么算???
    // 创建累加器矩阵,即霍夫空间  
    accum.create(numangle numrho CV_32SC1);  
    // 创建掩码矩阵,大小与输入图像相同  
    mask.create(height width CV_8UC1);  //为什么要创建掩码矩阵呢  
    // 定义 trigtab 的大小,因为要存储正弦和余弦值,所以长度为角度离散数的 2 倍  
    trigtab.resize(numangle*2);  
    // 累加器矩阵清零  
    accum = cv::Scalar(0);  
    // 避免重复计算,事先计算好所需的所有正弦和余弦值  
    for(ang = 0 n = 0; n < numangle; ang += theta n++)  
    {  
        trigtab[n*2] = (float)(cos(ang) * irho);  // irho=1  是 距离分辨率的倒数
        trigtab[n*2+1] = (float)(sin(ang) * irho);  
    }  
    // 赋值首地址  
    ttab = &trigtab[0];  // ttab 是 向量 trigtab 的地址指针
    mdata0 = mask.data;  //mdata0 是 掩码矩阵 mask 的地址指针  
    // 开始写入序列  
    cvStartWriteSeq( CV_32SC2 sizeof(CvSeq) sizeof(CvPoint) storage &writer );  
  
    // stage 1. collect non-zero image points  
    // 收集图像中的所有非零点保存在掩码矩阵中,
//因为输入图像是边缘图像,所以非零点就是边缘点  
    for(pt.y = 0 cou

评论

共有 条评论