在 Python 中使用 OpenCV 检测手掌纹路

Zho*_*ouX 5 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")
Run Code Online (Sandbox Code Playgroud)

我尝试了不同的高斯核大小和 Canny 低/高阈值参数集,但结果要么噪声太多,要么缺少(部分)主线。上面的图片已经是我迄今为止得到的最好的了..

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

任何帮助,将不胜感激!

Y.A*_*.AL 0

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

  • 使用形态过滤器,

  • 线的分类(根据其长度、适合对比区域...等)

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

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