想要给视频添加水印,需要从视频中取出图像帧,给图像帧添加文字、图片水印即可
首先需要取到BufferedImage,通过这个就可以用Java的方式添加水印
从grabber中获取BufferedImage:
//获取BufferedImage可以给图像帧添加水印
Java2DFrameConverter javaconverter=new Java2DFrameConverter();
BufferedImage buffImg=javaconverter.convert(grabber.grab());
获取到了BufferedImage就可以开始给视频帧添加文字或者图片水印
用java添加水印:
(1)摄像头视频抓取
(2)Frame和Mat相互转换
(3)给图像添加文字
(4)把添加水印文字的图像转换为Frame并显示到窗口
(5)保存图片
代码实现
运行后会出现一个窗口,窗口中会实时显示日期和eguid正向和eguid翻转字符,关闭窗口相当于结束程序运行。
该程序会自动保存第一帧图像到本地eguid.jpg文件。
// 转换器,用于Frame/Mat/IplImage相互转换
OpenCVFrameConverter.ToIplImage converter = new OpenCVFrameConverter.ToIplImage();
// 使用OpenCV抓取本机摄像头,摄像头设备号默认0
OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);
// 开启抓取器
grabber.start();
//做好自己!--eguid版权所有,转载请注明出处!
CanvasFrame cFrame = new CanvasFrame("做好自己!--eguid!", CanvasFrame.getDefaultGamma() / grabber.getGamma());
cFrame.setAlwaysOnTop(true);
cFrame.setVisible(true);
// 水印文字位置
Point point1 = new Point(10, 50);
Point point2 = new Point(200, 200);
Point point3 = new Point(200, 240);
// 颜色
Scalar scalar1 = new Scalar(0, 255, 255, 0);
Scalar scalar2 = new Scalar(255, 0, 0, 0);
Frame frame = null;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
int index = 0;
// 关闭窗口即停止运行
while (cFrame.isShowing()) {
if ((frame = grabber.grabFrame()) != null) {
// 取一帧视频(图像),并转换为Mat
Mat mat = converter.convertToMat(grabber.grabFrame());
// 加文字水印,opencv_imgproc.putText(图片,水印文字,文字位置,字体,字体大小,字体颜色,字体粗度,文字反锯齿,是否翻转文字)
opencv_imgproc.putText(mat, "eguid!", point2, opencv_imgproc.CV_FONT_VECTOR0, 2.2, scalar2, 1, 0,
false);
// 翻转字体,文字平滑处理(即反锯齿)
opencv_imgproc.putText(mat, "eguid!", point3, opencv_imgproc.CV_FONT_VECTOR0, 2.2, scalar2, 1, 20,
true);
opencv_imgproc.putText(mat, sdf.format(new Date()), point1, opencv_imgproc.CV_FONT_ITALIC, 0.8, scalar1,
2, 20, false);
// 在窗口显示处理后的图像,Frame frame=converter.convert(mat);
cFrame.showImage(converter.convert(mat));
if (index == 0) {
// 保存第一帧图片到本地
opencv_imgcodecs.imwrite("eguid.jpg", mat);
}
// 释放Mat资源
mat.release();
mat.close();
}
Thread.sleep(40);
index++;
}
cFrame.dispose();// 销毁窗口
grabber.stop();// 停止抓取器
// 手动释放资源
scalar1.close();
scalar2.close();
point1.close();
point2.close();
point3.close();