keyword: opencv、抠图、贴图、缩放、透明背景
1、读取图片
img_jpg = cv2.imread('bg.png',cv2.IMREAD_UNCHANGED)
# img_bgr1 = cv2.imread(img_path) # 默认读取方式,读取BGR彩色图像,忽略Alpha通道
cv2.IMREAD_UNCHANGED
表示保留通道,这里的png文件是4通道的。
2、缩放
dst = cv2.resize(src,dsize,fx,fy,interpolation)
dst2 = cv2.resize(img, (400, 400)) # 按照宽400像素、高400像素的大小进行缩放
# 参数说明如下
# src 原始图像
# dsize 输出图像的大小 格式为宽高
# fx 可选参数 水平方向的缩放比例
# fy 可选参数 垂直方向的缩放比例
# interpolation 可选参数 缩放的插值方式
# dst 缩值之后的图像
比例缩放这样使用:
bg_png = cv2.resize(bg_png, None, fx=0.7, fy=0.7)
3、翻转
dst=cv2.flip(src,flipcode)
# flipcode为反转类型
# 0为沿X轴翻转,正数为沿Y轴翻转,负数为同时沿X轴、Y轴翻转
沿X轴是上下翻转,沿Y轴是左右翻转
4、给jpg图像加第四通道
叠加的时候通道数必须一样,不然会报错。如果背景是3通道的,需要先扩充通道如下:
import cv2
import numpy as np
def add_alpha_channel(img):
""" 为jpg图像添加alpha通道 """
b_channel, g_channel, r_channel = cv2.split(img) # 剥离jpg图像通道
alpha_channel = np.ones(b_channel.shape, dtype=b_channel.dtype) * 255 # 创建Alpha通道
img_new = cv2.merge((b_channel, g_channel, r_channel, alpha_channel)) # 融合通道
return img_new
5、 叠加透明底图片
def merge_img(bg_img, fg_img, y1, y2, x1, x2):
"""
将png透明背景图像与背景图像叠加
y1,y2,x1,x2为叠加位置坐标值
"""
yy1 = 0
yy2 = fg_img.shape[0]
xx1 = 0
xx2 = fg_img.shape[1]
# 获取要覆盖图像的alpha值,将像素值除以255,使值保持在0-1之间
alpha_png = fg_img[yy1:yy2, xx1:xx2, 3] / 255.0
alpha_jpg = 1 - alpha_png
# 开始叠加
for c in range(0, 3):
bg_img[y1:y2, x1:x2, c] = ((alpha_jpg * bg_img[y1:y2, x1:x2, c]) + (alpha_png * fg_img[yy1:yy2, xx1:xx2, c]))
return bg_img
6、处理整个文件夹下的图片
folder = './fgr_adult'
for filename in os.listdir(folder):
file_path = os.path.join(folder,filename)
bg_png = cv2.imread(file_path,cv2.IMREAD_UNCHANGED)
# 保存结果图像
cv2.imwrite('./out_adult/' + filename, bg_img)
整个主函数这样:
if __name__ == '__main__':
# 读取背景图像
img_jpg = cv2.imread('bg.png',cv2.IMREAD_UNCHANGED)
folder = './fgr_adult'
for filename in os.listdir(folder):
fg_img = cv2.imread('bg.png', cv2.IMREAD_UNCHANGED) # 保留
file_path = os.path.join(folder,filename)
bg_png = cv2.imread(file_path,cv2.IMREAD_UNCHANGED)
bg_png = cv2.resize(bg_png, None, fx=0.7, fy=0.7)
# 设置叠加位置坐标
x1 = 400 #水平位置
y1 = 0
x2 = x1 + bg_png.shape[1]
y2 = y1 + bg_png.shape[0]
# 开始叠加
res_img = merge_img(fg_img, bg_png, y1, y2, x1, x2)
# 保存结果图像
cv2.imwrite('./out_adult/'+filename, res_img)
7、图片转视频
img2video.py
import cv2
import os
im_dir = './out_adult' #图片路径
video_dir = 'video1.avi' #输出视频路径
fps = 30 #帧率
num = 263 #图片数
img_size = (1024,1024) #图片尺寸
#fourcc = cv2.cv.CV_FOURCC('M','J','P','G')#opencv2.4
fourcc = cv2.VideoWriter_fourcc('M','J','P','G') #opencv3.0
videoWriter = cv2.VideoWriter(video_dir, fourcc, fps, img_size)
for filename in os.listdir(im_dir):
file_path = os.path.join(im_dir,filename)
frame = cv2.imread(file_path, cv2.IMREAD_UNCHANGED)
videoWriter.write(frame)
print(file_path)
videoWriter.release()
8、问题
imshow
用不了,离谱
cv2.imshow("res",res_img)
# 定义程序退出方式:鼠标点击显示图像的窗口后,按ESC键即可退出程序
if cv2.waitKey(0) & 0xFF == 27:
cv2.destroyAllWindows()
报错:cv2.error: OpenCV(4.6.0) C:\b\abs_f8n1j3l9l0\croot\opencv-suite_1691622637237\work\modules\highgui\src\window.cpp:1267: error: (-2:Unspecified error) The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Cocoa support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script in function 'cvShowImage'
我发现可能是我没有正确安装opencv,因为网络原因无法用pip或conda install opencv-python。码一下python离线安装包方法:https://blog.youkuaiyun.com/weixin_46726459/article/details/133817228