资源简介
霍夫线变换源代码, 有注释方便快速掌握源代码。 希望能够帮助大家。
代码片段和文件信息
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
- 上一篇:底部导航栏.rar
- 下一篇:LSD直线检测源代码
评论
共有 条评论