歡迎訪問我的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的攝像頭實戰》系列還會呈現更多豐富的應用;
原始碼下載
- 《JavaCV的攝像頭實戰》的完整原始碼可在GitHub下載到,地址和連結資訊如下表所示(https://github.com/zq2599/blo...):
名稱 | 連結 | 備註 |
---|---|---|
專案主頁 | 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>工程下: