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.hqwc.cn/news/221876.html

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

相关文章

初学vue3与ts:setup与setup()下的数据写法

把setup写在script里 <template><div><div class"index-title">script setup</div><div class"title">字符串&#xff1a;</div><div class"title-sub">ref版&#xff1a;{{strRef}}</div><…

Vue3挂载完毕后,隐藏dom再重新加载组件的方法

组件原本是在PC端使用的&#xff0c;现在需要把组件再封装一次&#xff0c;供app调用&#xff0c;但是在app上会显示tag栏&#xff0c;有占位影响空间&#xff0c;所以需求去掉头部tag&#xff0c;只显示下方组件。 实现方法&#xff0c;以前是直接引用的组件&#xff0c;现在改…

minio客户端基本操作

minio客户端基本操作 桶 创建桶 如果要创建新的桶 输入名称&#xff0c;点击创建即可&#xff0c;默认权限就行 删除桶 点击要删除的桶 点击删除 修改桶 如果哪天需要修改桶的权限或者其他信息&#xff0c;还是先点击这个桶进入详情 然后点击要修改的属性&#xff0c;选择…

活动回顾|阿里云云原生 Serverless 技术实践营 深圳站回放PPT下载

11月24日“阿里云云原生 Serverless 技术实践营”深圳站圆满落幕。活动受众以关注 Serverless 技术的开发者、企业决策人、云原生领域创业者为主&#xff0c;活动形式为演讲、动手实操&#xff0c;让开发者通过一个下午的时间增进对 Serverless 技术的理解&#xff0c;快速上手…

Fuzz进阶教学——人工智能在模糊测试中的应用

【参考文献】白海波.人工智能技术在模糊测试中的应用[J].数字技术与应用,2023,41(08):16-18.DOI:10.19695/j.cnki.cn12-1369.2023.08.05. 目录 摘要 一、模糊测试简介 1、原理 2、工作流程 3、分类 4、应用领域 二、人工智能在模糊测试中的应用 1、人工智能技术 2、人…

内衣洗衣机怎么选?内衣洗衣机便宜好用的牌子推荐

相信不少用户并不太在意衣服和内衣裤裤能不能同时洗&#xff0c;每次清洗都是把内衣裤与其他衣服一起放入洗衣机清洗&#xff0c;其实内衣裤不能直接跟大件的衣物一起放入洗衣机洗的&#xff0c;很容易会造成我们皮肤的瘙痒&#xff0c;我们大部分时间都在户外&#xff0c;暴露…

NineData:帮助开发者用好数据和云

导语 &#xff1a;数据库工具是指用于创建、设计、管理、开发、维护和优化数据库的一系列软件工具&#xff0c;包括数据库设计工具、数据库迁移与复制、数据库管理工具、数据安全工具等&#xff0c;这些工具可以帮助数据库管理员和开发人员更高效地管理、使用和开发数据库&…

嘴尚绝卤味添加草本物质的奥秘,让你品尝健康美味

每当提起卤味&#xff0c;相信很多人的口水都会开始分泌。确实&#xff0c;卤味作为一种深受人们喜爱的美食&#xff0c;其独特的口感和味道总是能够满足人们的味蕾。而在众多卤味品牌中&#xff0c;嘴尚绝卤味因其添加了草本物质而备受关注。那么&#xff0c;嘴尚绝卤味为什么…

Vue框架学习笔记-Object.defineproperty函数

文章目录 前文提要Object.defineProperty作用Object.defineProperty参数使用例图getter&#xff0c;也就是get函数setter&#xff0c;也就是set函数 前文提要 本人仅做个人学习记录&#xff0c;如有错误&#xff0c;请多包涵 Object.defineProperty作用 当在js中声明了一个变…

获取数据库中最占用内存的sql语句

SELECT TOP 20 total_worker_time/1000 AS [总消耗CPU 时间(ms)],execution_count [运行次数], qs.total_worker_time/qs.execution_count/1000 AS [平均消耗CPU 时间(ms)], last_execution_time AS [最后一次执行时间],min_worker_time /1000 AS [最小执行时间(ms…

推荐你一个基于Koin, Ktor Paging等组件的KMM Compose Multiplatform项目

推荐你一个基于Koin, Ktor & Paging等组件的KMM Compose Multiplatform项目 Kotlin Multiplatform Mobile&#xff08;KMM&#xff09;已经从一个雄心勃勃的想法发展成为一个稳定而强大的框架&#xff0c;为开发人员提供了在多个平台上无缝共享代码的能力。通过最近的稳定…

当「华为还是备选,迪爹还是迪子」时宇宙厂一面原题

写在前面 2021 年还是互联网元年&#xff0c;当时常规的华为 Offer 还是普遍人的备选&#xff0c;如今的迪爹&#xff08;BYD&#xff09;也还是 "来投就给 Offer" 的迪子。 只有字节&#xff0c;当时是公认炙手可热的"宇宙厂"。 作为在 2021 就提前体验了…