c++视觉处理---霍夫变换

news2024/9/23 11:55:40

霍夫直线变换的函数

HoughLines 是OpenCV库中用于执行霍夫直线变换的函数。霍夫直线变换用于检测图像中的直线。下面是该函数的基本用法:

cv::HoughLines(image, lines, rho, theta, threshold);
  • image: 输入的二值图像,通常是通过边缘检测算法生成的。
  • lines: 存储检测到的直线的容器。
  • rho: 霍夫空间中的距离分辨率。通常设置为像素。
  • theta: 霍夫空间中的角度分辨率。通常设置为弧度。
  • threshold: 用于判断直线是否检测成功的阈值。只有当投票数大于等于此阈值时,才会被认为检测到一条直线。

cv::HoughLines 函数将在输入图像上执行霍夫直线变换,识别直线,并将检测到的直线的参数 (ρ, θ) 存储在 lines 容器中。每个检测到的直线都由 (ρ, θ) 表示,其中 ρ 是距离原点的距离,θ 是直线的角度。您可以在 lines 容器中访问这些参数。

以下是一个使用 cv::HoughLines 的简单示例:

#include <opencv2/opencv.hpp>
#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

using namespace std;
using namespace cv;
#include <fstream>
using namespace cv; //包含cv命名空间
#include <opencv2/core/core.hpp>

//----------------- 【main()函数】--------------------------
// 描述: 控制台应用程序的入口函数, 我们的程序从这里开始
//
int main()
{
	//【1】载入原始图和 Mat变量定义
	Mat srcImage = imread("113.jpg"); //工程目录下应该有一张名为1. jpg的素材图
	Mat midImage, dstImage;//临时变量和目标图的定义
	//【2】进行边缘检测和转化为灰度图
	Canny(srcImage, midImage, 50, 200, 3);//进行一此 canny边缘检测
	cvtColor(midImage, dstImage, CV_GRAY2BGR);//转化边缘检测后的图为灰度图
	//【3】进行霍夫线变换
	vector<Vec2f> lines;//定义一个矢量结构lines用于存放得到的线段矢量集合
	HoughLines(midImage, lines, 1, CV_PI/180, 150, 0, 0 );
	//【4】依次在图中绘制出每条线段
	for (size_t i = 0; i < lines.size(); i++)
	{
		float rho = lines[i][0], theta = lines[i][1];
		Point pt1, pt2;
		double a = cos(theta), b = sin(theta);
		double x0 = a * rho, y0 = b * rho;
		pt1.x = cvRound(x0 + 1000 * (-b));
		pt1.y = cvRound(y0 + 1000 * (a));
		pt2.x = cvRound(x0 - 1000 * (-b));
		pt2.y = cvRound(y0 - 1000 * (a));
		//此句代码的OpenCV2版为:
		//line( dstImage, pt1, pt2, Scalar(55,100,195), 1, CV_AA);
		//此句代码的 OpenCV3版为:
		line(dstImage, pt1, pt2, Scalar(55, 100, 195), 1, LINE_AA);
	}
	//【5】显示原始图
	imshow("【原始图】", srcImage);
	//【6】边缘检测后的图
	imshow("【边缘检测后的图】", midImage);
	//【7】显示效果图
	imshow("【效果图】", dstImage);
	waitKey(0);
	return 0;
}

在这里插入图片描述

累计概率霍夫变换: HoughLinesP()函数

cv::HoughLinesP 是OpenCV库中用于执行概率霍夫直线变换(Probabilistic Hough Line Transform)的函数。概率霍夫直线变换与传统霍夫直线变换不同,它不需要计算每个像素的直线参数 (ρ, θ),而是通过连接边缘点的局部段来检测线段。这可以显著提高速度,特别是在处理大型图像时。

以下是 cv::HoughLinesP 函数的基本用法:

cv::HoughLinesP(image, lines, rho, theta, threshold, minLineLength, maxLineGap);
  • image: 输入的二值图像,通常是通过边缘检测算法生成的。
  • lines: 存储检测到的直线段的容器。
  • rho: 霍夫空间中的距离分辨率。通常设置为像素。
  • theta: 霍夫空间中的角度分辨率。通常设置为弧度。
  • threshold: 用于判断线段是否检测成功的阈值。只有当线段上的点数大于等于此阈值时,才会被接受。
  • minLineLength: 最小线段长度。任何短于此长度的线段都会被忽略。
  • maxLineGap: 允许将同一线段的两个线段断开的最大距离。

