OpenCV_Code_LOG

孔洞填充

void fillHole(const Mat srcBw, Mat &dstBw)
{Size m_Size = srcBw.size();Mat Temp=Mat::zeros(m_Size.height+2,m_Size.width+2,srcBw.type());//延展图像srcBw.copyTo(Temp(Range(1, m_Size.height + 1), Range(1, m_Size.width + 1)));cv::floodFill(Temp, Point(0, 0), Scalar(255,255,255));Mat cutImg;//裁剪延展的图像Temp(Range(1, m_Size.height + 1), Range(1, m_Size.width + 1)).copyTo(cutImg);dstBw = srcBw | (~cutImg);
}
fillHole(ThrImg, ThrImg);
https://blog.csdn.net/wangyaninglm/article/details/47701047?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0-47701047-blog-128034901.235^v43^pc_blog_bottom_relevance_base5&spm=1001.2101.3001.4242.1&utm_relevant_index=3

在这里插入图片描述



转换

16位转8位

cvtColor(OpenImage,OpenImage,COLOR_BGR2GRAY);

字符串转换

std::to_string(i)

 //生成随机颜色,用于区分不同连通域RNG rng(10086);Mat out;int number=connectedComponents(OpenImage,out,8,CV_16U);//统计图像连通域的个数vector<Vec3b>colors;for(int i=0;i<number;++i){//使用均匀分布的随机确定颜色Vec3b vec3=Vec3b(rng.uniform(0,256),rng.uniform(0,256),rng.uniform(0,256));colors.push_back(vec3);}//以不同颜色标记出不同的连通域Mat result=Mat::zeros(OpenImage.size(),SrcImage_1.type());int w=result.cols;int h=result.rows;for(int row=0;row<h;++row){for(int col=0;col<w;++col){int label=out.at<uint16_t>(row,col);if(label==0){//背景的黑色不改变continue;}result.at<Vec3b>(row,col)=colors[label];}}imshow("标记后的图像",result);

请添加图片描述

https://blog.csdn.net/qq_33287871/article/details/112691790

图像混合:

float alpha=0.5; Mat MixImage;
addWeighted(ConnectImg, alpha, SrcImage_1, 1 - alpha, 0, MixImage);

在这里插入图片描述

中值滤波(去二值化图像毛刺):

medianBlur(ConnectImg,ConnectImg,9);

在这里插入图片描述

https://ask.csdn.net/questions/375741

霍夫直线检测

//1、边缘检测
Canny(ConnectImg, CanImg, position, 255, 3);
imshow("CanImg", CanImg);vector<Vec4i> lines; // 存储检测到的直线
HoughLinesP(CloseImage, lines, 1, CV_PI / 180, 80, 30, 10); // 应用霍夫直线检测算法,输入图像必须是边缘检测后的图像 因为它需要的是边缘信息或者梯度信息来找到线段。
for (size_t i = 0; i < lines.size(); i++)
{Vec4i l = lines[i];line(SrcImage_1, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(0, 0, 255), 3, LINE_AA); //直线必须画在三通道的RGB图像中
}
imshow("HoughSrcImage_1", SrcImage_1);

LSD直线检测
在这里插入图片描述


方法一:

#include <iostream>
#include <string>
#include "opencv2/core/core.hpp"
#include "opencv2/core/utility.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui/highgui.hpp"//1、边缘检测
Canny(ConnectImg, CanImg, 0, 255, 3);
imshow("CanImg", CanImg);Ptr<LineSegmentDetector> LS=createLineSegmentDetector(LSD_REFINE_STD); 
vector<Vec4f>lines_LSD;
LS->detect(CanImg,lines_LSD);
Mat drawLSDlines(CanImg);
LS->drawSegments(drawLSDlines,lines_LSD);
imshow("LSD",drawLSDlines);

在这里插入图片描述

方法二:

Ptr<LineSegmentDetector> detector = createLineSegmentDetector();vector<Vec4f> lines;
detector->detect(CanImg,lines);Mat resultLSD(CanImg.size(),CV_8UC3,Scalar(0, 0, 0));Scalar color(0,0,255);
int thickness = 1;
cout<<"lines.size : "<<lines.size();
for(int i=0; i<lines.size(); i++)
{Point start(static_cast<int>(lines[i][0]), static_cast<int>(lines[i][1]));Point end(static_cast<int>(lines[i][2]), static_cast<int>(lines[i][3]));line(resultLSD, start, end, color, thickness);
}
imshow("resultLSD", resultLSD);

