python - 在 Python 中使用 OpenCV 检测手掌线
问题描述
我正在通过一个旨在检测手掌线的项目来研究使用 python 的 OpenCV。
我所做的基本上是使用Canny 边缘检测,然后在边缘上应用霍夫线检测,但结果不是很好。
这是我正在使用的源代码:
original = cv2.imread(file)
img = cv2.cvtColor(original, cv2.COLOR_BGR2GRAY)
save_image_file(img, "gray")
img = cv2.equalizeHist(img)
save_image_file(img, "equalize")
img = cv2.GaussianBlur(img, (9, 9), 0)
save_image_file(img, "blur")
img = cv2.Canny(img, 40, 80)
save_image_file(img, "canny")
lined = np.copy(original) * 0
lines = cv2.HoughLinesP(img, 1, np.pi / 180, 15, np.array([]), 50, 20)
for line in lines:
for x1, y1, x2, y2 in line:
cv2.line(lined, (x1, y1), (x2, y2), (0, 0, 255))
save_image_file(lined, "lined")
output = cv2.addWeighted(original, 0.8, lined, 1, 0)
save_image_file(output, "output")
我尝试了不同的高斯核大小和 Canny 低/高阈值的参数集,但结果要么噪音太大,要么缺少(部分)主要线。到目前为止,上图已经是我得到的最好的了..
我应该做些什么来改善结果,或者任何其他方法会得到更好的结果?
任何帮助,将不胜感激!
解决方案
您正在寻找的是真正的实验性。您已经完成了最重要的功能。我建议您调整参数以获得合理且嘈杂的行数,然后您可以进行一些过滤:
使用形态过滤器,
线的分类(根据它们的长度,适合对比区域......等)
通过将手掌区域(没有手指)划分为网格(4x4 .. 其中 4 个垂直手指角可以定义网格的配置)来改进您的类别。
- 计算梯度图像,线的方向也可能有帮助
- 搜索“累积水平线检测”算法,有助于检测线的确定性
推荐阅读
- scala - 为什么我的 scala 函数/闭包定义是非法的?
- css - 禁用父滚动条以避免双滚动条
- file - 获取总文件大小直到文件大小 < 1000KB - Windows 批处理脚本
- netlogo - Netlogo:从代理中提取信息
- selenium - Jenkins JUnit 保留结果,即使它已经被清理了
- ios - iPhone X上如何将一行白色像素设置为一行红色、一行绿色、一行蓝色
- spring-boot - Spring rest Template Get Call 不返回 List
- arrays - MongoDb 过滤器数组
- loopbackjs - 用户使用 AgendaJS 定义的任务
- c++ - 尝试使用 c++ 包装器从节点使用 go 函数得到段错误