首页 > 解决方案 > 在 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 低/高阈值的参数集,但结果要么噪音太大,要么缺少(部分)主要线。到目前为止,上图已经是我得到的最好的了..

我应该做些什么来改善结果,或者任何其他方法会得到更好的结果?

任何帮助,将不胜感激!

标签: pythonopencv

解决方案


您正在寻找的是真正的实验性。您已经完成了最重要的功能。我建议您调整参数以获得合理且嘈杂的行数,然后您可以进行一些过滤:

  • 使用形态过滤器,

  • 线的分类(根据它们的长度,适合对比区域......等)

  • 通过将手掌区域(没有手指)划分为网格(4x4 .. 其中 4 个垂直手指角可以定义网格的配置)来改进您的类别。

  • 计算梯度图像,线的方向也可能有帮助
  • 搜索“累积水平线检测”算法,有助于检测线的确定性

推荐阅读