基于Opencv的卡尺找线

这篇具有很好参考价值的文章主要介绍了基于Opencv的卡尺找线。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  1. 首先, 边缘点的提取主要学习的是VisionPro的CogCaliperTool工具的原理。
  2. 之后,获得边缘点集之后,用RANSAC算法把异常点筛选出来。RANSAC的算法原理参考RANSAC算法(附RANSAC直线拟合C++与Python版本),有做小小地修改,根据以下公式计算迭代次数: k = l o g ( 1 − p ) l o g ( 1 − w n ) k=\frac{log(1-p)}{log(1-w^n)} k=log(1wn)log(1p)
void CCaliperGraphics::RansacLineFiler(const vector<Point2d>& points,vector<Point2d>&vpdExceptPoints, double sigma)
{
	unsigned int n = points.size();

	if (n < 2)
	{
		return;
	}

	RNG random;
	double bestScore = -1.;
	vector<Point2d>vpdTemp;
	int iterations = log(1 - 0.99) / (log(1 - (1.00 / n)))*10;
	
	for (int k = 0; k < iterations; k++)
	{
		int i1 = 0, i2 = 0;
		while (i1 == i2)
		{
			i1 = random(n);
			i2 = random(n);
		}
		const cv::Point2d& p1 = points[i1];
		const cv::Point2d& p2 = points[i2];
		Point2d vectorP21 = p2 - p1;
		vectorP21 *= 1. / norm(vectorP21);
		double score = 0;
		vpdTemp.clear();
		for (int i = 0; i < n; i++)
		{
			Point2d vectorPi1 = points[i] - p1;
			double d = vectorPi1.y * vectorP21.x - vectorPi1.x * vectorP21.y;//calculate the cos�� of the two vectors.
			if (fabs(d) < sigma)
			{
				score += 1;
			}
			else
			{
				vpdTemp.push_back(points[i]);
			}
		}
		if (score > bestScore)
		{
			bestScore = score;
			vpdExceptPoints = vpdTemp;
		}
	}
}
  1. 最后,用fitLine去做直线拟合。
    最终效果:
    opencv卡尺工具,Opencv,opencv
    用ImageWatch放大图片,
    opencv卡尺工具,Opencv,opencv

用opencv的trackbar和mouse事件简易地实现了了卡尺的拖动和编辑:
opencv卡尺工具,Opencv,opencv
卡尺的实现比较麻烦的是采样方向,我的定义如下图,根据向量的夹角公式计算线段与X轴的夹角,同样反过来,只要有线段中心,方向以及长度,就能计算出线段的起点和终点。

static double GetAngleVecWithX(Point2d p1,Point2d p2)
{
    if (p1 == p2)
    {
        return -1;
    }
    Point2d vector = p2 - p1;
    if (vector.x == 0)
    {
        if (vector.y > 0)
        {
            return 90;
        }
        else
        {
            return -90;
        }
    }
    double angle = to_degree(acos(pow(vector.x, 2) / (vector.x * sqrt(pow(vector.x, 2) + pow(vector.y, 2)))));
    if (p1.y > p2.y)
    {
        angle = -angle;
    }


    return  angle;
}

opencv卡尺工具,Opencv,opencv
此外,我觉得自带的drawArrow不是很好用,就利用RotateRect重新写了一个。画十字架也是类似的原理。

static void DrawArrow(Mat& inputMat, Point2d p1, Point2d p2, int dSize, Scalar color, int nThickness = 1)
{
    if (inputMat.empty())
    {
        return;
    }
    double dK = ((double)p2.y - (double)p1.y) / ((double)p2.x - (double)p1.x);
    double dAngle = atan(dK) * 180 / PI;
    line(inputMat, p1, p2, color, nThickness, LINE_AA);
    RotatedRect rotateRect(p2, Size(dSize, dSize * 0.5), dAngle);
    Point2f rectPoints[4];
    rotateRect.points(rectPoints);
    if ((dAngle >= 0 && p1.x <= p2.x) || (dAngle < 0 && p1.x <= p2.x))
    {
        line(inputMat, p2, rectPoints[0], color, nThickness, LINE_AA);
        line(inputMat, p2, rectPoints[1], color, nThickness, LINE_AA);
    }
    else
    {
        line(inputMat, p2, rectPoints[2], color, nThickness, LINE_AA);
        line(inputMat, p2, rectPoints[3], color, nThickness, LINE_AA);
    }
}

卡尺找圆也是一样的原理,效果在这里基于opencv的卡尺找圆

更新:用WPF和Opencvsharp实现了卡尺找线的UI, 其中显示控件是学习Halcon的窗口,用WPF实现的。
opencv卡尺工具,Opencv,opencv
opencv卡尺工具,Opencv,opencv
opencv卡尺工具,Opencv,opencv
opencv卡尺工具,Opencv,opencv文章来源地址https://www.toymoban.com/news/detail-731935.html

