文章目录

  • 直线拟合fitLine
  • 求两直线对称轴
  • 倾斜校正
  • 附1 实验代码

直线拟合fitLine

void cv::fitLine(  cv::InputArray points, // 二维点的数组或vector  cv::OutputArray line, // 输出直线,Vec4f (2d)或Vec6f (3d)的vector  int distType, // 距离类型  double param, // 距离参数  double reps, // 径向的精度参数  表示直线到原点距离的精度,建议取 0.01。设为0,则自动选用最优值double aeps // 角度精度参数  表示直线角度的精度,建议取 0.01
);

◆输出line:为一个四元素的容器,如Vec4f - (vx, vy, x0, y0)。(vx, vy) 是直线的方向向量,(x0, y0) 是直线上一点
画出直线用cv::line(image, point1, point2, cv::Scalar(0, 255, 0), 2, 8, 0);需要输入直线上的两个点,

    double cos_theta = line[0];double sin_theta = line[1];double x0 = line[2], y0 = line[3];double k = sin_theta / cos_theta;double b = y0 - k * x0;//求出直线上另一点double x = 0; double y = k * x + b;cv::line(image, Point(x0,y0), Point(x,y), cv::Scalar(255), 1);

◆参数param含义如下,为0时自动选择最优值

Numerical parameter ( C ) for some types of distances. If it is 0, an optimal value is chosen.

◆距离类型distType一共有六种,如下图,其中CV_DIST_L2就是最小二乘法

最小二乘法抗干扰能力不如其它5种方法,实验代码见附1

原图 拟合结果

求两直线对称轴

由直线拟合得到两条Vec4f类型直线,求其对称轴
(1)求两直线交点

/*函数功能:求两条直线交点*/
/*输入:两条Vec4f类型直线*  Vec4f - (vx, vy, x0, y0)* (vx, vy) 是直线的方向向量,(x0, y0) 是直线上一点*/
/*返回:Point2f类型的点*/
Point2f getCrossPoint(Vec4f LineA, Vec4f LineB)
{double ka, kb;ka = LineA[1]/LineA[0]; //求出LineA斜率kb = LineB[1]/LineB[0];; //求出LineB斜率Point2f crossPoint;crossPoint.x = (ka*LineA[2] - LineA[3] - kb*LineB[2] + LineB[3]) / (ka - kb);crossPoint.y = (ka*kb*(LineA[2] - LineB[2]) + ka*LineB[3] - kb*LineA[3]) / (ka - kb);return crossPoint;
}

(2)对称轴斜率k2=(k0+k1)/2
(3)得到对称轴点斜式方程,令x=0代入,求得直线上另一点

 double k_line2 =(k_line0+k_line1)/2;Point p2_1(0, k_line2*(0 - crossPoint.x) + crossPoint.y);  //x=0,求出直线上另一点line(drawing, p2_1, crossPoint, Scalar(0, 0, 255), 3);     //显示拟合出的直线

倾斜校正

Point2f center=Point2f(src.rows/2,src.cols/2);
Mat martix = getRotationMatrix2D(center, k_line2/CV_PI*180, 1);//得到仿射矩阵  k_line2/CV_PI*180 弧度转角度
warpAffine(src, dst, martix, drawing.size());

附1 实验代码

#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <iostream>
using namespace cv;
using namespace std;int main()
{const char* filename = "1.bmp";Mat src_image = imread(filename, 1);if (src_image.empty()){cout << "Couldn't open image!" << filename;return 0;}int img_width = src_image.cols;int img_height = src_image.rows;Mat gray_image, bool_image;cvtColor(src_image, gray_image, CV_RGB2GRAY);threshold(gray_image, bool_image, 0, 255, CV_THRESH_OTSU);imshow("二值图", bool_image);//获取二维点集vector<Point> point_set;Point point_temp;for (int i = 0; i < img_height; ++i){for (int j = 0; j < img_width; ++j){if (bool_image.at<unsigned char>(i, j) < 255){point_temp.x = j;point_temp.y = i;point_set.push_back(point_temp);}}}//直线拟合  //拟合结果为一个四元素的容器,比如Vec4f - (vx, vy, x0, y0)//其中(vx, vy) 是直线的方向向量//(x0, y0) 是直线上的一个点Vec4f fitline;//拟合方法采用最小二乘法fitLine(point_set, fitline, CV_DIST_L2, 0, 0.01, 0.01);//求出直线上的两个点double k_line = fitline[1] / fitline[0];Point p1(0, k_line*(0 - fitline[2]) + fitline[3]);Point p2(img_width - 1, k_line*(img_width - 1 - fitline[2]) + fitline[3]);line(src_image, p1, p2, Scalar(0, 0, 255), 2);     //显示拟合出的直线Vec4f fitline1;//拟合方法采用CV_DIST_L12  CV_DIST_WELSCH  CV_DIST_FAIRfitLine(point_set, fitline1, CV_DIST_WELSCH, 0, 0.01, 0.01);//求出直线上的两个点double k_line1 = fitline1[1] / fitline1[0];Point p11(0, k_line1*(0 - fitline1[2]) + fitline1[3]);Point p12(img_width - 1, k_line1*(img_width - 1 - fitline1[2]) + fitline1[3]);line(src_image, p11, p12, Scalar(0, 255, 0), 2);Vec4f fitline2;//拟合方法采用CV_DIST_L12  CV_DIST_WELSCH  CV_DIST_FAIRfitLine(point_set, fitline2, CV_DIST_L12, 0, 0.01, 0.01);//求出直线上的两个点double k_line2 = fitline2[1] / fitline2[0];Point p21(0, k_line2*(0 - fitline2[2]) + fitline2[3]);Point p22(img_width - 1, k_line2*(img_width - 1 - fitline2[2]) + fitline2[3]);line(src_image, p21, p22, Scalar(255, 0, 0), 2);//显示拟合出的直线方程/*char text_equation[1024];sprintf_s(text_equation, "y-%.2f=%.2f(x-%.2f)", fitline[3], k_line, fitline[2]);putText(src_image, text_equation, Point(30, 50), CV_FONT_HERSHEY_COMPLEX, 0.5, Scalar(0, 0, 255), 1, 8);*/imshow("原图+拟合结果", src_image);waitKey();return 0;
}

