將兩張圖片(一張是有透明背景的png圖片)合成一張
效果圖如下:
原圖
合成圖
原理
- cv2.img 是一個3維的數(shù)組/矩陣 有3通道和4通道前3個通道是rgb顏色 第四個通道是透明通道
- cv2.imread IMREAD_UNCHANGED (-1) 保證了讀取4通道
ps:
- 起因是 看了一個視頻 把蔡徐坤的臉換成籃球, 籃球換成徐坤的臉, up主一點一點扣的
- 想用keras 識別籃球, dlib識別臉, opencv 做替換和視頻輸出 自動化處理一個視頻
- 剛碰到這個問題, 找了C++的代碼才明白具體怎么解決
代碼:
import cv2
cv2.namedWindow("logo")# 定義一個窗口
frame = cv2.imread('F:\\testimg\\2.jpg', cv2.IMREAD_COLOR)# 捕獲圖像1
#IMREAD_UNCHANGED If set, return the loaded image as is (with alpha channel, otherwise it gets cropped).
#因此Png必須是4通道的IMREAD_UNCHANGED
logo = cv2.imread('F:\\testimg\\logo.png', cv2.IMREAD_UNCHANGED)
rows, cols, channels = logo.shape
dx, dy =120, 150
roi = frame[dx:dx + rows, dy:dy + cols]
for iin range(rows):
for jin range(cols):
if not (logo[i, j][3] ==0):#透明的意思
roi[i, j][0] = logo[i, j][0]
roi[i, j][1] = logo[i, j][1]
roi[i, j][2] = logo[i, j][2]
frame[dx:dx + rows, dy:dy + cols] = roi
cv2.imshow("logo", frame)# 顯示輪廓
cv2.waitKey(0)
cv2.destroyAllWindows()
參考:
https://blog.csdn.net/xiongwen_li/article/details/78662234
https://blog.csdn.net/m0_37606112/article/details/78632896
https://docs.opencv.org/3.1.0/d4/da8/group__imgcodecs.html
https://docs.opencv.org/master/d0/d86/tutorial_py_image_arithmetics.html