cv2.warpPerspective 就差一点?
cv2.warpPerspective just a little bit off?
总的来说,我对 OpenCV 和图像处理还比较陌生。有很多关于使用点扭曲图像以使其“自上而下”的教程。对于我的项目,我有一些计算机显示器的图像,我试图让它看起来像我 select 的图像实际上显示在其中一个显示器上。它 几乎 有效,但转换似乎有点偏离。
我仔细检查了这些点以确保它们是正确的,所以我认为它必须与我的矩阵有关。这是我的 Python 代码:
def normalizeImage(image, monitorID, monitorPts, monitors):
# This function will resize any image to the correct
# height and width to prepare it for being reshaped
rows, cols, _ = image.shape
pts1 = np.array([[0,0],[0,cols],[rows,cols],[rows,0]], dtype=np.float32)
pts2 = monitorPts[monitorID]
matrix = cv2.getPerspectiveTransform(pts1, pts2) # I think my issue is here!!<<<<<<<<<<
# matrix equals:
# | .497 .072 27|
# |-.045 .271 204|
# | 0 0 1|
dst = cv2.warpPerspective(image, matrix, (monitors.shape[1],monitors.shape[0]))
cv2.imshow("dst", dst)
return dst
def combineImages(monitors, image): # display shape of all three images for comparison
dst = cv2.add(image, monitors)
return dst
def main():
monitors = cv2.imread("images/monitors.jpg")
image0 = cv2.imread("images/goldglasses.png")
monitorID = 0 # Which monitor are we adding an image to?
# monitors.shape should be (694, 1431, 3)
print("Monitors:")
print(monitors.shape)
# Point locations for all three monitors. We're only worried about number 0 for now.
monitorPts = (np.array([[27,204],[84,411],[418,301],[393,129]], dtype=np.float32),
np.array([[436,96],[453,325],[847,319],[850,93]], dtype=np.float32),
np.array([[911,93],[878,318],[1259,426],[1327,150]], dtype=np.float32))
image0 = normalizeImage(image0, monitorID, monitorPts, monitors)
monitors = combineImages(monitors, image0)
cv2.imshow("monitors", monitors)
cv2.waitKey(0)
if __name__ == "__main__":
# execute only if run as a script
main()
我想这可能与矩阵变换完成的顺序有关,但我不确定。至少,我 99% 确定问题出在“normalizeImage”函数中。
这是两个源图像:
goldglasses.png:
monitors.jpg:
此外,这是我目前得到的结果:
newMonitors.png:
请注意,这家伙完全不适合显示器。任何帮助表示赞赏。如果您有任何需要澄清的问题,请随时提出。我的方法的任何替代方法可能更容易,也非常感谢。我真的很难理解其中一些函数的很多文档,所以如果有更好的方法来完成所有这些,我不会感到惊讶。
您似乎在行和列之间切换,坐标为pts1
。
cols
适用于 x 轴。
rows
适用于 y 轴。
替换:
pts1 = np.array([[0,0],[0,cols],[rows,cols],[rows,0]], dtype=np.float32)
有:
pts1 = np.array([[0,0],[0,rows],[cols,rows],[cols,0]], dtype=np.float32)
为了更准确减去 1:
pts1 = np.array([[0,0],[0,rows-1],[cols-1,rows-1],[cols-1,0]], dtype=np.float32)
结果:
总的来说,我对 OpenCV 和图像处理还比较陌生。有很多关于使用点扭曲图像以使其“自上而下”的教程。对于我的项目,我有一些计算机显示器的图像,我试图让它看起来像我 select 的图像实际上显示在其中一个显示器上。它 几乎 有效,但转换似乎有点偏离。
我仔细检查了这些点以确保它们是正确的,所以我认为它必须与我的矩阵有关。这是我的 Python 代码:
def normalizeImage(image, monitorID, monitorPts, monitors):
# This function will resize any image to the correct
# height and width to prepare it for being reshaped
rows, cols, _ = image.shape
pts1 = np.array([[0,0],[0,cols],[rows,cols],[rows,0]], dtype=np.float32)
pts2 = monitorPts[monitorID]
matrix = cv2.getPerspectiveTransform(pts1, pts2) # I think my issue is here!!<<<<<<<<<<
# matrix equals:
# | .497 .072 27|
# |-.045 .271 204|
# | 0 0 1|
dst = cv2.warpPerspective(image, matrix, (monitors.shape[1],monitors.shape[0]))
cv2.imshow("dst", dst)
return dst
def combineImages(monitors, image): # display shape of all three images for comparison
dst = cv2.add(image, monitors)
return dst
def main():
monitors = cv2.imread("images/monitors.jpg")
image0 = cv2.imread("images/goldglasses.png")
monitorID = 0 # Which monitor are we adding an image to?
# monitors.shape should be (694, 1431, 3)
print("Monitors:")
print(monitors.shape)
# Point locations for all three monitors. We're only worried about number 0 for now.
monitorPts = (np.array([[27,204],[84,411],[418,301],[393,129]], dtype=np.float32),
np.array([[436,96],[453,325],[847,319],[850,93]], dtype=np.float32),
np.array([[911,93],[878,318],[1259,426],[1327,150]], dtype=np.float32))
image0 = normalizeImage(image0, monitorID, monitorPts, monitors)
monitors = combineImages(monitors, image0)
cv2.imshow("monitors", monitors)
cv2.waitKey(0)
if __name__ == "__main__":
# execute only if run as a script
main()
我想这可能与矩阵变换完成的顺序有关,但我不确定。至少,我 99% 确定问题出在“normalizeImage”函数中。
这是两个源图像:
goldglasses.png:
monitors.jpg:
此外,这是我目前得到的结果:
newMonitors.png:
请注意,这家伙完全不适合显示器。任何帮助表示赞赏。如果您有任何需要澄清的问题,请随时提出。我的方法的任何替代方法可能更容易,也非常感谢。我真的很难理解其中一些函数的很多文档,所以如果有更好的方法来完成所有这些,我不会感到惊讶。
您似乎在行和列之间切换,坐标为pts1
。
cols
适用于 x 轴。rows
适用于 y 轴。
替换:
pts1 = np.array([[0,0],[0,cols],[rows,cols],[rows,0]], dtype=np.float32)
有:
pts1 = np.array([[0,0],[0,rows],[cols,rows],[cols,0]], dtype=np.float32)
为了更准确减去 1:
pts1 = np.array([[0,0],[0,rows-1],[cols-1,rows-1],[cols-1,0]], dtype=np.float32)
结果: