如何从图像中选择对象并用C++和OpenCV替换它

如何从图像中选择对象并用C++和OpenCV替换它,c++,opencv,C++,Opencv,例如,如果我需要选择Ipad,并且需要用其他尺寸相同的东西替换它,请按照以下步骤操作: 1首先,使用opencv中的功能选择要替换的对象。您可以找到一个简单的演示 2选择对象时,保存所选对象的4个坐标。使用这些坐标查找矩形的大小 3使用函数调整要替换原始图像的图像大小 4现在您可以简单地使用copyTo函数进行替换。检查 希望这有帮助 比方说,我们想把另一张图片中的安卓平板电脑放到iPad上 知道两幅图像上两个对象的角点坐标后,可以使用OpenCV getPerspectiveTransform

例如,如果我需要选择Ipad,并且需要用其他尺寸相同的东西替换它,请按照以下步骤操作:

1首先,使用opencv中的功能选择要替换的对象。您可以找到一个简单的演示

2选择对象时,保存所选对象的4个坐标。使用这些坐标查找矩形的大小

3使用函数调整要替换原始图像的图像大小

4现在您可以简单地使用copyTo函数进行替换。检查


希望这有帮助

比方说,我们想把另一张图片中的安卓平板电脑放到iPad上

知道两幅图像上两个对象的角点坐标后,可以使用OpenCV getPerspectiveTransform函数创建变换矩阵。制作一个空的遮罩,使用fillPoly在其上绘制一个四边形,对应于Android角点,用1-s填充,它将成为二进制遮罩。将前面计算的透视变换应用于遮罩和android图像透视。使用转换后的掩码,使用copyTo功能将转换后的Android图像复制到原始iPad图像上。完成了

这里是一个“概念验证”Python实现,仅仅因为不久前我做了一些没有太大不同的事情。按顺序单击所有Android角落,然后按相同顺序单击iPad角落,按一个键应用变换。当然,不要指望它会带来奇迹——它不会为你画出缺失的边缘,等等


需要更多信息。您是否已经在目标图像中显示了iPad的位置,并且只想在该位置插入新图像?或者你需要先在目标图像中找到iPad吗?
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()