• javacpp-opencv图像处理之1:实时视频添加文字水印并截取视频图像保存成图片,实现文字水印的字体、位置、大小、粗度、翻转、平滑等操作


      欢迎大家积极开心的加入讨论群

    javaCV图像处理系列:

    前言:

    本章全部采用openCV中的Mat类型进行图像操作,Mat类型与CvMat和IplImage类型都可以代表和显示图像,但是,Mat类型侧重于计算,数学性较高,openCV对Mat类型的计算也进行了优化。而CvMat和IplImage类型更侧重于“图像”,openCV对其中的图像操作(缩放、单通道提取、图像阈值操作等)进行了优化。

    本章基于openCV来处理图像操作,除了基本的javacv.jar、javacpp.jar两个jar包外,还需要依赖opencv.jar、opencv-根据平台而定.jar。

    1、实现的功能

    (1)摄像头视频抓取

    (2)Frame和Mat相互转换

    (3)给图像添加文字

    (4)把添加水印文字的图像转换为Frame并显示到窗口

    (5)保存图片

    2、代码实现

    运行后会出现一个窗口,窗口中会实时显示日期和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();

    3、演示

    csdn的文字水印请自动忽略,只有左上角日期和中间两个蓝色的eguid!是本程序添加的










  • 相关阅读:
    oracle 聚合函数 LISTAGG ,将多行结果合并成一行
    oracle 数据库对于多列求最大值
    Java 简单的rpc 一
    centos7 安装php7
    win10下VM 中centos 安装共享文件
    CentOS7 cannot find a valid baseurl for repo base
    分布式事务
    利用虚拟映射文件加密大文件
    动态代理
    c++ 11 lambda表达式
  • 原文地址:https://www.cnblogs.com/eguid/p/6821570.html
Copyright © 2020-2023  润新知