1、目的
做这个纯粹是为了好玩,想做鬼畜视频发现给原视频换头需要一帧一帧的进行修改实在是太麻烦了,所以诞生了这个想法。
2、需求
实现在视频流中实时的人脸识别和人脸对比,对比成功过后替换人脸
3、准备工作和技术
1)得先找一个开源的跨平台计算机视觉和机器学习软件库,不要自己去造轮子,所以选择了OpenCV
2)人脸识别算法嘛~这个找了一套微软的识别算法
3)开发工具用的是IDEA
4) 开发语言用的是Java
我写到一半才发现,这个OpenCV社区大多数人都是用的Python和C++来写的,Java的资料少之又少,推荐还是用C++来写。
4、开工
package com.xmkj.face.main;
import com.xmkj.face.FaceUtil;
import com.xmkj.face.WindowUtil;
import com.xmkj.face.bean.FaceSuccessInfo;
import com.xmkj.face.bean.InitBean;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.imgproc.Imgproc;
import org.opencv.videoio.VideoCapture;
import org.opencv.videoio.Videoio;
import java.util.List;
/**
* 换头
* @author 石嘉懿
*
*/
public class HuanTou {
public static void main(String[] args) {
//获取窗体工具类
WindowUtil windowInstance = WindowUtil.getInstance();
//获取人脸工具类
FaceUtil faceInstance = FaceUtil.getInstance();
//实例化人脸配置类
InitBean ib = new InitBean();
ib.setFaceSimilarity(80);
//人脸识别引擎初始化加入配置信息
@SuppressWarnings("static-access")
int code = faceInstance.init(ib);
//成功时状态码为0
System.out.println("状态码 = " + code);
//取读视频流
VideoCapture videoCapture = windowInstance.openVideo("H:\\2.mp4");
//判断摄像头是否未找到
if(videoCapture == null) {return;}
//要换的人头 用于人脸对比
FaceUtil.faceFileRegister(11, "小石", "H:\\yt.jpg");
//通过死循环去读摄像头的帧
while (true) {
//Mat对象用于保存帧
Mat img = new Mat();
//videoCapture.read方法读一帧 把图像写到Mat里
if (videoCapture == null || !videoCapture.read(img)) {
System.out.println("未找到相机");
break;
}
//调用人脸对比方法传入当前画面
@SuppressWarnings("static-access")
List<FaceSuccessInfo> faceEngine = faceInstance.faceChage(img,"H:\\1233.png");
//识别结果在窗体上显示
windowInstance.showWindow(img, "窗体1", 0, 0);
}
}
}
开发初期,我进行了大量的代码封装,也为后期工作省了不少时间。
最后修改于 2021-01-27 21:49:00
如果觉得我的文章对你有用,请随意赞赏
扫一扫支付

