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