javacpp-opencv圖像處理之1:實時視頻添加文字水印並截取視頻圖像保存成圖片,實現文字水印的字體、位置、大小、粗度、翻轉、平滑等操作

  • 2019 年 11 月 1 日
  • 筆記

版權聲明:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。

本文鏈接:https://blog.csdn.net/eguid_1/article/details/53236923

前言:

本章全部採用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!是本程序添加的