opencv 直线检测笔记

举报
风吹稻花香 发表于 2021/12/27 22:59:43 2021/12/27
【摘要】 目录 c++ 检测垂直线  检测所有线: c++ C++: void HoughLinesP(InputArray image, OutputArray lines, double rho, double theta, int threshold, double minLineLength=0, double ...

目录

c++

检测垂直线 

检测所有线:


c++

C++: void HoughLinesP(InputArray image, OutputArray lines, double rho, double theta, int threshold, double minLineLength=0, double maxLineGap=0 )

第一个参数,InputArray类型的image,输入图像,即源图像,需为8位的单通道二进制图像,可以将任意的源图载入进来后由函数修改成此格式后,再填在这里。

第二个参数,InputArray类型的lines,经过调用HoughLinesP函数后后存储了检测到的线条的输出矢量,每一条线由具有四个元素的矢量(x_1,y_1, x_2, y_2)  表示,其中,(x_1, y_1)和(x_2, y_2) 是是每个检测到的线段的结束点。
第三个参数,double类型的rho,以像素为单位的距离精度。另一种形容方式是直线搜索时的进步尺寸的单位半径。
第四个参数,double类型的theta,以弧度为单位的角度精度。另一种形容方式是直线搜索时的进步尺寸的单位角度。
第五个参数,int类型的threshold,累加平面的阈值参数,即识别某部分为图中的一条直线时它在累加平面中必须达到的值。大于阈值threshold的线段才可以被检测通过并返回到结果中。
第六个参数,double类型的minLineLength,有默认值0,表示最低线段的长度,比这个设定参数短的线段就不能被显现出来。
第七个参数,double类型的maxLineGap,有默认值0,允许将同一行点与点之间连接起来的最大的距离。

原文链接:https://blog.csdn.net/cqltbe131421/article/details/60870466

检测垂直线 


  
  1. Mat src = imread("F:/project/jushi/ellipse_detector-sdk/images/04_00010.bmp", IMREAD_COLOR);
  2. Mat canny;
  3. Canny(src, canny, 100, 250);
  4. imshow("canny", canny);
  5. vector<Vec2f> lines;
  6. HoughLines(canny, lines, 1.0, CV_PI / 180, 102, 0, 0, 0,0.1); //垂直直线
  7. //依次在图中绘制出每条线段
  8. for (size_t i = 0; i < lines.size(); i++)
  9. {
  10. float rho = lines[i][0], theta = lines[i][1];
  11. Point pt1, pt2;
  12. double a = cos(theta), b = sin(theta);
  13. double x0 = a * rho, y0 = b * rho;
  14. pt1.x = cvRound(x0 + 2000 * (-b)); //把浮点数转化成整数
  15. pt1.y = cvRound(y0 + 2000 * (a));
  16. pt2.x = cvRound(x0 - 2000 * (-b));
  17. pt2.y = cvRound(y0 - 2000 * (a));
  18. line(src, pt1, pt2, Scalar(255), 1, CV_AA);
  19. }
  20. imshow("src", src);
  21. waitKey(0);

检测所有线:


  
  1. Mat src = imread("F:/project/jushi/ellipse_detector-sdk/images/04_00010.bmp", IMREAD_COLOR);
  2. Mat src1, src2, src3, src4, dst;
  3. namedWindow("效果图窗口", 1);//定义窗口
  4. Canny(src, src1, 50, 200, 3);//进行一此canny边缘检测
  5. cvtColor(src1, src2, CV_GRAY2BGR);//转化边缘检测后的图为灰度图
  6. vector<Vec4i> lines; //定义一个矢量结构lines用于存放得到的线段矢量集合
  7. //HoughLines(src1, lines, 1, CV_PI / 180, 150, 0, 0);
  8. HoughLinesP(src1, lines, 1, CV_PI / 180, 80, 50, 10);//进行霍夫线变换
  9. for (size_t i = 0; i < lines.size(); i++)
  10. {
  11. float rho = lines[i][0], theta = lines[i][1];
  12. Point pt1, pt2;
  13. double a = cos(theta), b = sin(theta);
  14. double x0 = a * rho, y0 = b * rho;
  15. pt1.x = cvRound(x0 + 1000 * (-b));
  16. pt1.y = cvRound(y0 + 1000 * (a));
  17. pt2.x = cvRound(x0 - 1000 * (-b));
  18. pt2.y = cvRound(y0 - 1000 * (a));
  19. Vec4i l = lines[i];
  20. line(src2, pt1, pt2, Scalar(55, 100, 195), 1, CV_AA);
  21. }
  22. imshow("效果图窗口1", src1);
  23. imshow("效果图窗口2", src2);
  24. waitKey(0);

文章来源: blog.csdn.net,作者:AI视觉网奇,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/jacke121/article/details/122163386

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。