cv::HoughLinesP 函数将在输入图像上执行概率霍夫直线变换,识别线段,并将检测到的线段的起始点和终止点存储在 lines 容器中。

以下是一个简单的示例,演示如何使用 cv::HoughLinesP 检测线段:

#include <opencv2/opencv.hpp>
#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

using namespace std;
using namespace cv;
#include <iostream>
#include <fstream>
using namespace cv; //包含cv命名空间
#include <opencv2/core/core.hpp>
//--【main()函数】 -//- -------- ---- -------------
// 描述: 控制台应用程序的入口函数, 我们的程序从这里开始
//.
int main()
{
	//【1】载入原始图和Mat变量定义
	Mat srcImage = imread("113.jpg"); //工程目录下应该有一张名为1. jpg的素材图
	Mat midImage, dstImage;//临时变量和目标图的定义
	//【2】进行边缘检测和转化为灰度图
	Canny(srcImage, midImage, 50, 200, 3);//进行一此 canny边缘检测
	cvtColor(midImage, dstImage, COLOR_GRAY2BGR);//转化边缘检测后的图为灰度图
	//【3】进行霍夫线变换
	vector<Vec4i> lines;//定义一个矢量结构lines用于存放得到的线段矢量集合HoughLinesP(midImage, lines, 1, CV_PI/180, 80, 50, 10 );
	//【4】依次在图中绘制出每条线段
	for (size_t i = 0; i < lines.size(); i++)
	{
		Vec4i l = lines[i];
		line(dstImage, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(186, 88, 255), 1, LINE_AA);

		//此句代码的OpenCV2版为:
	//line( dstImage, Point(1[0], 1[1]), Point(1[2], 1[3]),Scalar(186,88,255), 1, CV_AA);
	//此句代码的OpenCV3版为:
		
	}
	//【5】显示原始图
	imshow("【原始图】", srcImage);
	//【6】边缘检测后的图
	imshow("【边缘检测后的图】", midImage);
	//【7】显示效果图
	imshow("【效果图】", dstImage);
	waitKey(0);
	return 0;
}

这个示例加载了经过边缘检测的图像,然后使用 cv::HoughLinesP 函数检测线段,并在图像上绘制检测到的线段。请确保在 cv::HoughLinesP 函数中适当调整距离分辨率、角度分辨率、阈值、最小线段长度和最大线段断开距离以获得最佳的结果。
在这里插入图片描述

霍夫圆变换的函数:cv::HoughCircles

cv::HoughCircles 是OpenCV库中用于执行霍夫圆变换的函数。霍夫圆变换用于检测图像中的圆。以下是 cv::HoughCircles 函数的基本用法:

cv::HoughCircles(image, circles, cv::HOUGH_GRADIENT, dp, minDist, param1, param2, minRadius, maxRadius);
  • image: 输入的灰度图像,通常是通过边缘检测和预处理生成的。
  • circles: 存储检测到的圆的容器。
  • method: 用于检测圆的方法,通常使用 cv::HOUGH_GRADIENT
  • dp: 累加器分辨率与图像分辨率的比例。通常设置为1。
  • minDist: 检测到的圆之间的最小距离。
  • param1: Canny边缘检测的高阈值。
  • param2: 累加器阈值,用于确定检测到的圆。
  • minRadius: 允许的最小圆半径。
  • maxRadius: 允许的最大圆半径。

cv::HoughCircles 函数将在输入图像上执行霍夫圆变换,识别圆,并将检测到的圆的圆心坐标和半径存储在 circles 容器中。

以下是一个简单的示例,演示如何使用 cv::HoughCircles 检测圆:

#include <opencv2/opencv.hpp>
#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

