【问题标题】:How to overlay/replace a part of an image with another using cv2?如何使用 cv2 覆盖/替换图像的一部分?
【发布时间】:2019-01-08 00:20:24
【问题描述】:

我有一个覆盖大面积屋顶的图像!我正在使用分段分析它的故障。然而,挑战在于,有时屋顶的单张照片并没有涉及到细节,因此很难分析。所以我们把它分成几部分,拍摄更小的部分的图像并进行分析。 这是一个例子:

Entire roof shot

Part 1

Part 2

Part 3

所以现在我想分析零件的故障并一次性更换。以下是其中一个分析部分的外观:

Post Analysis

到目前为止我的想法:如果我可以以某种方式将未分析的部分映射到屋顶,我也可以使用相同的信息和方法将已分析的部分映射到单个镜头。

我已经能够进行特征检测并识别单次拍摄的零件,但是我不确定我应该如何转换它们以适应和替换单次拍摄的确切零件。这里是特征检测:

Feature detection for image/template matching

我一直在考虑尝试将较小的图像一个接一个地拼接到较大的图像上,但我担心这可能行不通

PS:我使用的是 Linux、Python3 和 OpenCV 3.4.0

另外,原来的单拍也没有手动分割成不同的部分。由于它是热敏摄像头,因此不可能在单次拍摄中获得高分辨率,因此该摄像头可以近距离拍摄不同的照片。这些部分是单独的图像,不是从单张照片中裁剪出来的。

编辑:我现在正在尝试另一种方法,在该方法中检测零件图像中的故障,然后将这些故障裁剪出来用作模板,然后尝试使用 SIFT 进行特征检测以将故障匹配为单个模板射击。但是,除了自身之外,小故障都与其他事物相匹配:(大多数较大的故障都被检测到很好,而中等故障也不太好。我认为原因是图像分辨率低,单张照片无法复制模板匹配的近景和单景上的故障和特征数量也较少。

【问题讨论】:

    标签: python opencv image-processing computer-vision image-stitching


    【解决方案1】:

    更新答案

    我很抱歉!我误解了这个问题。因此,使用您的特征映射方法,您会在原始图片上获得一组点,这些点对应于新图片中的一组点。假设特征映射工作正常,您可以将对应关系描述为映射:

    $$P_{新点} = T_{原始到新} * P_{原始} $$

    其中 T_{original to new} 是 transformation matrix。如果你有这个变换矩阵,那么你可以很容易地把它倒过来找出“部分”图片与原始图片之间的关系。

    挑战在于您目前有一个复杂的转换矩阵!您正在寻找的那个具有旋转分量、平移分量、缩放分量,并且很可能也发生了一些倾斜。在给定特征点集的情况下,我不确定找到该矩阵的正确方法。

    如果您不介意做一些手动工作,我建议您在两张图片上找到一组对应的线,并使用 OpenCV 的 perspective transformation 为您找到此矩阵。

    旧的、不相关的答案

    我有一个 KISS 答案:

    当您从“整个屋顶拍摄图像”中手动选择“第 1-3 部分”时,请跟踪它们的初始大小和位置。

    如果您提前知道,则无需在事后计算转换。对于初学者,我建议将图像分成四分位数,并在您拥有这个简单的几何图形时覆盖检测。一旦可行,就可以解决原始图片中任意大小的框的问题。

    【讨论】:

    • 单拍图像不使用软件或手动分割。部分图像实际上是从相机单独拍摄的图像。原因是热像仪分辨率低,单次拍摄细节不够。
    • 啊,我明白了!鉴于此信息,我更新了答案:)
    • 我还发现了这个可能相关的关于图像拼接的酷博客:pyimagesearch.com/2016/01/11/opencv-panorama-stitching
    猜你喜欢
    • 2021-11-26
    • 2022-01-19
    • 1970-01-01
    • 2013-12-03
    • 1970-01-01
    • 2012-12-07
    • 2013-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多