enter image description here 例如,如果我需要选择Ipad,我需要用相同尺寸的其他东西替换它
答案 0 :(得分:2)
假设我们想在iPad上放置另一张图片的Android平板电脑。
知道两个图像上两个对象的角坐标,您可以使用OpenCV getPerspectiveTransform
函数来创建变换矩阵。制作一个空面具,使用fillPoly
在其上绘制四边形,对应于Android角点,用1-s填充,它将成为二进制掩码。将先前计算的透视变换应用于蒙版和android图像(warpPerspective
)。使用转换后的蒙版,使用copyTo
函数将转换后的Android图像复制到原始iPad图像上。完成。
这是一个'概念证明'Python实现,只是因为我不久前做了一些不那么不同的事情。按顺序单击所有Android角点,然后按相同顺序点击iPad角,按A
键应用变换。当然,不要指望奇迹出现 - 它不会为你画掉缺失的边缘等等。
import cv2
import numpy as np
def on_mouse_click_from(event, x, y, flags, param):
global image_from, points_from
if event == cv2.EVENT_LBUTTONDOWN:
cv2.circle(image_from, (x, y), 2, (255, 0, 0), cv2.FILLED)
points_from.append([x, y])
cv2.imshow("Image1", image_from)
def on_mouse_click_to(event, x, y, flags, param):
global image_to, points_to
if event == cv2.EVENT_LBUTTONDOWN:
cv2.circle(image_to, (x, y), 2, (255, 0, 0), cv2.FILLED)
points_to.append([x, y])
cv2.imshow("Image2", image_to)
points_from = []
points_to = []
image_from = cv2.imread("android.jpg")
image_to = cv2.imread("ipad.jpg")
max_dim = [max(x, y) for x, y in zip(image_from.shape[:2], image_to.shape[:2])][::-1]
max_dim = tuple(max_dim)
image_from = cv2.resize(image_from, max_dim)
image_to = cv2.resize(image_to, max_dim)
clone_from = image_from.copy()
cv2.namedWindow("Image1")
cv2.setMouseCallback("Image1", on_mouse_click_from)
clone_to = image_to.copy()
cv2.namedWindow("Image2")
cv2.setMouseCallback("Image2", on_mouse_click_to)
image_res = None
cv2.namedWindow("Result")
while True:
cv2.imshow("Image1", image_from)
cv2.imshow("Image2", image_to)
key = cv2.waitKey(1) & 0xFF
if key == ord("r"):
image_from = clone_from.copy()
image_to = clone_to.copy()
points_from = []
points_to = []
elif key == ord("a"):
trans = cv2.getPerspectiveTransform(np.array(points_from, dtype='f4'), np.array(points_to, dtype='f4'))
height, width, n_colors = clone_from.shape
stencil = np.zeros((height, width, n_colors))
contours = [np.array(points_from)]
color = [1, 1, 1]
cv2.fillPoly(stencil, contours, color)
stencil = cv2.warpPerspective(stencil, trans, (width, height))
img_from_transformed = cv2.warpPerspective(clone_from, trans, (width, height))
cnd = (stencil != 0)
image_res = clone_to.copy()
image_res[cnd] = img_from_transformed[cnd]
cv2.imwrite("result.jpg", image_res)
cv2.imshow("Result", image_res)
elif key == ord("q"):
break
cv2.destroyAllWindows()
答案 1 :(得分:0)
请按照以下步骤操作:
1)首先,使用opencv中的Mousecallback功能选择要替换的对象。您可以找到一个简单的演示here
2)选择对象时,保存所选对象的4个坐标。使用这些坐标查找矩形的大小。
3)使用Resize功能调整图像大小(用它来替换原始图像)
4)现在您只需使用copyTo函数进行替换即可。查看here
希望这有帮助!