python - 如何提取洗衣机前面板的轮廓?

标签 python opencv computer-vision image-segmentation opencv-contour

我正在寻找一种提取洗衣机前面板轮廓的可靠方法。或者只获取前面板的 4 个角点。
我尝试了颜色 mask ,但没有找到稳定的结果。
这里有一些例子:

pic3
pic2
pic1

最佳答案

三种可能的选择:

  • 获取一堆机器的图像,手动确定一个标明门在哪里的标签,然后训练一个卷积神经网络来回归每个图像的这些参数。
  • 将每个图像视为一个单独的优化问题,其目标是估计最有可能对应于前面板的最佳矩形的参数。所以我们的模型是theta = (p_1, p_2, p_3, p_4) ,图像中面板的四个 2D 位置。我们需要一个能量函数E最小化 wrt theta (例如,使用带有动量的梯度下降或 RANSAC)。您可以使用许多术语,就像一些想法一样:

    一种。至少一些角应该是“角状的”:运行一个简单的 corner detector , 并定义能量 E_corner这会惩罚到最近角落的距离。

    湾。至少一些边缘(例如 p_1p_2p_3 之间)应该是“类似边缘的”:计算图像的梯度幅度 M = || \nabla I ||并沿面板边缘强制执行 M 的值应该更大,使用能量 E_edge .例如,对于 x,y沿着一条边,让 E_edge(x,y)=1/(1+M(x,y)) (Robust losses 往往在这里更好)。

    C。使用每个门实际上是一个投影的 3D 矩形这一事实:例如,参见 this question .一个有趣的想法是从一个矩形(代表面板)开始,而不是回归 p_i的,而是回归仿射变换甚至透视投影变换的参数(尽管这需要算法估计深度),它将起始矩形映射到图像中的一个。然后你可以regularize估计变换的参数,以防止输出不太可能的变换。

    d。使用矩形内必须有什么的知识。例如,给定四个角,您可以确定定义机器圆门的椭圆。该椭圆内的外观统计信息应该有些独特,以及门边界处的边缘/图像梯度;因此,您可以定义一个能量项,鼓励模型选择角落,使内部在白色背景上有一个深色椭圆物体。

    总的来说,这种方法类似于 snakes, or active contour models ,我认为这可能值得你研究。然而,能量最小化的蛇往往不会考虑它们所包围区域的内部。因此,Mumford-Shah functional 的一些变体可能是一个有用的补充(尽管在您的情况下,注意“门区域”的平滑度并不完全可取)。
  • 如果您所有的机器都非常相似或几乎相同(就像您发布的机器一样),实际上最好是 estimate a homography图像之间。 (另见 herehere)。由于机器的正面几乎是平面的,因此不同图像的正面必须通过单应性相关联。然后知道前面板在一张图像中的位置将告诉您它在所有图像中的位置。例如,查看 OpenCV tutorial for homographies ,他们展示了如何撤消平面表面的透视变换,允许您将一个图像的透视扭曲到另一个图像(这里,一个投影的机器面板到另一个模板)。
  • 关于python - 如何提取洗衣机前面板的轮廓?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56342101/

    相关文章:

    安卓+OpenCV : How to set camera resolution when using CameraBridgeViewBase

    c++ - 组合两个矩阵,保留它们的元素值

    cuda - 如何验证 CuDNN 安装?

    python - 在python中以不同颜色绘制bool-int散点图

    python - mylist.reverse() 和 list.reverse(mylist) 是如何执行的?

    python - 逐个字符地遍历 csv

    python - 是否可以在 App Engine blobstore 中查找和删除孤立的 blob?

    c++ - 如何链接和使用 OpenCV header ?

    computer-vision - 使用 haar 级联进行 UpperBody 检测

    computer-vision - 检测图像中的透明玻璃