如何在不使用 cv2.warpAffine() 的情况下翻译图像? [Python 3 和 OpenCV 4.1]

Posted

技术标签:

【中文标题】如何在不使用 cv2.warpAffine() 的情况下翻译图像? [Python 3 和 OpenCV 4.1]【英文标题】:How to translate an image without using cv2.warpAffine()? [Python 3 and OpenCV 4.1] 【发布时间】:2020-06-29 17:41:06 【问题描述】:

我正在尝试通过切断左侧的 100 像素并在右侧添加 100 像素的黑色像素来将图像(来自视频捕获)向左平移 100 像素,以使图像保持相同的大小。我知道这可以通过 cv2.warpAffine() 和转换矩阵来完成,但是对每一帧都这样做会增加大量的延迟。我已经读到可能有一种方法可以使用 cv2.copyTo() 来做到这一点,但我仍然不确定如何做到这一点,无论是使用 copyTo 还是其他方法。谢谢!

这是在 Python 3 和 OpenCV 4.1 中完成的

当前(慢)方法:

translation_matrix = np.float32([[1, 0, x_shift], [0, 1, y_shift]])
img = cv2.warpAffine(img, translation_matrix, (w, h))

【问题讨论】:

【参考方案1】:

创建一个与旧图像大小相同的新图像,但对旧图像进行索引,以便您开始按列索引 100 像素。之后,确保分配这些像素,以便我们从新图像的第一列开始,但一直到最后一列。

import cv2
import numpy as np

# Define your image somewhere...
# ...
# ...

img2 = np.zeros_like(img)
img2[:,:-100] = img[:,100:]

以上代码创建了一个名为img2 的新图像,该图像被初始化为与原始输入图像img 大小相同的全零。之后,我们从原始图像的第 100 列开始复制像素到末尾,然后将其分配给目标图像中从第一列到最后 100 列的所有列。之后的其余列仍将全为零,这实际上是给你黑色像素。

【讨论】:

以上是关于如何在不使用 cv2.warpAffine() 的情况下翻译图像? [Python 3 和 OpenCV 4.1]的主要内容,如果未能解决你的问题,请参考以下文章

图像的仿射变换:cv2.warpAffine()

几何变换

OpenCV实现图像的几何变换

与 Photoshop 相比,OpenCV Warpaffine 的质量较低

[OpenCV] 在DataSpell (PyCharm)使用CV2的时候“代码不提示 + 看不了源码”的解决方案

图片处理-opencv-3.图像缩放、旋转、翻转、平移