OpenCV--直线拟合fitLine及求两直线对称轴相关推荐

  1. java 求两线交点_JAVA求两直线交点和三角形内外心的编程代码

    JAVA求两直线交点和三角形内外心的编程代码 一.求两直线交点 复制代码 代码如下: class Point { double x; double y; public Point() { this.x ...

  2. 分别已知两直线上的两点,求两直线交点

    分别已知两直线上的两点,求两直线交点 求两直线的交点是初中数学的简单问题了,在直角坐标系中直线有很多种表示方式.同时我们知道两点确定一条直线,已知两点坐标自然能求出直线坐标,已知两直线坐标自然能求出两 ...

  3. OpenCV—直线拟合fitLine

    本文的主要参考为官方文档OpenCV249-fitLine和博客-OpenCV 学习(直线拟合) 以及<Learning OpenCV 3>page425-426 OpenCV中提供的直线 ...

  4. OpenCV | 直线拟合fitline函数(Python)

    简介 之前做直线拟合时,自己写了一个利用最小二乘做直线拟合的程序,但是由于直线检测的误差比较大,拟合的效果并不好.个人不知道是什么原因,因此想尝试更改一下直线拟合的算法,后来找到了OpenCV中的fi ...

  5. 拟合直线后简单快速求解两直线交点

    opencv 自带直线拟合函数: void fitLine(InputArray points, OutputArray line, int distType, double param, doubl ...

  6. 直线拟合fitLine函数的用法

    在霍夫检测直线的时候,一条直线会被检测出许多条,可以根据给定的点集拟合出一条直线的情形. void cv::fitLine(cv::InputArray points, // 二维点的数组或vecto ...

  7. 求两直线交点程序 C

    const   double   EPS                 =   1e-5;           //   计算精度  const   int   CROSS             ...

  8. 算法之美——求两直线交点(三维叉积)——求四边形面积(二维叉积)

    一般方程法: 直线的一般方程为F(x) = ax + by + c = 0.既然我们已经知道直线的两个点,假设为(x0,y0), (x1, y1),那么可以得到a = y0 – y1, b = x1 ...

  9. 求两直线的交点(C++)

    假设两直线的式子分别为: 求解过程:  综上所述,交点的解为:  则有解,否则两直线平行. 补充:如果化成Y=kX+b的形式的话,得解为: 例题:Audio 给定三个不共线的点,要求输出一个点使得这个 ...

最新文章

  1. 计算机加入域后远程桌面无法登陆域账户
  2. 如何为WCF应用添加X509证书和安全验证
  3. 查看计算机CPU、内存使用情况
  4. 参加51CTO培训,华为HCNP认证考试通过啦
  5. java常用序列化与反序列化方法
  6. mysql登陆时报错PID_Mysql 启动错误:the server quit without updating pid
  7. BI工具的优势存在于哪些方面
  8. (转)PHP利用Curl、socket、file_get_contents POST数据
  9. drbd+corosync+pacemaker实现mysql的高可用性“上”
  10. SpringBoot整合Mail之设置发件人昵称
  11. OpenCV库下载安装使用方法
  12. 关于KX混响插件:REVERB R详解
  13. 数据库锁机制1------共享锁
  14. Resnet残差网络学习
  15. 惠普136w耗材贵吗_说说打印机选购经验 的第十台打印机 HP Laser 136w
  16. python股票量化交易入门到实践_Python股票量化交易从入门到实践
  17. vue一维码,二维码生成
  18. 【小小干货】如何寻找综述性论文?
  19. firefox flash插件
  20. python实战(一)Python爬取猫眼评分排行前100电影及简单数据分析可视化python实战(一)Python爬取猫眼排行前一百电影及简单数据分析可视化

热门文章

  1. 《天池龙珠 - Python训练营》03.Python基础进阶:从函数到高级魔法方法
  2. 新零售SaaS架构:多租户系统架构设计
  3. 【CZY选讲·Triangle】
  4. Abaqus2019的abaqus_v6.env在哪里
  5. 灾难性遗忘(catastrophic forgetting)
  6. [知了堂学习笔记]_牵线Eclipse和Tomcat第一篇 —— 配置Java环境变量安装eclipse
  7. 苹果2014WWDC亮点之个人浅见
  8. 办公软件使用学习笔记:excel第四节。excel美化表格(智能表格,美化套路)。图表数据动态显示,迷你图、条件格式、动态图表、
  9. 计算机专业854,精选-2017年哈工大计算机科学与技术专业854考研真题
  10. Java——使用多线程模拟真实高并发业务并保证安全性(一)