如何在不使用 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]的主要内容,如果未能解决你的问题,请参考以下文章
与 Photoshop 相比,OpenCV Warpaffine 的质量较低