OpenCV检测圆形东西是否存在缺口?

文章目录

  • 前言
  • 一、试过的方法
  • 二、最终使用的方法
    • 1.先极坐标变换
    • 2.计算斜率
  • 总结


前言

在这里插入图片描述

想了挺久,一直没解决这个问题。后面勉强解决了。


一、试过的方法

1.想用圆度来解决,后来发现圆度差值很小,完整的圆圆度0.89,然后有缺角的圆圆度0.88。
2.想用面积来解决,但是图片中每个圆大小不是一致的,是有一些差别的,也没办法。
3.多边形拟合、凸包都不合适。
4.想使用角点的数量来确定,发现也是不行。看下图
在这里插入图片描述
在这里插入图片描述

二、最终使用的方法

1.先极坐标变换

代码如下(示例):

import cv2
import os# 设置文件夹路径
folder_path = r"E:\VSCODE_PY\CAPCode\Posong\cap_2"# 遍历文件夹中的图像文件
for file_name in os.listdir(folder_path):if file_name.endswith(".jpg"):# 读取图像并转换为灰度图像image_path = os.path.join(folder_path, file_name)image = cv2.imread(image_path)gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 进行极坐标变换polar_image = cv2.linearPolar(gray, (gray.shape[1]//2, gray.shape[0]//2), gray.shape[1]//2+10, cv2.WARP_FILL_OUTLIERS)# 进行边缘检测edges = cv2.Canny(polar_image, 50, 150)# 保存处理后的图像output_path = os.path.join(folder_path, "polar_" + file_name)cv2.imwrite(output_path, polar_image)

极坐标的中心点可以根据实际情况设置一下。

2.计算斜率

代码如下(示例):
在这里插入图片描述

import os
import cv2
import numpy as np# 设置最小间距阈值
min_distance = 10# 遍历cap_8文件夹内的所有图片
for filename in os.listdir(r'E:\VSCODE_PY\CAPCode\Posong\cap_8'):if filename.endswith('.jpg'):# 读取图像并进行灰度化处理image = cv2.imread(os.path.join(r'E:\VSCODE_PY\CAPCode\Posong\cap_8', filename))gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 进行边缘检测edges = cv2.Canny(gray, 50, 150)# 查找轮廓contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)# 创建一个空白图像,用于绘制轮廓contour_image = np.zeros_like(image)# 绘制轮廓cv2.drawContours(contour_image, contours, -1, (0, 255, 0), 2)# 查找角点corners = cv2.cornerHarris(gray, 2, 3, 0.04)# 标记角点threshold = 0.45 * corners.max()  # 调整阈值corners = cv2.dilate(corners, None)image[corners > threshold] = [0, 0, 255]# 计算任意两个角点之间的斜率corner_points = np.argwhere(corners > threshold)slopes = []for i in range(len(corner_points)):for j in range(i+1, len(corner_points)):x1, y1 = corner_points[i]x2, y2 = corner_points[j]distance = np.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2)if distance >= min_distance:if x2 - x1 == 0:slope = float('inf')else:slope = (y2 - y1) / (x2 - x1)slopes.append(slope)# 处理无穷大和无穷小的情况slopes = [slope for slope in slopes if slope != float('inf') and slope != float('-inf')]slopes.sort()# 输出最大斜率和最小斜率的绝对值if len(slopes) >= 2:max_slope = max(abs(slopes[-2]), abs(slopes[1]))min_slope = min(abs(slopes[-2]), abs(slopes[1]))else:max_slope = float('-inf')min_slope = float('inf')print("图片{}的最大斜率的绝对值:".format(filename), max_slope)print("图片{}的最小斜率的绝对值:".format(filename), min_slope)# 显示结果cv2.imshow('Contours with Corners', image)cv2.waitKey(0)cv2.destroyAllWindows()

角点稍微多,要先设置一下任意2个角点的斜率必须大于最小间距。
这样可以求出每一张图片的斜率绝对值最大和最小值,即看下凸起部分是不是影响到了曲线的斜率。


总结

完成。

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

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

相关文章

二十七、微服务案例

目录 一、实现输入搜索功能 1、下载代码,在idea上打开 2、新建RequestParams类,用于接收解析请求 3、在启动类中加入客户端地址Bean,以便实现服务 4、编写搜索方法 5、新建返回分页结果类 6、实现搜索方法 7、编写控制类,…

4.前端--HTML标签-表格列表表单【2023.11.25】

1.表格 1.1表格的作用 表格的作用&#xff1a;表格主要用于显示、展示数据 1.2表格的基本格式 <table><tr><td>单元格内的文字</td><td>单元格内的文字</td>...</tr>... </table><table> </table> 是用于定义表…

【RTP】3: RTPSenderVideo::SendVideo 切片到发送

m98 版本。之前1 2 都是m79.RTPSenderVideo::SendVideo 负责切片,是入口 实际发送要靠: RTPSender* const rtp_sender_; 外部传递的: rtp_rtcp\source\rtp_sender.h 实现了rtp rtcp协议 ,负责实际的打包 新增了一个 TransformableFrameInterface 用的 编码线程 - RTPSend…

Windows开启SQL Server服及1433端口

需求&#xff1a;Windows开启SQL Server服务及1433端口 目前端口没有启动 解决&#xff1a; 打开SQL Server配置管理器&#xff08;winR&#xff09; 各个sqlserver版本在textbox中输入对应的命令如下&#xff1a; SQLServerManager15.msc&#xff08;对于 SQL Server 2019 &am…

⑨【Stream】Redis流是什么?怎么用?: Stream [使用手册]

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ ⑨Redis Stream基本操作命令汇总 一、Redis流 …

Qt 信号与槽简介

