光条中心线提取-Steger算法 [OpenCV]

2023-12-23 05:01

本文主要是介绍光条中心线提取-Steger算法 [OpenCV],希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        在线结构光视觉传感器中,由线激光器发射出的线结构光,在本质上为一个连续且具有一定厚度的空间光平面,而在目标表面上所形成的具有一定宽度的光条特征,即为该光平面与目标表面相交而成的交线。在该空间光平面的厚度方向上,光强近似服从高斯分布,因而在摄像机采集到的光条图像中,在沿着光条宽度的方向或光条的法线方向上,其灰度也会呈现出类似的高斯分布特点,即光条中心的灰度值大而光条边缘的灰度值小,如图1所示,因而光条中心线的提取任务就是要找到图像中的光条灰度的高斯分布中心。

        采用结构光进行扫描检测时,需要提取激光条纹的中心线,本文采用经典的Steger算法提取光条中心。

Steger算法原理
        Steger算法基于Hessian矩阵,能够实现光条中心亚像素精度定位:首先通过Hessian矩阵能够得到光条的法线方向,然后在法线方向利用泰勒展开得到亚像素位置。 
对于图像中激光条纹上的任意一点(x,y)(x,y),Hessian矩阵可以表示为: 

                                                

void StegerLine()
{ Mat img0 = imread("image_0.png", 1);Mat img;cvtColor(img0, img0, CV_BGR2GRAY);img = img0.clone();//高斯滤波img.convertTo(img, CV_32FC1);GaussianBlur(img, img, Size(0, 0), 6, 6);//一阶偏导数Mat m1, m2;m1 = (Mat_<float>(1, 2) << 1, -1);  //x偏导m2 = (Mat_<float>(2, 1) << 1, -1);  //y偏导Mat dx, dy;filter2D(img, dx, CV_32FC1, m1);filter2D(img, dy, CV_32FC1, m2);//二阶偏导数Mat m3, m4, m5;m3 = (Mat_<float>(1, 3) << 1, -2, 1);   //二阶x偏导m4 = (Mat_<float>(3, 1) << 1, -2, 1);   //二阶y偏导m5 = (Mat_<float>(2, 2) << 1, -1, -1, 1);   //二阶xy偏导Mat dxx, dyy, dxy;filter2D(img, dxx, CV_32FC1, m3);filter2D(img, dyy, CV_32FC1, m4);filter2D(img, dxy, CV_32FC1, m5);//hessian矩阵double maxD = -1;int imgcol = img.cols;int imgrow = img.rows;vector<double> Pt;for (int i=0;i<imgcol;i++){for (int j=0;j<imgrow;j++){if (img0.at<uchar>(j,i)>200){Mat hessian(2, 2, CV_32FC1);hessian.at<float>(0, 0) = dxx.at<float>(j, i);hessian.at<float>(0, 1) = dxy.at<float>(j, i);hessian.at<float>(1, 0) = dxy.at<float>(j, i);hessian.at<float>(1, 1) = dyy.at<float>(j, i);Mat eValue;Mat eVectors;eigen(hessian, eValue, eVectors);double nx, ny;double fmaxD = 0;if (fabs(eValue.at<float>(0,0))>= fabs(eValue.at<float>(1,0)))  //求特征值最大时对应的特征向量{nx = eVectors.at<float>(0, 0);ny = eVectors.at<float>(0, 1);fmaxD = eValue.at<float>(0, 0);}else{nx = eVectors.at<float>(1, 0);ny = eVectors.at<float>(1, 1);fmaxD = eValue.at<float>(1, 0);}double t = -(nx*dx.at<float>(j, i) + ny*dy.at<float>(j, i)) / (nx*nx*dxx.at<float>(j,i)+2*nx*ny*dxy.at<float>(j,i)+ny*ny*dyy.at<float>(j,i));if (fabs(t*nx)<=0.5 && fabs(t*ny)<=0.5){Pt.push_back(i);Pt.push_back(j);}}}}for (int k = 0;k<Pt.size()/2;k++){Point rpt;rpt.x = Pt[2 * k + 0];rpt.y = Pt[2 * k + 1];circle(img0, rpt, 1, Scalar(0, 0, 255));}imshow("result", img0);waitKey(0);
}

https://blog.csdn.net/CharmsLUO/article/details/122312450

这篇关于光条中心线提取-Steger算法 [OpenCV]的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/526795

相关文章

Java后端接口中提取请求头中的Cookie和Token的方法

《Java后端接口中提取请求头中的Cookie和Token的方法》在现代Web开发中,HTTP请求头(Header)是客户端与服务器之间传递信息的重要方式之一,本文将详细介绍如何在Java后端(以Sp... 目录引言1. 背景1.1 什么是 HTTP 请求头?1.2 为什么需要提取请求头?2. 使用 Spr

Java中的Opencv简介与开发环境部署方法

《Java中的Opencv简介与开发环境部署方法》OpenCV是一个开源的计算机视觉和图像处理库,提供了丰富的图像处理算法和工具,它支持多种图像处理和计算机视觉算法,可以用于物体识别与跟踪、图像分割与... 目录1.Opencv简介Opencv的应用2.Java使用OpenCV进行图像操作opencv安装j

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)

《使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)》在现代软件开发中,处理JSON数据是一项非常常见的任务,无论是从API接口获取数据,还是将数据存储为JSON格式,解析... 目录1. 背景介绍1.1 jsON简介1.2 实际案例2. 准备工作2.1 环境搭建2.1.1 添加

opencv实现像素统计的示例代码

《opencv实现像素统计的示例代码》本文介绍了OpenCV中统计图像像素信息的常用方法和函数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 统计像素值的基本信息2. 统计像素值的直方图3. 统计像素值的总和4. 统计非零像素的数量

python解析HTML并提取span标签中的文本

《python解析HTML并提取span标签中的文本》在网页开发和数据抓取过程中,我们经常需要从HTML页面中提取信息,尤其是span元素中的文本,span标签是一个行内元素,通常用于包装一小段文本或... 目录一、安装相关依赖二、html 页面结构三、使用 BeautifulSoup javascript

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个