原理

原理很简单,启动相机,将背景的图片用来拍照的区域分割出来,提取ROI掩膜,与相机拍摄的照片与,得到照片上的对应位置的ROI区域图像,再将这块图像覆盖到背景的图片上面去,再无限循环显示。

使用时

直接运行代码即可使用,想要停止运行时,键盘按‘q’键,调好角度拍照时按键盘‘t’键。如果想要更换背景:1、先改尺寸,可以改相机拍出来的尺寸,也可以改背景图片的尺寸,只要这两个格式一致。

2、将拍照区域涂成一个特异的颜色,便于分割提取,如果有其他更好的提取的方法也可以用,不过代码要修改了,ROI提取时使用的inRange使用方法和使用的颜色参数会放在下面,如果不涂成黑色,则参数要按照表格中来改。3、背景图路径和保存图片的路径全都要修改。

其他有些遇到的坑,还有注意点,我都写在代码的注释里了。

说明

图片处理:(图片来自百度)

Python哆啦A梦怎么画 用python画哆啦a梦的头_python画图哆啦a梦大头贴

涂黑:

Python哆啦A梦怎么画 用python画哆啦a梦的头_保存图片_02

Python哆啦A梦怎么画 用python画哆啦a梦的头_保存图片_03

cv.inRange(hsv, (h_min, s_min, v_min), (h_max, s_max, v_max))函数,hsv是待分割的图像对象,后面两个看自己涂的颜色,参照上方的表格进行一些数据的微调来填写,自己涂的颜色最好是区别于背景图所有颜色的颜色,这样容易提取。

完整代码

import cv2.cv2 as cv2
import numpy as np
import time
save_path='C:/Users/sj/Desktop/addframe/1231/' #保存图片的文件夹路径
capture = cv2.VideoCapture(0) # 创建一个VideoCapture对象
cv2.namedWindow("frame", cv2.WINDOW_NORMAL) #创建一个frame窗口
capture.set(3,960) #设置分辨率
capture.set(4,540)
cv2.resizeWindow("frame", 960, 540)
while(True):
ret, frame = capture.read() # 一帧一帧读取视频
frame=cv2.flip(frame,1) #左右调换
path='C:/Users/sj/Desktop/json-png/ni1' #背景图片的文件夹路径
 fileimg=path+'/timg2.png' #背景图片的路径
 img=cv2.imread(fileimg) 
 imghsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV) #BGR转HSV色彩空间
 Maskbg=cv2.inRange(imghsv,(0,0,0),(180,255,20)) #将懒羊羊的脸部ROI提取出来(涂黑的部分,其他图片只需要把拍照的区域涂黑,再改一下尺寸或者拍照的像素等,就可以代码复用了)
 gaussimg=cv2.GaussianBlur(Maskbg,(3,3),0) #高斯滤波
 medianimg = cv2.medianBlur(gaussimg, 7) 
 timg1 = cv2.bitwise_and(frame, frame, mask=Maskbg) #相同尺寸才可以进行bt与
 dst=cv2.add(timg1,img) #图片叠加
cv2.imshow('frame',dst)
try:
key=cv2.waitKey(1) &0xFF #cv2.waitKey()有输入时返回输入值的ASCll,&0xFF表示取低八位
#必须先把收到的值先存储下来,否则如果输入q第一次判断不是t以后,第二次判断就变成无值的判断,null当然也不等于q了,不将输入的值保存下来,就导致输入q无法退出,除非在他进行第二次判断之前飞速按下q,才能成功退出。多个指令时建议使用队列来做。
if key == ord('t'): #拍照,这里表示输入的是t
cv2.imencode('.png',dst)[1].tofile(save_path+str(time.strftime('%Y%m%d%H%M%S',time.localtime(time.time())))+'.png') #保存图片,日期+时间.png
cv2.waitKey(500) #截图后显示0.5秒
elif key == ord('q'): #这里表示输入的是q,即是退出
break
except Exception:
pass
capture.release() # 释放cap,销毁窗口
cv2.destroyAllWindows()

运行效果

就不露脸了。。。图片是按t保存下来的图片,效果还不错。有没有觉得以前那么火的大头贴,带台电脑,买个打印机,自己也可以去摆摊卖大头贴了呢。

Python哆啦A梦怎么画 用python画哆啦a梦的头_ide_04