Qt是一个跨平台的C应用程序开发框架&#xff0c;它提供了丰富的功能和工具来帮助开发者构建高质量、高性能的GUI应用程序。在Qt中&#xff0c;信号与槽&#xff08;Signal and Slot&#xff09;机制是一种用于处理事件的重要特性。 信号&#xff08;Signal&#xff09;&#xf…

Linux7安装mysql数据库以及navicat远程连接mysql

1.下载地址&#xff1a;MySQL :: Download MySQL Community Server 2.创建mysql目录将压缩包上传到该目录 mkdir /opt/mysql cd /opt/mysql3.解压压缩包 gzip mysql-8.1.0-1.el7.x86_64.rpm-bundle.tar tar -zxvf mysql-8.1.0-1.el7.x86_64.rpm-bundle.tar.gz 4.前置检查 ch…

电子学会C/C++编程等级考试2021年09月(三级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:余数相同问题 已知三个正整数 a,b,c。 现有一个大于1的整数x,将其作为除数分别除a,b,c,得到的余数相同。 请问满足上述条件的x的最小值是多少? 数据保证x有解。输入: 一行,三个不大于1000000的正整数a,b,c,两个整数…

Windows TCP 通信测试_1

一、单对单通信测试 应用函数 socket、bind、connect、listen、accept、recv、send&#xff08;win下的函数&#xff09;等 1、客户端demo client.cpp #include<WINSOCK2.H> #include<STDIO.H> #include<iostream> #include<cstring> using namespa…

nodejs+vue+python+PHP+微信小程序-婚纱摄影预约系统的设计与实现-安卓-计算机毕业设计

本婚纱摄影预约系统主要包括个人中心、套系风格管理、用户管理、摄影师管理、婚纱套系管理、婚纱套系订单管理、客片欣赏管理、客户样片管理、摄影咨询管理、客户选片管理、系统管理等多个模块。它帮助婚纱摄影预约实现了信息化、网络化&#xff0c;通过测试&#xff0c;实现了…

Python模块的导入

一、模块的定义 模块就是一个Python代码文件&#xff0c;内含类、函数、变量等&#xff0c;我们可以导入 二、如何导入模块 [from 模块名] import [ 模块 | 类 | 变量 | 函数 | *] [as 别名] 示例 1.使用import导入time模块使用sleep功能&#xff08;函数&#xff0…

基于jmeter的性能全流程测试

做性能测试的步骤 1、服务器性能监控 首先要在对应服务器上面安装性能监控工具&#xff0c;比如linux系统下的服务器&#xff0c;可以选择nmon或者其他的监控工具&#xff0c;然后在jmeter模拟场景跑脚本的时候&#xff0c;同时启动监控工具&#xff0c;这样就可以获得jmeter…

2311skia,06编解码图像上

1,API和自注册机制 Skia中只需要一行代码就可编解码图片: SkBitmap bitmap; SkImageDecoder::DecodeFile("test.xxx", &bitmap);//按文件名解码,自动推导图片类型//或按流解码 SkFILEStream stream("test.xxx"); SkImageDecoder::DecodeStream(strea…

Android之高级UI

系统ViewGroup原理解析 常见的布局容器: FrameLayout, LinearLayout,RelativeLayoout,GridLayout 后起之秀&#xff1a;ConstraintLayout,CoordinateLayout Linearlayout Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {if (mOrientation …

STK Components 二次开发-地面站传感器

上一篇我们说了创建地面站&#xff0c;那么这次我们在地面站添加一些特效。 1. 创建地面站 var locationPoint1 new PointCartographic(m_earth, new Cartographic(Trig.DegreesToRadians(117.17066), Trig.DegreesToRadians(31.84056), 240.359)); m_facility new Platfor…

【论文解读】Real-ESRGAN:使用纯合成数据训练真实世界的超分辨率图像

图一是4种超分方法的对比效果 。 0 摘要 尽管在盲超分辨率方面已经进行了许多尝试&#xff0c;以恢复具有未知和复杂退化的低分辨率图像&#xff0c;但它们仍然远远不能解决一般的真实世界退化图像。在这项工作中&#xff0c;我们将强大的 ESRGAN 扩展到一个实际的恢复应用程序…

Retrofit怎么返回一个JSON字符串?

项目用已经使用了 Retrofit&#xff0c;定义了接口方法&#xff0c;返回了 JSON 转换后的实体对象&#xff0c;炒鸡方便。但是总有意料之外的时候&#xff0c;比如我不需要返回实体对象&#xff0c;我要返回纯纯的 JSON 字符串&#xff0c;怎么办呢&#xff1f; 先看源码 通过…

什么是半监督学习

1 概述 1.1 定义 半监督学习&#xff08;Semi-Supervised Learning&#xff09;是机器学习中的一个重要分支&#xff0c;它介于监督学习和无监督学习之间。半监督学习利用少量标注数据和大量未标注数据共同训练模型&#xff0c;旨在充分挖掘未标注数据中潜在的信息和模式&…

git stash命令详解

git stash 工作区和暂存区的内容是公共的&#xff0c;不属于任何一个分支 所以在切换分支的时候务必保证工作区是干净的&#xff0c;否则切换过去的时候会导致那个分支也被修改了 如果不想add和commit&#xff0c;那可以用git stash将工作现场暂存一下 需要注意的是&#x…

【数据库】缓冲区管理器结构,几种常用替换策略分析,pin钉住缓冲区块防止错误的替换,以及缓冲区管理带来的代价优化

缓冲区管理 ​专栏内容&#xff1a; 手写数据库toadb 本专栏主要介绍如何从零开发&#xff0c;开发的步骤&#xff0c;以及开发过程中的涉及的原理&#xff0c;遇到的问题等&#xff0c;让大家能跟上并且可以一起开发&#xff0c;让每个需要的人成为参与者。 本专栏会定期更新&…