opencv 简单的实现霍夫变换(改进版)
2018-02-13 13:43
369 查看
//霍夫变换 输入单通道二值图像 检测直线数量 void HoughLines(Mat &img,int n) { int i,j; //行列 int row = img.rows; int col = img.cols; //极径最大值为 对角线+宽 int max_r = col + cvCeil (sqrt(double(row*row+col*col))); //累加器 三角函数 int *line_cnt[180]; double sin_[180],cos_[180],rad_ = CV_PI/180; for(i = 0; i < 180; i++) { //初始化累加器为0 line_cnt[i] = new int[max_r](); //初始化三角函数 sin_[i] = sin(i*rad_); cos_[i] = cos(i*rad_); } //极径 极角 int r = 0; int theta = 0; //遍历图像 判断并进行累加 uchar *p; for( i = 0; i < row; i++) { p = img.ptr<uchar>(i); for ( j = 0; j < col; j++) { if(p[j] != 0) { for( theta =0; theta < 180 ; theta++) { //极坐标 直线方程 r =cvRound(j*cos_[theta]+i*sin_[theta]); //偏移 无负值 r = r + col; line_cnt[theta][r]++; } } } } //存放取出最长的n条直线 int *line_n[3]; line_n[0] = new int ();//极角 line_n[1] = new int ();//极径 line_n[2] = new int ();//共点数量 int tt = 0,rr = 0,cnt = 0; for(theta = 0; theta < 180; theta++) { for( r = 0; r < max_r; r++) { //最少共点 < 这条直线的共点 则替换 并尝试进行冒泡 if(line_n[2][n-1] < line_cnt[theta][r]) { line_n[0][n-1] = theta; //累计的时候偏移过 这里再偏移回来 line_n[1][n-1] = r - col; line_n[2][n-1] = line_cnt[theta][r]; //冒泡排序 for(i = n - 1;i > 0; i--) { //如果大于 则交换 if(line_n[2][i] > line_n[2][i-1]) { tt = line_n[0][i]; rr = line_n[1][i]; cnt = line_n[2][i]; line_n[0][i] = line_n[0][i-1]; line_n[1][i] = line_n[1][i-1]; line_n[2][i] = line_n[2][i-1]; line_n[0][i-1] = tt; line_n[1][i-1] = rr; line_n[2][i-1] =cnt; } else break; } } } } //为了画绿线 单通道转换为三通道 cvtColor(img, img, CV_GRAY2BGR); //画出线段 for(i = 0; i < n; i++ ) { Point pt1, pt2; double a = cos_[line_n[0][i]], b = sin_[line_n[0][i]]; double x0 = a* line_n[1][i], y0 = b* line_n[1][i]; pt1.x = cvRound(x0 + max_r*(-b)); pt1.y = cvRound(y0 + max_r*(a)); pt2.x = cvRound(x0 - max_r*(-b)); pt2.y = cvRound(y0 - max_r*(a)); //绿线 line(img, pt1, pt2, Scalar(0,255,0), 1, CV_AA); } //-------------------释放内存------------------------ for(i = 0; i < 180; i++) { delete []line_cnt[i]; } delete []line_n[0]; delete []line_n[1]; delete []line_n[2]; }
相关文章推荐
- opencv 简单的实现霍夫变换
- 基于opencv的简单亮度校正功能实现
- 利用Opencv实现简单的图片切割(JAVA)
- 用Opencv实现简单的图片翻页
- OpenCV简单亮度校正功能实现
- 霍夫变换实现球体追踪opencv
- 基于OpenCV实现霍夫变换
- opencv+KNN实现手写简单数字识别
- OpenCV实践之路——基于暗通道先验的去雾算法简单实现
- Java使用OpenCV类库实现简单的KNN Machine Learning.
- Opencv实现图像旋转,非常简单,几行代码
- opencv实现简单光流跟踪
- IOS 用openCv实现简单的扣人像的
- 用opencv实现简单的人脸检测
- opencv对codebook的实现—自己加的简单英文解释
- ROS学习笔记(2):在ROS中使用OpenCV进行简单的图像处理---代码实现篇
- python︱利用dlib和opencv实现简单换脸、人脸对齐、关键点定位与画图
- 从零使用OpenCV快速实现简单车牌识别系统
- 简单的图像显著性区域特征提取方法-----opencv实现LC,AC,FT
- 一个非常简单的opencv实现bmp,jpeg格式转化的代码