#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>using namespace std;
using namespace cv;/*函数功能:求两条直线交点*/
/*输入:两条Vec4i类型直线*/
/*返回:Point2f类型的点*/
Point2f getCrossPoint(Vec4i LineA, Vec4i LineB)
{double ka, kb;ka = (double)(LineA[3] - LineA[1]) / (double)(LineA[2] - LineA[0]); //求出LineA斜率kb = (double)(LineB[3] - LineB[1]) / (double)(LineB[2] - LineB[0]); //求出LineB斜率Point2f crossPoint;crossPoint.x = (ka*LineA[0] - LineA[1] - kb*LineB[0] + LineB[1]) / (ka - kb);crossPoint.y = (ka*kb*(LineA[0] - LineB[0]) + ka*LineB[1] - kb*LineA[1]) / (ka - kb);return crossPoint;
}//函数功能,直线拟合
Vec4i fitline(vector<cv::Point> points)
{cv::Vec4f line_para;cv::fitLine(points, line_para, CV_DIST_HUBER, 0, 0.01, 0.01);cv::Point point0;point0.x = line_para[2];point0.y = line_para[3];double k = line_para[1] / line_para[0];/*cout << k << endl;*///计算直线的端点(y = k(x - x0) + y0)/*vector<Point2f> Points;*/Vec4i temp;cv::Point point1, point2;if (k < 0){point1.x = 0;point1.y = k * (0 - point0.x) + point0.y;point2.x = 640;point2.y = k * (640 - point0.x) + point0.y;}else {point1.x = 500;point1.y = k * (500-point0.x) + point0.y;point2.x = 1400;point2.y = k * (1400- point0.x) + point0.y;}temp[0] = point1.x;temp[1] = point1.y;temp[2] = point2.x;temp[3] = point2.y;return temp;
}void main()
{Mat img,grayimg,blurimg,dstimg;double vmin, vmax, alpha;img = imread("image4.jpg",1);cvtColor(img,grayimg,CV_BGR2GRAY);GaussianBlur(grayimg, blurimg, Size(3, 3), 0, 0);Canny(blurimg, dstimg, 100, 180, 3);minMaxLoc(img, &vmin, &vmax);alpha = (255.0 / (vmax - vmin))*0.8;img.convertTo(img, CV_8U, alpha, -vmin * alpha);Mat im_color;applyColorMap(img, im_color, COLORMAP_JET);int rho = 1;//距离分辨率vector<Vec4i>lines;//长度等于找到的线段数HoughLinesP(dstimg, lines, rho, CV_PI / 180, 40, 60, 10);//直线检测cout << "the detected lines numbers is: "<<lines.size() << endl;std::vector<cv::Point> pointsL;//std::vector<cv::Point> pointsR;cv::Mat image = cv::Mat::zeros(img.rows, img.cols, CV_8UC3);for (size_t i = 0; i < lines.size(); i++){Vec4i I = lines[i];int dx = I[2] - I[0];int dy = I[3] - I[1];if (dy < 0)//dy>0取的是右边{pointsL.push_back(cv::Point(I[0], I[1]));pointsL.push_back(cv::Point(I[2], I[3]));}else{pointsR.push_back(cv::Point(I[0], I[1]));pointsR.push_back(cv::Point(I[2], I[3]));}line(img, Point(I[0], I[1]), Point(I[2], I[3]), Scalar(0, 0, 255), 2, CV_AA);}for (int i = 0; i < pointsL.size(); i++){cv::circle(image, pointsL[i], 3, cv::Scalar(0, 0, 255), 2, 8, 0);cv::circle(image, pointsR[i], 3, cv::Scalar(0, 255, 255), 2, 8, 0);}Vec4i templ = fitline(pointsL);Vec4i tempr = fitline(pointsR);//cv::line(img, Point(templ[0], templ[1]), Point(templ[2], templ[3]), cv::Scalar(0, 255, 0), 2, 8, 0);//cv::line(img, Point(tempr[0], tempr[1]), Point(tempr[2], tempr[3]), cv::Scalar(0, 255, 255), 2, 8, 0);vector<Point2f> corners;//线的交点存储  cv::Point2f pt = getCrossPoint(templ, tempr);circle(im_color, pt, 3, Scalar(0, 0, 255), 2);cout << "(x,y): (" << pt.x << ","<< pt.y<<")" << endl;imshow("deteceted lines", dstimg);imshow("xxx",im_color);waitKey(0);system("pause");
}