using namespace std;
using namespace cv;
#include <iostream>
#include <fstream>
using namespace cv; //包含cv命名空间
#include <opencv2/core/core.hpp>
//----【main()函数】------ -------- -
// 描述: 控制台应用程序的入口函数, 我们的程序从这里开始
int main()
{
	//【1】载入原始图、Mat 变量定义
	Mat srcImage = imread("2144.jpg"); //工程目录下应该有一张名为1. jpg的素材图
	Mat midImage, dstImage;//临时变量和目标图的定义
	//【2】显示原始图
	imshow("【原始图】", srcImage);
	//【3】转为灰度图并进行图像平滑
	cvtColor(srcImage, midImage, COLOR_BGR2GRAY);//转化边缘检测后的图为灰度图
	GaussianBlur(midImage, midImage, Size(9, 9), 2, 2);
	//【4】进行霍夫圆变换
	vector<Vec3f> circles;
	HoughCircles(midImage, circles, HOUGH_GRADIENT, 1.5, 10, 200, 100, 0, 0);
	//【5】依次在图中绘制出圆
	for (size_t i = 0; i < circles.size(); i++)
	{
		//参数定义
		Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
		int radius = cvRound(circles[i][2]);
		//绘制圆心
		circle(srcImage, center, 3, Scalar(0, 255, 0), -1, 8, 0);
		//绘制圆轮廓
		circle(srcImage, center, radius, Scalar(155, 50, 255), 3, 8, 0);
	}
	//【6】显示效果图
	imshow("【效果图】", srcImage);
	waitKey(0);
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1079663.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

众佰诚:抖音开通橱窗的要求和流程有什么

在当下的社交媒体环境中&#xff0c;抖音作为一款短视频分享平台&#xff0c;已经吸引了大量的用户和商家。其中&#xff0c;抖音橱窗的功能使商家能够以一种更直接和吸引人的方式展示和销售他们的产品。下面&#xff0c;我们将详细介绍一下抖音橱窗的开通要求和流程。 开通要求…

SCI论文高效写作:Citespace、vosviewer和R语言在文献调研与论文撰写中的应用

文献计量学是指用数学和统计学的方法&#xff0c;定量地分析一切知识载体的交叉科学。它是集数学、统计学、文献学为一体&#xff0c;注重量化的综合性知识体系。特别是&#xff0c;信息可视化技术手段和方法的运用&#xff0c;可直观的展示主题的研究发展历程、研究现状、研究…

Unity中Shader不同灯光类型的支持与区分

文章目录 前言一、在开始之前做一些准备1、在上一篇文章的场景基础上&#xff0c;增加一个Unity默认的球体作为对照组2、创建一个点光源&#xff0c;用来看点光源的影响 对 Unity默认的Shader效果 和 我们实现的Shader效果 之间的不同 二、点光源的适配把上一篇文章中 ForwardB…

16基于otsuf方法的图像分割,程序已调通,可更换自己的图片进行分割,程序具有详细的代码注释,可轻松掌握。基于MATLAB平台,需要直接拍下。

基于otsuf方法的图像分割&#xff0c;程序已调通&#xff0c;可更换自己的图片进行分割&#xff0c;程序具有详细的代码注释&#xff0c;可轻松掌握。基于MATLAB平台&#xff0c;需要直接拍下。 16matlab图像处理图像分割 (xiaohongshu.com)

微宏科技基于 KubeSphere 的微服务架构实践

作者&#xff1a;尹珉&#xff0c;KubeSphere Ambassador、contributor&#xff0c;KubeSphere 社区用户委员会杭州站站长。 公司简介 杭州微宏科技有限公司于 2012 年成立&#xff0c;专注于业务流程管理和自动化(BPM&BPA)软件研发和解决方案供应商。创始团队毕业于浙江大…

three.js学习之vR展厅

目标 1、需要会的知识点three.js的场景&#xff0c;摄像机&#xff0c;渲染器&#xff0c;轨道控制器&#xff0c;坐标轴&#xff0c;场景适配&#xff0c;渲染循环创建立方缓冲几何体、纹理、3d物体 实现&#xff1a;创建立方几何体&#xff0c;纹理贴图镜面反向渲染&#xf…

空转旋转 seurat spatial rotate 图片 翻转 数据结构 对象 seurat的空转数据存储

1seurat 取子集操作 3. 对象操作 ① 通过结构图上的,$符号依次取 ② 两个中括号操作&#xff0c;pbmc[[ ]]。 教程中&#xff0c;pbmc[[percent.MT]]向meta.data添加 percent.MT 这一列。 pbmc[[]]&#xff0c;中括号取的是上面结构图中的二级数据名称以上两种方法的区别是&am…

《Unity Shader入门精要》笔记06

基础纹理 单张纹理纹理的属性Alpha SourceWrap ModeFilter Mode 凹凸映射高度纹理法线纹理实践在切线空间下计算在世界空间下计算 Unity中的法线纹理类型Create from Grayscale 渐变纹理遮罩纹理其他遮罩处理 单张纹理 我们通常会使用一张纹理来代替物体的漫反射颜色 Shader …

[SRT]1.协议简介

1.简介 ​ 安全可靠传输协议(Secure Reliable Transport)简称SRT&#xff0c;是一种基于UDT协议的开源互联网传输协议&#xff0c;Haivision和Wowza合作成立SRT联盟&#xff0c;管理和支持SRT协议开源应用的组织&#xff0c;这个组织致力于促进视频流解决方案的互通性&a…

041:mapboxGL移动到到某Layer上,更换鼠标形状

第041个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中通过鼠标hover的方式来更换鼠标形状。 通过mouseenter和mouseleave的方法,经过某个图层上的时候,更换鼠标的形状,从default到pointer。 离开后从pointer到default。 直接复制下面的 vue+mapbox源代码,操…

安信证券携手共议量化行业的赋能发展

9月22日&#xff0c;安信证券上海浦西分公司携手非凸科技、通联数据在上海共同开展“量化私募闭门交流会”&#xff0c;与资方管理人就如何赋能量化私募可持续发展&#xff0c;给出了精彩纷呈的见解与讨论。 安信证券以“打造数字化券商”为目标&#xff0c;加强科技创新与业务…

数据库常见面试题--MySQL

梳理面试过程中数据库相关的常见问题&#xff0c;需要说明的是&#xff0c;这篇文章主要是基于MySQL数据库&#xff0c;其他类型的数据库还请自行参考使用。 数据库概述 为什么使用数据库 1、数据库增删改查更方便 2、提供了事务的能力 本质是更好的管理数据。 数据库体系结…

Android rtmp 低延迟直播方案:简介

Android rtmp 低延迟直播方案:简介 Android RTMP 低延迟直播方案:使用 RTMP 推送至 ZLMediaKit,通过 WebRTC 进行拉流。

会展购票系统有哪些特点?如何选择好的会展购票系统开发公司

会展购票系统是会展行业的重要组成部分&#xff0c;它具有提高会展业务流程运转效率、业务操作方便快捷、降低人工成本等优势。如开利网络自主研发的会展购票系统就有以下几个特点&#xff1a; 1. 拥有多端开发能力。除了电脑端外&#xff0c;还可以开发微信小程序端、公众号端…

不说废话,推荐一款超实用免费配音软件~

短视频发展如火如荼&#xff0c;在制作编辑视频的同时&#xff0c;文字转语音的需求也越来越大&#xff0c;例如解说配音、旁白配音、vlog配音等&#xff0c;今天就给大家推荐一款超实用的免费配音软件&#xff0c;感兴趣的小伙伴请接着往下看&#xff01; 一、悦音AI配音&…

语音芯片的“等级”之分

语音芯片&#xff0c;你或许不晓得这个“芯”也是有高低之分&#xff0c;你可能听说过手机“发烧级”高性能芯片&#xff0c;同样在语音芯片中存在着性能不同等级的语音芯片。一般我们将普通芯片主要分为3个等级&#xff1a;商业级&#xff08;又称民用级&#xff09;、工业级和…

在Scrum敏捷开发中,开发人员(Developers)的职责

在Scrum敏捷开发中&#xff0c;开发人员&#xff08;Developers&#xff09;是Scrum团队中最重要的角色之一&#xff0c;负责产品的开发和交付&#xff0c;其重要性不言而喻。 那开发人员的职责和需要参加的活动是什么呢&#xff1f; Developers核心职责&#xff1a; 承诺并完…

【外汇天眼】不工作只做交易?探索不平凡的生活

金融界曾有一句广为流传的名言——"富人做债券&#xff0c;中产做股票&#xff0c;穷人做期货外汇"。这并非因为穷人特别热爱期货和外汇交易&#xff0c;而是因为他们更渴望通过杠杆交易在短期内实现财富梦想。如果一个人不愿意或没有技能去工作&#xff0c;但精通交…

Lambda 表达式使用详解,一篇文章手把手教会你

目录 1. Lambda 表达式有什么用&#xff1f; 2. 匿名内部类举例 3. Lambda 表达式的标准格式与使用 4. Lambda 表达式使用注意点 5. 什么是函数式接口&#xff1f; 6. Lambda 表达式的省略写法 7. Lambda 表达式省略写法简单展示 1. Lambda 表达式有什么用&#xff1f; …

LeetCode【394】字符串解码

题目&#xff1a; 思路&#xff1a; 参考&#xff1a;https://blog.csdn.net/xushiyu1996818/article/details/107973300 代码&#xff1a; public String decodeString(String s){Deque<Character> stack new ArrayDeque<>();for(char c :s.toCharArray()){if…