当人们看到标记提示形状时,他们立刻感知到形状本身,就像在 https://en.wikipedia.org/wiki/Illusory_contours 中所示。我正在尝试在OpenCV中实现类似的功能,以便在具有非常大噪声的深度图像中检测手的形状。在这个问题中,假设基于肤色的检测不起作用(实际上这是我目前取得的最好结果,但在不断变化的光照条件、阴影或肤色下并不稳健。此外,桌子上还有各种纸张形状(平面和彩色),这会使基于颜色的方法变得混乱。这就是为什么我尝试使用深度相机的原因)。
这是一张已经进行了预处理以获得更好的对比度并去除背景梯度的实时录像样本图片:
我想将手的确切形状与图片的其余部分隔离开来。对于人眼来说,这是一件微不足道的事情。所以这里是我做过的几次尝试:
这是应用Canny边缘检测后的结果。问题在于手内部的黑色形状比实际手要大,导致检测到的手过大。此外,线条没有连接,我无法检测轮廓。
更新:将Canny和形态学闭合(4x4像素椭圆)结合起来,可以进行轮廓检测,并得到以下结果。仍然非常嘈杂。
更新2: 通过将轮廓绘制到一个空的掩模中,将其保存在缓冲区中,并重新检测合并三个缓冲图像的轮廓,可以稍微增强结果。组合缓冲图像的行是
令人荒谬的是,对于人类来说,在第一张图片中看到手的确切形状是多么简单,而对计算机来说画出形状却异常困难。
您推荐用什么方法来实现精确的手部分割?
这是一张已经进行了预处理以获得更好的对比度并去除背景梯度的实时录像样本图片:
![Hand with heavy background noise](https://istack.dev59.com/V6jjZ.webp)
这是应用Canny边缘检测后的结果。问题在于手内部的黑色形状比实际手要大,导致检测到的手过大。此外,线条没有连接,我无法检测轮廓。
![使用Canny尝试](https://istack.dev59.com/BlraE.webp)
![带有形态学处理的Canny](https://istack.dev59.com/86Gf6.webp)
hand_img = np.array(np.minimum(255, np.multiply.reduce(self.buf)), np.uint8)
,然后再次进行形态学变换(闭运算),最后检测轮廓。结果比上面的图片要好一些,但却有点滞后。
另外,我尝试使用现有的CNN(https://github.com/victordibia/handtracking)来检测手的大致位置(此步骤有效),然后从那里开始泛洪。为了检测轮廓,将结果放入OTSU滤波器中,然后取最大的轮廓,得到以下图片(忽略左侧的黑色矩形)。问题是一些噪声也被泛滥了,结果不太理想:
equalizeHist
进一步减少颜色会产生非常差的灰度分辨率),以可靠地检测小运动。令人荒谬的是,对于人类来说,在第一张图片中看到手的确切形状是多么简单,而对计算机来说画出形状却异常困难。
您推荐用什么方法来实现精确的手部分割?