JavaCV的攝像頭實戰之四:抓圖

程式設計師欣宸發表於2022-01-27

歡迎訪問我的GitHub

這裡分類和彙總了欣宸的全部原創(含配套原始碼):https://github.com/zq2599/blog_demos

本篇概覽

  • 本文是《JavaCV的攝像頭實戰》的第四篇,也是整個系列最簡單輕鬆的一篇,寥寥幾行程式碼實現從攝像頭抓圖的功能;

    編碼

  • 《JavaCV的攝像頭實戰之一:基礎》一文建立的<font color="red">simple-grab-push</font>工程中已寫好父類<font color="blue">AbstractCameraApplication</font>,本篇繼續使用該工程,建立子類實現那些抽象方法即可
  • 編碼前先回顧父類的基礎結構,如下圖,粗體是父類定義的各個方法,紅色塊都是需要子類來實現抽象方法,所以接下來,我們們以本地視窗預覽為目標實現這三個紅色方法即可:

在這裡插入圖片描述

  • 雖然父類要求子類必須實現這三個方法:initOutput、output、releaseOutputResource,但是實際上只有<font color="blue">output</font>方法中有程式碼,其他兩個是空方法;
  • 新建檔案<font color="blue">GrabImageFromCamera.java</font>,這是AbstractCameraApplication的子類,其程式碼很簡單,接下來按上圖順序依次說明
  • 定義三個成員變數,作用分別是:指定圖片檔案存放路徑(請自行調整)、圖片格式、當前程式已儲存圖片數量:
    // 圖片儲存路徑的字首(請根據自己電腦情況調整)
    protected String IMAGE_PATH_PREFIX = "E:\\temp\\202111\\28\\camera-"
            + new SimpleDateFormat("yyyyMMddHHmmss").format(new Date())
            + "-";

    // 圖片格式
    private final static String IMG_TYPE = "jpg";

    /**
     * 當前程式已經儲存的圖片數量
     */
    private int saveNums = 0;
  • 初始化的時候啥也不用做,對應的結束前的也沒有資源需要釋放,所以initOutput和releaseOutputResource都是空方法:
   @Override
    protected void initOutput() throws Exception {
        // 啥也不用做
    }
    
    @Override
    protected void releaseOutputResource() {
        // 啥也不用做
    }
  • 接下來是output方法,這裡面用幀物件生成圖片:
    @Override
    protected void output(Frame frame) throws Exception {
        // 圖片的儲存位置
        String imagePath = IMAGE_PATH_PREFIX + (saveNums++) + "." + IMG_TYPE;

        // 把幀物件轉為Image物件
        BufferedImage bufferedImage = converter.getBufferedImage(frame);

        // 儲存圖片
        ImageIO.write(bufferedImage, IMG_TYPE, new FileOutputStream(imagePath));

        log.info("儲存完成:{}", imagePath);
    }
  • 最後重寫getInterval方法,表示每存一張圖片就sleep一秒鐘:
    @Override
    protected int getInterval() {
        // 表示儲存一張圖片後會sleep一秒鐘
        return 1000;
    }
  • 至此,抓圖功能已開發完成,再寫上main方法,注意引數<font color="blue">10</font>表示持續執行10秒鐘:
    public static void main(String[] args) {
        // 連續十秒執行抓圖操作
        new GrabImageFromCamera().action(10);
    }
  • 執行main方法,控制檯輸出如下:
...
08:57:42.393 [main] INFO com.bolingcavalry.grabpush.camera.AbstractCameraApplication - 初始化完成,耗時[8515]毫秒,幀率[30.0],影像寬度[1280],影像高度[720]
08:57:43.110 [main] INFO com.bolingcavalry.grabpush.camera.GrabImageFromCamera - 儲存完成:E:\temp\202111\28\camera-20211130085733-0.jpg
08:57:44.155 [main] INFO com.bolingcavalry.grabpush.camera.GrabImageFromCamera - 儲存完成:E:\temp\202111\28\camera-20211130085733-1.jpg
08:57:45.193 [main] INFO com.bolingcavalry.grabpush.camera.GrabImageFromCamera - 儲存完成:E:\temp\202111\28\camera-20211130085733-2.jpg
08:57:46.243 [main] INFO com.bolingcavalry.grabpush.camera.GrabImageFromCamera - 儲存完成:E:\temp\202111\28\camera-20211130085733-3.jpg
08:57:47.287 [main] INFO com.bolingcavalry.grabpush.camera.GrabImageFromCamera - 儲存完成:E:\temp\202111\28\camera-20211130085733-4.jpg
08:57:48.348 [main] INFO com.bolingcavalry.grabpush.camera.GrabImageFromCamera - 儲存完成:E:\temp\202111\28\camera-20211130085733-5.jpg
08:57:49.430 [main] INFO com.bolingcavalry.grabpush.camera.GrabImageFromCamera - 儲存完成:E:\temp\202111\28\camera-20211130085733-6.jpg
08:57:50.479 [main] INFO com.bolingcavalry.grabpush.camera.GrabImageFromCamera - 儲存完成:E:\temp\202111\28\camera-20211130085733-7.jpg
08:57:51.547 [main] INFO com.bolingcavalry.grabpush.camera.GrabImageFromCamera - 儲存完成:E:\temp\202111\28\camera-20211130085733-8.jpg
08:57:52.551 [main] INFO com.bolingcavalry.grabpush.camera.AbstractCameraApplication - 輸出結束
[ WARN:0] global D:\a\javacpp-presets\javacpp-presets\opencv\cppbuild\windows-x86_64\opencv-4.5.3\modules\videoio\src\cap_msmf.cpp (438) `anonymous-namespace'::SourceReaderCB::~SourceReaderCB terminating async callback

Process finished with exit code 0
  • 開啟圖片檔案所在目錄,如下圖,圖片已經成功生成:

在這裡插入圖片描述

  • 看其中一張的詳情也符合預期:

在這裡插入圖片描述

  • 至此,我們們抓圖功能完成,接下來請繼續關注欣宸原創,《JavaCV的攝像頭實戰》系列還會呈現更多豐富的應用;

原始碼下載

名稱連結備註
專案主頁https://github.com/zq2599/blo...該專案在GitHub上的主頁
git倉庫地址(https)https://github.com/zq2599/blo...該專案原始碼的倉庫地址,https協議
git倉庫地址(ssh)git@github.com:zq2599/blog_demos.git該專案原始碼的倉庫地址,ssh協議
  • 這個git專案中有多個資料夾,本篇的原始碼在<font color="blue">javacv-tutorials</font>資料夾下,如下圖紅框所示:

在這裡插入圖片描述

  • <font color="blue">javacv-tutorials</font>裡面有多個子工程,《JavaCV的攝像頭實戰》系列的程式碼在<font color="red">simple-grab-push</font>工程下:

在這裡插入圖片描述

你不孤單,欣宸原創一路相伴

https://github.com/zq2599/blog_demos

相關文章