使用Python和OpenCV在特定点相加两幅图像

4 投票
1 回答
1554 浏览
提问于 2025-04-18 06:57

我正在尝试使用Python中的OpenCV,通过位运算将两张不同大小的图片合成在一起。我希望在第一张图片(一个人的脸)中的某个特定点,能够与第二张图片(眼镜框)的某个特定点重合。这些特定点并不是图片的角落。我知道眼镜框的两个中点和眼睛的瞳孔位置。我想让眼镜框的中点与脸上眼睛的瞳孔位置重合。现在我使用的代码是将第二张图片的最左边角落与第一张图片的特定点对齐,但我希望的是将左侧眼镜框的中点添加到那里。

脸部图片可以是任何随机的图片,而眼镜图片如下所示:

Image 2

我正在使用的代码是:

import cv2
import numpy as np

img_frame = cv2.imread('image1.jpg',1)
img_in = cv2.imread('face.jpg',1)
new_image = np.zeros(img_frame.shape,dtype=np.uint8)

i,j,k = img_frame.shape

for ii in range (1,i):
    for jj in range (1,j):
        pixel = img_frame[ii,jj]

        img_in[339+ii,468+jj] = pixel

cv2.imwrite('pc2_with_frame_7.jpg',img_in)            
cv2.imshow('win',img_in)
cv2.waitKey(0)
cv2.destroyWindow('win')

任何帮助都将不胜感激。

谢谢。

1 个回答

2

好吧,看起来其他人帮不了你,所以我来提供一些我能给的帮助...

你想做的事情叫做“阿尔法合成”。你可以在维基百科上了解更多,也可以在OpenCV文档中找到相关信息。

我推荐使用ImageMagick这个工具,它是免费的,并且支持Perl、Python、C/C++等多种编程语言,还有命令行工具。如果我从这张照片(face.jpg)开始:

enter image description here

然后把你的glasses.jpg文件转换成带透明背景的PNG格式,效果如下:

enter image description here

我可以在终端运行以下ImageMagick命令:

composite glasses.png face.jpg out.jpg

然后我得到的结果是:

enter image description here

看起来OpenCV在处理透明度时可能会有问题,解决方案可以在这里找到。如果你想尝试@ypnos在那篇文章中建议的遮罩方法,我已经为你准备好了必要的输入文件,你可以从我的网站下载:

带有阿尔法通道的glasses.png

input-mask.png

撰写回答