opencv - Open Cv - Emgu Cv 如何在灰度图像上找到 7 段显示器的矩形区域
问题描述
我正在创建用于从 7 段显示压力计读取值的系统。为了从数字(七段显示器)仪表中检测数字和值,我通过以下链接:
- https://hackernoon.com/building-a-gas-pump-scanner-with-opencv-python-ios-116fe6c9ae8b
- https://www.pyimagesearch.com/2017/02/13/recognizing-digits-with-opencv-and-python/
- https://www.kurokesu.com/main/2017/02/20/dumb-thermometer-gets-digital-output/
- https://www.calloftechies.com/2017/12/character-recognition-explained.html
根据上述链接的解释,我创建了以下步骤来阅读数字:
- 将图像转换为灰度图像。
- 使用Otsu 的阈值和二进制逆算法生成二进制图像。
- 使用Otsu 的阈值 应用 Canny 边缘检测。
FindContours
在 Canny 边缘检测上查找。
这对某些图像效果很好,但是当表盘有一些浅色时,它就不起作用了。
浅色的原始图像。 灰度图像阈值应用图像与 Otsu 和二进制逆
您可以看到 Panel display 部分和 Gauge Area 之间没有太大的色差,因此 Otsu将整个表盘转换为白色忽略 Panel Section
请帮我找出矩形 在此先感谢。
解决方案
这是一种使用轮廓近似+轮廓过滤的方法:
- 将图像转换为灰度并执行 Canny 边缘检测
- 执行形态关闭
- 使用轮廓近似查找轮廓和过滤
- 提取投资回报率
这是检测到的显示
由于我们已经有了边界框坐标,我们使用 Numpy 切片提取 ROI
import cv2
image = cv2.imread('1.jpg')
original = image.copy()
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
canny = cv2.Canny(gray, 20, 200, 1)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
close = cv2.morphologyEx(canny, cv2.MORPH_CLOSE, kernel, iterations=1)
cnts = cv2.findContours(close, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
peri = cv2.arcLength(c, True)
approx = cv2.approxPolyDP(c, 0.01 * peri, True)
area = cv2.contourArea(approx)
if len(approx) == 4 and area > 1000:
x,y,w,h = cv2.boundingRect(approx)
cv2.rectangle(image, (x, y), (x + w, y + h), (36,255,12), 3)
ROI = original[y:y+h, x:x+w]
cv2.imshow('image', image)
cv2.imshow('ROI', ROI)
cv2.waitKey()
推荐阅读
- php - html按钮显示php脚本结果
- python - 块大小与 Python 中的多处理/pool.map 无关?
- python - Discord.py 上的作者
- asp.net - ASP.NET Core 2.1 API 不带参数
- amazon-s3 - 从 Amazon S3 Windows 命令行实用程序下载文件
- javascript - 为什么使用解构导入 react-bootstrap 并不理想
- amazon-web-services - 自定义 Terraform 输入
- javascript - 在对象存在之前创建方法链
- tomcat - 如果配置不完整,防止 (tomcat) Web 应用程序启动
- javascript - 如何在javascript中计算弹丸的弧度?