python - 检测嘈杂的背景/对象 - OpenCV
问题描述
我正在尝试检测卡片,但问题是有时图像不好并且有多个背景,如下所示:
没有很好地定义边缘
![没有很好地定义边缘][1]
示例背景
![示例背景][2]
我这样做了:
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
gray = cv2.GaussianBlur(gray,(11,11),0)
edg = cv2.Canny(gray, 10, 20)
contours,_ = cv2.findContours(edg.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
cv2.drawContours(image,contours,-1,[0,255,0],2)
cv2.imshow('image',image)
cv2.waitKey(0)
但有时他会检测到其他东西,而不是卡片。任何人都知道如何解决这个问题?我试过用 YOLO 进行物体检测,但很难
解决方案
首先,请注意,拍照时有一些条件,如光线条件和中等条件,如果你能控制它们,图像处理部分的负载就会降低。例如在您的示例图像中,您可以将 A4 白纸放在背景中以减少小轮廓等(当然不可能更改条件)。
好吧,我使用以下代码尝试您的测试图像:
import cv2
rectKernel = cv2.getStructuringElement(cv2.MORPH_RECT, (8, 8))
sqKernel = cv2.getStructuringElement(cv2.MORPH_RECT, (17, 17))
img = cv2.imread('edge.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
gradX = cv2.Sobel(gray, ddepth=cv2.CV_32F, dx=1, dy=0,
ksize=-1)
morph1 = cv2.morphologyEx(gradX, cv2.MORPH_OPEN, rectKernel)
morph2 = cv2.morphologyEx(morph1, cv2.MORPH_CLOSE, sqKernel)
cv2.imshow("img",img)
cv2.imshow("gradx",gradX)
cv2.imshow("tophat",morph1)
cv2.imshow("tophat2",morph2)
cv2.waitKey()
这是结果:
您可以使用轮廓并使用轮廓属性删除不需要的轮廓:轮廓属性
推荐阅读
- zabbix - 使用查询手动删除问题后,如何在zabbix中再次出现相同的问题?
- c++ - std::vector 的 std:array 的 SFINAE 不能在 C++11 中编译
- javascript - 为什么单击外部时我的 HTML 模态不会关闭?
- python - 从kik bot发送视频
- r - 使用符号从数据文件中采样行并在 R 中运行单独的 T 检验
- excel - 查找确定一周的数据
- sql - SQLServer(MSSQL) 全文搜索索引到 postgres
- docker - 带有变量 proxy_pass 的 Nginx 斜杠到 docker
- lua - 我正在寻找 Lua 查找和替换逻辑
- node.js - react native-redux-expo-firebase 项目中的 Http 调用未在实时应用程序版本中通过