opencv+hough直线检测+fitline直线拟合相关推荐

  1. c++版本opencv(36.霍夫直线检测37.直线类型与线段-)

    c++版本opencv(36.霍夫直线检测37.直线类型与线段-) 一.36.霍夫直线检测- 二,37.直线类型与线段- 来自网易云课堂贾志刚老师 一.36.霍夫直线检测- 同一条直线上的点,r和c塔 ...

  2. 空间中的语义直线检测_直线检测

    作者:张远学; 陶青川; 王维 期刊:<现代计算机> 为了限制河岸场景下不文明.违规的垂钓行为,提出一种融入深度学习的垂钓行为检测方法.首先使用基于CNN开发的语义分割模型deeplabV ...

  3. opencv传统分割算法总结(多边形拟合,水平投影,直线检测)

    最近我发现,在很多特定问题上传统的分割方法挺方便的,比如分割打印字体文件,网站爬下来的表格图像,pdf中的特定格式文件等.在实战中,我总结了几点记录一下.主要采用opencv-python来应用这些算 ...

  4. 霍夫变换检测直线 c语言,opencv之霍夫变换直线检测

    霍夫变换检测 霍夫变换之直线检测霍夫变换直线检测 前提条件-边缘检测已经完成 平面空间到极坐标空间的转换(空间域向霍夫域的转换) 检测原理两点确定一条直线,通过一点可以确定无数条直线,极坐标直线公式 ...

  5. hough变换是如何检测出直线和圆的

    (I)直线篇 1 直线是如何表示的? 对于平面中的一条直线,在笛卡尔坐标系中,常见的有点斜式,两点式两种表示方法.然而在hough变换中,考虑的是另外一种表示方式:使用(r,theta)来表示一条直线 ...

  6. 形状识别之直线检测(LSD)

    转自一篇基于直线检测的形状识别方法,不同于霍夫直线检测. 原文网址:https://blog.csdn.net/liujiabin076/article/details/74917605 LSD官网( ...

  7. 基于opencv的c++图像处理(霍夫直线检测与最小二乘法直线拟合)

    前言 基于opencv的c++接口,实现标准的霍夫直线检测.基于统计概率的霍夫直线检测.以及最小二乘法直线拟合. 相关的opencv接口解析 CV_EXPORTS_W void HoughLines( ...

  8. Python+OpenCV:Hough直线检测(Hough Line Transform)

    Python+OpenCV:Hough直线检测(Hough Line Transform) 理论 A line can be represented as  or in a parametric fo ...

  9. c++ opencv fitLine函数拟合直线

    c++ opencv fitLine函数拟合直线 fitLine 函数 void fitLine( InputArray points, OutputArray line, int distType, ...

最新文章

  1. 还找不到想要的文章吗?公众号搜索方法大全
  2. Python实现阿里云aliyun服务器里的文件上传与下载
  3. mysql-master/slave同步问题:Slave_IO_Running: No
  4. golang中的目录操作
  5. 线程知识-ThreadLocal使用详解
  6. 已知项目有风险,作为项目经理接还是不接?
  7. Python 网络爬虫笔记6 -- 正则表达式
  8. Linux下搭建Android交叉编译环境
  9. matlab的循环语句裁图,[MATLAB图像处理] 多幅图片处理的循环语句
  10. [javascript|基本概念|Number]学习笔记
  11. python的django项目中怎么添加app_django下如何创建多个app并设置urls
  12. Java网络爬虫该如何学习
  13. 1、lo4j.properties
  14. Java开发桌面程序学习(七)——ImageView设置图片以及jar包读取fxml文件
  15. 19.MongoDB值distinct性能验证
  16. 近期解决问题经历和感悟
  17. TSSD2018下载地址及更新说明
  18. linux微软公式编辑器,linux下的公式编辑器
  19. IPV6的福音---六维空间
  20. 鸡兔同笼:35个头,94只脚,问鸡、兔各多少只?

热门文章

  1. python--查看微信好友是否删除自己
  2. Qgis系统教程1:软件安装
  3. This may cause NPE so Data Binding will safely unbox it.
  4. 妙不可言,这4款小众良心软件,值得你用心体会
  5. 【codeforces】【比赛题解】#960 CF Round #474 (Div. 1 + Div. 2, combined)
  6. UE4 如何开启 EQS
  7. 不情愿的守门人:关于全栈开发者的迷思
  8. 微信开发文本信息如何换行
  9. HDU2091题解——空心三角形
  10. 机敏问答[复变][5] #20210629