到了这里,关于基于Opencv的卡尺找线的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 修复 OpenCV 依赖错误的小工具:OpenCV Fixer

    使用 Nvidia 官方 Docker 镜像折腾 Stable Video Diffusion 的时候,发现 OpenCV 社区有一个古怪的 issue 需要手动解决,所以顺手写了一个能够自动修复的小工具。 以及,聊聊如何快速的发布一个 Python 软件包。 如果你在使用 Python 生态的软件时,遇到了 module \\\'cv2.dnn\\\' has no attribute \\\'DictV

    2024年01月17日
    浏览(16)
  • opencv进阶18-基于opencv 决策树导论

    opencv进阶18-基于opencv 决策树导论

    决策树是最早的机器学习算法之一,起源于对人类某些决策过程 的模仿, 属于监督学习算法 。 决策树的优点是易于理解,有些决策树既可以做分类,也可以做回归。在排名前十的数据挖掘算法中有两种是决策树[1]。决策树有许多不同版本,典型版本是最早出现的 ID3算法 ,

    2024年02月11日
    浏览(12)
  • OpenCV实战之三 | 基于OpenCV实现图像校正

    OpenCV实战之三 | 基于OpenCV实现图像校正

    前言 在机器视觉中,对于图像存在ROI区域倾斜现象,我们需要将其校正为正确的角度视角,方便下一步的布局分析与文字识别,通过透视变换可以取得比较好的裁剪效果。 ⭐ 基于轮廓提取和透射变换的矫正算法更适用于 车牌 、 身份证 、 人民币 、 书本 、 发票 一类矩形形

    2024年02月03日
    浏览(5)
  • OpenCV构建交互式图像距离测量工具

    在计算机视觉和图形学应用中,准确测量图像上的点之间距离是一项常见且重要的任务。本篇技术博客将详细介绍如何利用Python编程语言和OpenCV库构建一个交互式的图像距离测量工具。我们将通过编写一个名为ImageProcessor的类,让用户能够在图像上点击选取点,并实时显示两

    2024年04月14日
    浏览(17)
  • OpenCV+Qt实现图像处理操作工具

    OpenCV+Qt实现图像处理操作工具

    Qt界面实现 雪花屏 高斯模糊 中值滤波 毛玻璃 灰度化 XY方向模糊 双边模糊 腐蚀 [图像处理操作] 要求左边原图,右边效果图 结果展示如下:[图像处理实现有点多,就不一个一个地展示了,各别展示如下] 雪花屏 本文福利, 莬 费领取Qt开发学习资料包、技术视频,内容包括(

    2024年02月06日
    浏览(11)
  • 【OpenCV】基于OpenCV/C++实现yolo目标检测

    【OpenCV】基于OpenCV/C++实现yolo目标检测

    我们都知道, yolo 这些深度学习检测算法都是在python下用 pytorch 或 tf 框架这些训练的,训练得到的是pt或者weight权重文件,这些是算法开发人员做的事情,如何让算法的检测精度更高、速度更快。 但在工程化的时候,一般还是要用 C++ 实现的, OpenCV 不只是能进行图像的基本

    2024年02月15日
    浏览(10)
  • 基于opencv的图像拼接(一):pycharm及opencv环境配置

    初始opencv,纠结用c++还是python编写,opencv本身由c++语言编写,但python的简便实在太具诱惑力。看了许多资料与他人成品,单单实现图像拼接多使用python,毕竟编写简单,代码量也少。但多数【全景视频拼接】的成品都采用C++语言编写,具体什么原因我也不知道… 【结论】最后

    2023年04月09日
    浏览(11)
  • 【C++的OpenCV】第十五课-OpenCV的绘图工具(rectangle、circle、line、polylines、putText)常用方法简介

    【C++的OpenCV】第十五课-OpenCV的绘图工具(rectangle、circle、line、polylines、putText)常用方法简介

    🎉🎉🎉 欢迎各位来到小白 p i a o 的学习空间! color{red}{欢迎各位来到小白piao的学习空间!} 欢迎各位来到小白 p ia o 的学习空间! 🎉🎉🎉 💖 C++Python所有的入门技术皆在 我的主页 color{#0cc123}{我的主页} 我的主页 :我的主页 1.1.1 利用构造函数Mat中的一些形式完成快速创

    2024年02月06日
    浏览(12)
  • opencv案例03 -基于OpenCV实现二维码生成,发现,定位,识别

    opencv案例03 -基于OpenCV实现二维码生成,发现,定位,识别

    废话不多说,直接上代码 运行效果: 会在当前目前生成一张图片 对生成的二维码识别 opencv从4代之后推出了二维码识别接口.调用方法是这样的.代码如下: 运行结果: 返回值有三个, 第一个result就是解码后的内容,例如我这个二维码的结果是\\\"B0018\\\",当然也可以是个纯数字. 第二

    2024年02月11日
    浏览(12)
  • QT+OpenCV实现一个标注工具(图像处理、边缘检测)

    QT+OpenCV实现一个标注工具(图像处理、边缘检测)

    作者是一名QT初学者,为检验学习成果及完成毕业设计,在张老师和学姐的指导下,开发了这个标注工具。CSDN上很多文章对我的学习提供了极大的帮助,分享这篇文章给需要的人一起学习进步~ 废话不多说,先看看效果: Windows10、Qt5.13.2(编译器用的是MinGW64_bit)、OpenCV4.1 环

    2024年02月11日
    浏览(13)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包