javacpp-opencv影像處理之2:實時影片添加圖片水印,實現不同大小圖片疊加,影像透明度控制,文字和圖片雙水印

  • 2019 年 11 月 1 日
  • 筆記

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

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

前言:

本章通過javaCV-openCV處理影像,其中javaCV部分負責攝影機抓取和Frame、Mat轉換操作,openCV負責影像載入、影像保存以及 影像疊加、感興趣區域和透明度處理。

1、實現的功能

(1)攝影機影片抓取

(2)影片幀Frame與Mat影像相互轉換

(3)影像載入級影像保存

(4)影像疊加、影像感興趣區、影像透明處理

(5)文字疊加、字體大小、粗度、顏色及平滑處理等

2、程式碼實現

// 轉換器,用於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 point = new Point(10, 50);  		// 顏色,使用黃色  		Scalar scalar = new Scalar(0, 255, 255, 0);  		Frame frame = null;  		int index = 0;    		Mat logo = opencv_imgcodecs.imread("4ycfb.png");  		Mat mask = opencv_imgcodecs.imread("4ycfb.png", 0);    		opencv_imgproc.threshold(mask,mask,254,255,opencv_imgcodecs.IMWRITE_PNG_BILEVEL);    		double alpha = 0.5;// 影像透明權重值,0-1之間  		while (cFrame.isShowing()) {  			if ((frame = grabber.grabFrame()) != null) {  				// 取一幀影片(影像),並轉換為Mat  				Mat mat = converter.convertToMat(grabber.grabFrame());    				// 加文字水印,opencv_imgproc.putText(圖片,水印文字,文字位置,字體,字體大小,字體顏色,字體粗度,平滑字體,是否翻轉文字)  				opencv_imgproc.putText(mat, "eguid!", point, opencv_imgproc.CV_FONT_VECTOR0, 1.2, scalar, 1, 20, false);  				// 定義感興趣區域(位置,logo影像大小)  				Mat ROI = mat.apply(new Rect(400, 350, logo.cols(), logo.rows()));    				opencv_core.addWeighted(ROI, alpha, logo, 1.0 - alpha, 0.0, ROI);  				// 把logo影像複製到感興趣區域  //				 logo.copyTo(ROI, mask);  				// 顯示影像到窗口  				cFrame.showImage(converter.convert(mat));  				if (index == 0) {  					// 保存第一幀圖片到本地  					opencv_imgcodecs.imwrite("eguid.jpg", mat);  				}  				// 釋放Mat資源  				ROI.release();  				ROI.close();  				mat.release();  				mat.close();  				Thread.sleep(40);  				index++;  			}    			index++;  		}  		// 關閉窗口  		cFrame.dispose();  		// 停止抓取器  		grabber.stop();  		// 釋放資源  		logo.release();  		logo.close();  		mask.release();  		mask.close();  		scalar.close();  		point.close();

3、測試結果

左上角的eguid!是文字水印,右下角的是圖片水印,中間是圖片上傳到csdn時添加的文字水印