点距离直线筛选(检查直线是否与圆相交)

在这里插入图片描述

bool isLineIntersectsCircle(const Vec4i& line, const Point& circleCenter, int circleRadius) {Point start(line[0], line[1]);Point end(line[2], line[3]);// 使用点到直线距离来判断是否相交double dist = pointToLineDistance(circleCenter, start, end);if (dist <= circleRadius) {return true;}// 补充:检查圆心是否在直线上(重要!)double dotProduct = ((end.x - start.x) * (circleCenter.x - start.x) + (end.y - start.y) * (circleCenter.y - start.y));double squaredLength = (end.x - start.x) * (end.x - start.x) + (end.y - start.y) * (end.y - start.y);if (squaredLength != 0) {double param = dotProduct / squaredLength;if (param >= 0 && param <= 1) {Point closestPoint;closestPoint.x = start.x + param * (end.x - start.x);closestPoint.y = start.y + param * (end.y - start.y);double distanceFromCenter = norm(circleCenter - closestPoint); //计算圆心到最近点的距离if (distanceFromCenter <= circleRadius) {return true;}}}return false;
}

函数调用:

   Point circleCenter1(140, 135); // 替换为你的圆心坐标(别忘了你图像缩小了6倍)Point circleCenter2(690, 72); // 替换为你的圆心坐标int circleRadius =60;//  使用 std::vector<int> 来存储与圆相交的第一条直线std::vector<int> intersectingLineIndices;for (size_t i = 0; i < extendedLines.size(); ++i) {if (isLineIntersectsCircle(extendedLines[i], circleCenter1, circleRadius)) {intersectingLineIndices.push_back(i);break; // 找到一条后立即退出循环,避免继续查找}}// 检验是否存在相交线if (!intersectingLineIndices.empty()) {int index = intersectingLineIndices[0];line(SrcImage_1, Point(extendedLines[index][0], extendedLines[index][1]),Point(extendedLines[index][2], extendedLines[index][3]), Scalar(0, 0, 255), 2);std::cout << "Found intersecting line at index " << index << std::endl;}else {std::cout << "No intersecting line found." << std::endl;}

直线交点探测(指定坐标下延长直线探测与其相交的直线)

