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!是本程式添加的
