python - OpenCV 轮廓凹凸检测
问题描述
我有以下我想解决的问题:
纸杯是从它的侧面拍摄的,它的边缘和轮廓是用 Canny 和 findContours 功能找到的(请参阅下面附的 IMG1),然后我必须测试该轮廓是否是直的(没有任何颠簸或其他缺陷),如果它通过则返回或不。
编辑:根据 Christoph Rackwitz 的建议,我正在发布原始未更改的图像。
我已经成功实现了边缘检测,如下图 IMG1 所示,但现在我想删除部分未使用的边缘并希望获得 IMG2 中显示的结果。
最好的方法是什么?我脑子里想的几件事:
- 掩码(屏蔽其他路径)
- 以某种方式删除在 x 坐标中完全不同的路径。
另一个问题是检测弯曲路径上的颠簸。我正在考虑几个可能的解决方案:
- 遍历轮廓并寻找 x 坐标中的尖峰(例如从 20 到 40 的根本变化)
- 绘制相似的半径弧并将其与该轮廓进行比较。
最好的结果显示在 IMG3 图像中。对我来说是解决这个问题的完美方式。
也许有人对 OPENCV 有更多的经验,可以照亮我解决这个问题的道路。谢谢你!
我的代码如下:
import numpy as np
import cv2
# Read the original image
img = cv2.imread('test2.jpg')
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img_blur = cv2.GaussianBlur(img_gray, (3,3), 0)
edges = cv2.Canny(image=img_blur, threshold1=110, threshold2=180) # Canny Edge Detection
ret, thresh = cv2.threshold(edges, 110, 180, cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(image=thresh, mode=cv2.RETR_TREE, method=cv2.CHAIN_APPROX_NONE)
# print(contours)
for cnt in contours:
print(cv2.arcLength(cnt, False))
image_copy = img.copy()
cv2.drawContours(image=image_copy, contours=contours, contourIdx=-1, color=(255, 0, 0), thickness=1, lineType=cv2.LINE_AA)
cv2.imshow('Binary image', image_copy)
cv2.waitKey(0)
cv2.destroyAllWindows()
IMG1这是 OpenCV 当前检测到的
IMG2我努力实现的良好边缘检测
IMG3在一张图像中结合了预期路径和缺陷的完美结果
IMG4测试原图等
解决方案
推荐阅读
- c - C - 如何输入字符串并将其插入到字符串数组中?
- c# - 从 Xamarin 中的代码推送新页面后如何旋转屏幕
- python - 如何获取 *widget-token* 以从 Google Trends 下载 csv 文件?
- python - 如何自定义格式化 pandas 整数列以用逗号作为千位分隔符显示?
- node.js - 为什么 nodejs 在未声明的变量上静默失败?
- python - 我可以将 for 循环的输出转换为数据框中的列吗?
- c++ - Qt modbus串口流控制处理
- bash - Git 签出失败,出现“非法字节序列”
- r - 使用 R 模拟 ARMA 模型
- python - 使用 scikit-learn 训练数据时,SVM 多类分类停止