gpt4 book ai didi

python - OpenCV 像人眼一样找到主观轮廓

转载 作者:太空宇宙 更新时间:2023-11-03 11:59:41 24 4
gpt4 key购买 nike

当人类看到暗示形状形式的标记时,他们会立即感知形状本身,如 https://en.wikipedia.org/wiki/Illusory_contours .我正在尝试在 OpenCV 中完成类似的事情,以便在噪声非常大的深度图像中检测手的形状。在这个问题中,假设基于肤色的检测不起作用(实际上这是我迄今为止取得的最好成绩,但它在不断变化的光照条件、阴影或肤色下并不稳健。还有各种纸张形状(平面和彩色)在 table 上,混淆了基于颜色的方法。这就是我尝试使用深度摄像头的原因)。

这里是实时镜头的样本图像,已经过预处理以获得更好的对比度并删除了背景渐变:Hand with heavy background noise

我想将手的确切形状与图片的其余部分隔离开来。对于人眼来说,这是一件微不足道的事情。所以这是我所做的一些尝试:

这是应用了 Canny 边缘检测的结果。这里的问题是手内部的黑色形状比实际的手大,导致检测到的手尺寸过大。此外,线条未连接,我无法检测轮廓。 Attempt with Canny

更新: 结合 Canny 和形态学闭合(4x4 像素椭圆)使得轮廓检测成为可能,结果如下。还是太吵了。 Canny with morphing

更新 2: 可以通过将该轮廓绘制到空掩码来稍微增强结果,将其保存在缓冲区中并重新检测另一个轮廓合并三个缓冲图像。组合缓冲图像的行是 hand_img = np.array(np.minimum(255, np.multiply.reduce(self.buf)), np.uint8) 然后再次变形(关闭)最后检测到轮廓。结果比上图稍微好一点,但比较滞后。

或者,我尝试使用现有的 CNN ( https://github.com/victordibia/handtracking ) 来检测手中心的大致位置(此步骤有效),然后从那里进行泛洪。为了检测轮廓,将结果放入 OTSU 过滤器,然后取最大的轮廓,结果如下图(忽略左侧的黑色矩形)。问题是一些噪音也被淹没了,结果很一般:Attempt with flooding

最后,我尝试了 MOG2 或 GMG 等背景去除器。他们被大量快速移动的噪音弄糊涂了。他们还切断了指尖(这对这个项目至关重要)。最后,他们看不到手上的足够细节(8 位加上通过 equalizeHist 进一步减少颜色会产生非常差的灰度分辨率)来可靠地检测小 Action 。

人类在第一张图片中看到手的精确形状是多么简单,而计算机绘制形状是多么困难。

您推荐的实现精确手部分割的方法是什么?

最佳答案

经过两天的拼命测试,解决方案是非常小心地将阈值应用于经过良好预处理的图像。

步骤如下:

  1. 尽可能多地消除噪音。在我的例子中,去噪是使用英特尔的 pyrealsense2 完成的(我使用的是英特尔实感深度相机,算法是为该相机系列编写的,因此它们工作得很好)。我在每一帧上都使用了 rs.temporal_filter() 并直接在 rs.hole_filling_filter() 之后。
  2. 捕捉第一帧。除了捕捉到 table 的确切距离(用于以后的阈值处理)之外,此步骤还保存了一张由 100x100 像素内核模糊的静态图片。由于相机从未完美安装,而是略微倾斜,因此图片上出现难看的灰度渐变,无法进行操作。然后从后面的每一帧中减去这张静止图片,消除梯度。 顺便说一句:这个梯度去除步骤已经包含在上面问题中显示的屏幕截图中
  3. 现在图片几乎没有噪点了。 不要使用equalizeHist这不会简单地定期增加一般对比度,而是过多地体现剩余的噪声。这是我在几乎所有实验中都犯过的主要错误。相反,直接应用阈值(具有固定边界的二进制)。边框非常细,将其设置为 104 而不是 205 会产生巨大差异。
  4. 反转颜色(除非您在上一步中采用了 BINARY_INV),应用轮廓,采用最大的一个并将其写入 mask

瞧!

关于python - OpenCV 像人眼一样找到主观轮廓,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53415220/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com