cv::Point findIntersection(const cv::Vec4i& line1, const cv::Vec4i& line2) {double x1 = line1[0], y1 = line1[1], x2 = line1[2], y2 = line1[3];double x3 = line2[0], y3 = line2[1], x4 = line2[2], y4 = line2[3];double den = (y4 - y3) * (x2 - x1) - (x4 - x3) * (y2 - y1);// Check for parallel lines (or nearly parallel)if (std::abs(den) < 1e-6) {return cv::Point(-1, -1); // No intersection or nearly parallel}double ua = ((x4 - x3) * (y1 - y3) - (y4 - y3) * (x1 - x3)) / den;double ub = ((x2 - x1) * (y1 - y3) - (y2 - y1) * (x1 - x3)) / den;// Check if intersection point lies within both line segmentsif (ua >= 0 && ua <= 1 && ub >= 0 && ub <= 1) {double x = x1 + ua * (x2 - x1);double y = y1 + ua * (y2 - y1);// qDebug()<<"x = " <<x<<"y = " <<y;return cv::Point(static_cast<int>(x + 0.5), static_cast<int>(y + 0.5)); //Adding 0.5 for proper rounding} else {return cv::Point(-1, -1); // No intersection within line segments}
}double dist(const Point& p1, const Point& p2) {return sqrt(pow(p1.x - p2.x, 2) + pow(p1.y - p2.y, 2));
}Vec4i findClosestIntersectingLine(const vector<Vec4i>& extendedLines, const Point& center, const Vec4i& horizontalLine, const Mat& image) {Vec4i closestLine;double minDist = numeric_limits<double>::max();for (const auto& extLine : extendedLines) {Point intersection = findIntersection(extLine, horizontalLine);if (intersection.x != -1 && intersection.y != -1) {double d = dist(intersection, center);if (d < minDist) {minDist = d;closestLine = extLine;}}}return closestLine;
}Vec4i findClosestIntersectingLine(const vector<Vec4i>& extendedLines, const Point& center, const Vec4i& verticalLine) {Vec4i closestLine;double minDist = std::numeric_limits<double>::max();for (const auto& extLine : extendedLines) {Point intersection = findIntersection(verticalLine, extLine);if (intersection.x != -1 && intersection.y != -1) {double dist = norm(intersection - center);if (dist < minDist) {minDist = dist;closestLine = extLine;}}}return closestLine;
}
 vector<Vec4i> extendedLines;for (size_t i = 0; i <lines_HLP.size() ; i++){Vec4i l = lines_HLP[i];Vec4i extendedLine;//延长直线extendLine(l, 500, extendedLine); // 延长 50 像素 独立的函数extendedLines.push_back(extendedLine);line(CanImg, Point(extendedLine[0], extendedLine[1]), Point(extendedLine[2], extendedLine[3]), Scalar(0, 255, 255), 1, LINE_AA);//line(CanImg, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(0, 255, 255), 2, LINE_AA); //直线必须画在三通道的RGB图像中}imshow("extendedLine", CanImg);Point circleCenter1(140, 135); // 替换为你的圆心坐标(别忘了你图像缩小了8倍)Point circleCenter2(561, 128); // 替换为你的圆心坐标line(SrcImage_1, Point(circleCenter1.x, 0), Point(circleCenter1.x, SrcImage_1.rows), Scalar(0, 0 ,255), 2); // 绘制红色垂直线line(SrcImage_1, Point(0, circleCenter1.y), Point(SrcImage_1.cols,circleCenter1.y), Scalar(0, 0 ,255), 2); // 绘制红色垂直线line(SrcImage_1, Point(circleCenter2.x, 0), Point(circleCenter2.x, SrcImage_1.rows), Scalar(255, 0 ,255), 2); // 绘制红色垂直线line(SrcImage_1, Point(0, circleCenter2.y), Point(SrcImage_1.cols,circleCenter2.y), Scalar(255, 0 ,255), 2); // 绘制红色垂直线Vec4i verticalLine = Vec4i(circleCenter1.x, 0, circleCenter1.x, SrcImage_1.rows);Vec4i horizonLine = Vec4i(0, circleCenter2.y, SrcImage_1.cols, circleCenter2.y);line(CanImg, Point(horizonLine[0], horizonLine[1]), Point(horizonLine[2], horizonLine[3]), Scalar(255, 255, 0), 1);Vec4i closestLineA = findClosestIntersectingLine(extendedLines, circleCenter1,verticalLine);Vec4i closestLineB = findClosestIntersectingLine(extendedLines, circleCenter2,horizonLine);line(SrcImage_1, Point(closestLineA[0], closestLineA[1]), Point(closestLineA[2], closestLineA[3]), Scalar(0, 255, 0), 2, LINE_AA);line(SrcImage_1, Point(closestLineB[0], closestLineB[1]), Point(closestLineB[2], closestLineB[3]), Scalar(0, 255, 0), 2, LINE_AA);

在这里插入图片描述


相似斜率直线拟合(将斜率相近的几条直线分组并拟合成一条直线)

// 定义一个结构体来存储直线信息,方便后续处理
struct LineInfo {double k; // 斜率double b; // 截距Vec4i line; // 原直线段
};vector<Vec4i> fitOverlappingLines(const vector<Vec4i>& extendedLines, double slopeThreshold) {vector<LineInfo> linesInfo;for (const auto& line : extendedLines) {double x1 = line[0];double y1 = line[1];double x2 = line[2];double y2 = line[3];if (abs(x2 - x1) < 1e-6) { // 垂直线linesInfo.push_back({1e9, x1, line});} else {double k = (y2 - y1) / (x2 - x1);double b = y1 - k * x1;linesInfo.push_back({k, b, line});}}vector<Vec4i> fittedLines;vector<bool> used(linesInfo.size(), false);for (size_t i = 0; i < linesInfo.size(); ++i) {if (used[i]) continue;vector<LineInfo> group;group.push_back(linesInfo[i]);used[i] = true;for (size_t j = i + 1; j < linesInfo.size(); ++j) {if (used[j]) continue;// 关键判断:斜率接近且重合部分足够长if (abs(linesInfo[i].k - linesInfo[j].k) < slopeThreshold &&// 这里增加重合判断(例如,两个直线段的端点是否足够接近)((abs(linesInfo[i].line[0] - linesInfo[j].line[0]) < 10) && (abs(linesInfo[i].line[1] - linesInfo[j].line[1]) < 10) || (abs(linesInfo[i].line[2] - linesInfo[j].line[2]) < 10) && (abs(linesInfo[i].line[3] - linesInfo[j].line[3]) < 10))) {group.push_back(linesInfo[j]);used[j] = true;}}if (group.size() > 0) {// 计算所有group内直线的平均斜率和截距,用于拟合double sumX = 0, sumY = 0, n = group.size();for (const auto& lineInfo : group) {sumX += (lineInfo.line[0] + lineInfo.line[2]);sumY += (lineInfo.line[1] + lineInfo.line[3]);}double avgX = sumX / (2 * n);double avgY = sumY / (2 * n);double avg_k = 0;double avg_b = 0;for(const auto& lineInfo : group){avg_k = lineInfo.k;avg_b = lineInfo.b;}int x1 = 0;int y1 = static_cast<int>(avg_k * x1 + avg_b);int x2 = 666;int y2 = static_cast<int>(avg_k * x2 + avg_b);fittedLines.push_back({x1, y1, x2, y2});}}return fittedLines;
}
 vector<Vec4i> fittedLines = fitOverlappingLines(extendedLines, 0.1);for(const auto& lineFT : fittedLines){line(SrcImage_1, Point(lineFT[0], lineFT[1]), Point(lineFT[2], lineFT[3]), Scalar(0, 255, 0), 2, LINE_AA);}imshow("FitImg", SrcImage_1);

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

YOLOv11改进,YOLOv11添加SAConv可切换空洞卷积,二次创新C3k2结构

摘要 作者提出的技术结合了递归特征金字塔和可切换空洞卷积,通过强化多尺度特征学习和自适应的空洞卷积,显著提升了目标检测的效果。 理论介绍 空洞卷积(Atrous Convolution)是一种可以在卷积操作中插入“空洞”来扩大感受野的技术,更有效地捕捉到图像中的大范围上下文…

2024信创数据库TOP30之华为Gauss DB

近日&#xff0c;由DBC联合CIW/CIS共同发布的“2024信创数据库TOP30”榜单正式揭晓&#xff0c;汇聚了国内顶尖的数据库企业及其产品&#xff0c;成为展示中国信创领域技术实力与发展潜力的重要平台。在这份榜单中&#xff0c;华为的GaussDB凭借其卓越的技术实力、广泛的行业应…

【Spring源码核心篇-07】spring事物传播机制的流程和原理

Spring源码核心篇整体栏目 内容链接地址【一】Spring的bean的生命周期https://zhenghuisheng.blog.csdn.net/article/details/143441012【二】深入理解spring的依赖注入和属性填充https://zhenghuisheng.blog.csdn.net/article/details/143854482【三】精通spring的aop的底层原…

Redis实现限量优惠券的秒杀

核心&#xff1a;避免超卖问题&#xff0c;保证一人一单 业务逻辑 代码步骤分析 全部代码 Service public class VoucherOrderServiceImpl extends ServiceImpl<VoucherOrderMapper, VoucherOrder> implements IVoucherOrderService {Resourceprivate ISeckillVoucher…

.NET8/.NETCore 依赖注入:自动注入项目中所有接口和自定义类

.NET8/.NETCore 依赖接口注入&#xff1a;自动注入项目中所有接口和自定义类 目录 自定义依赖接口扩展类&#xff1a;HostExtensions AddInjectionServices方法GlobalAssemblies 全局静态类测试 自定义依赖接口 需要依赖注入的类必须实现以下接口。 C# /// <summary>…

搭建一个基于Web的文档管理系统,用于存储、共享和协作编辑文档

搭建一个基于Web的文档管理系统&#xff0c;用于存储、共享和协作编辑文档 本项目采用以下架构&#xff1a; NFS服务器: 负责存储文档资料。Web服务器: 负责提供文档访问和编辑功能。SELinux: 负责权限控制&#xff0c;确保文档安全。Git服务器: 负责存储文档版本历史&#x…

gitee:创建仓库,存入本地文件至仓库

一、git下载 git:下载与安装-CSDN博客https://blog.csdn.net/weixin_46001736/article/details/144107485?sharetypeblogdetail&sharerId144107485&sharereferPC&sharesourceweixin_46001736&spm1011.2480.3001.8118 二、创建仓库 1、主页面->右上角新增…

计算机网络 —— HTTP 协议(详解)

前一篇文章&#xff1a;网页版五子棋—— WebSocket 协议_网页可以实现websocket吗-CSDN博客 目录 前言 一、HTTP 协议简介 二、HTTP 协议格式 1.抓包工具的使用 2.抓包工具的原理 3.抓包结果 4.HTTP协议格式总结 三、HTTP 请求 1. URL &#xff08;1&#xff09;UR…

关于单片机的原理与应用!

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///计算机爱好者&#x1f60a;///目前正在学习C&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于单片…

爬虫专栏第一篇:深入探索爬虫世界:基础原理、类型特点与规范要点全解析

本专栏会对爬虫进行从0开始的讲解&#xff0c;每一步都十分的细致&#xff0c;如果你感兴趣希望多多点赞收藏关注支持 简介&#xff1a;文章对爬虫展开多方面剖析。起始于爬虫的基本概念&#xff0c;即依特定规则在网络抓取信息的程序或脚本&#xff0c;在搜索引擎信息提取上作…

rabbitmq原理及命令

目录 一、RabbitMQ原理1、交换机&#xff08;Exchange&#xff09;fanoutdirecttopicheaders&#xff08;很少用到&#xff09; 2、队列Queue3、Virtual Hosts4、基础对象 二、RabbitMQ的一些基本操作:1、用户管理2、用户角色3、vhost4、开启web管理接口5、批量删除队列 一、Ra…

@antv/x6 再vue中 ,自定义图形,画流程图、数据建模、er图等图形

X6 是基于 HTML 和 SVG 的图编辑引擎&#xff0c;提供低成本的定制能力和开箱即用的内置扩展&#xff0c;方便我们快速搭建 DAG 图、ER 图、流程图、血缘图等应用。 最终效果图 1.安装 npm install antv/x6 --save //x6主要包 npm install antv/x6-vue-shape //使用vue组…

vscode + conda + qt联合开发

安装vscode 安装conda 清华大学开源软件镜像(Anaconda下载)_清华大学镜像-CSDN博客 conda create新建一个环境&#xff0c;激活这个环境&#xff0c;然后安装pyside6 pip install pyside6 -i https://pypi.tuna.tsinghua.edu.cn/simple 安装成功后输入 pip list查看是否安装…

debian 11 虚拟机环境搭建过坑记录

目录 安装过程系统配置修改 sudoers 文件网络配置换源安装桌面mount nfs 挂载安装复制功能tab 无法补全其他安装 软件配置eclipse 配置git 配置老虚拟机硬盘挂载 参考 原来去 debian 官网下载了一个最新的 debian 12&#xff0c;安装后出现包依赖问题&#xff0c;搞了半天&…

WPF DataGrid 列隐藏

Window节点加上下面的 <Window.Resources><FrameworkElement x:Key"ProxyElement" DataContext"{Binding}" /></Window.Resources>然后随便加一个隐藏控件 <ContentControl Content"{StaticResource ProxyElement}" Visi…

【实体配置】.NET开源 ORM 框架 SqlSugar 系列

.NET开源 ORM 框架 SqlSugar 系列 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列【Code First】.NET开源 ORM 框架 SqlSugar 系列【数据事务…

手机卡限速丨中国移动5G变3G,网速500kb

以下猜测错误&#xff0c;又有新的猜测&#xff1a;河南移动的卡出省限速。可能是因为流量结算。 “2024年7月1日起&#xff0c;中国移动集团内部将开启跨省流量结算” 在深圳四五年了&#xff0c;之前没有过&#xff0c;就从上个月开始。11月底解除限速&#xff0c;12月刚开…

不同云计算网络安全等级

导读云计算的本质是服务&#xff0c;如果不能将计算资源规模化/大范围的进行共享&#xff0c;如果不能真正以服务的形式提供&#xff0c;就根本算不上云计算。 等级保护定级流程 定级是开展网络安全等级保护工作的 “基本出发点”&#xff0c;虚拟化技术使得传统的网络边界变…

【python】OpenCV—Tracking(10.5)—dlib

文章目录 1、功能描述2、代码实现3、效果展示4、完整代码5、涉及到的库函数dlib.correlation_tracker() 6、参考 1、功能描述 基于 dlib 库&#xff0c;实现指定类别的目标检测和单目标跟踪 2、代码实现 caffe 模型 https://github.com/MediosZ/MobileNet-SSD/tree/master/…

通义灵码走进北京大学创新课堂丨阿里云云原生 10 月产品月报

云原生月度动态 云原生是企业数字创新的最短路径。 《阿里云云原生每月动态》&#xff0c;从趋势热点、产品新功能、服务客户、开源与开发者动态等方面&#xff0c;为企业提供数字化的路径与指南。 趋势热点 &#x1f947; 通义灵码走进北京大学创新课堂&#xff0c;与 400…