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時添加的文字水印
