歡迎訪問我的GitHub
這里分類和匯總了欣宸的全部原創(含配套原始碼):https://github.com/zq2599/blog_demos
本篇概覽
- 本文是《JavaCV的攝像頭實戰》的第四篇,也是整個系列最簡單輕松的一篇,寥寥幾行代碼實作從攝像頭抓圖的功能;
編碼
- 《JavaCV的攝像頭實戰之一:基礎》一文創建的simple-grab-push工程中已寫好父類AbstractCameraApplication,本篇繼續使用該工程,創建子類實作那些抽象方法即可
- 編碼前先回顧父類的基礎結構,如下圖,粗體是父類定義的各個方法,紅色塊都是需要子類來實作抽象方法,所以接下來,咱們以本地視窗預覽為目標實作這三個紅色方法即可:

-
雖然父類要求子類必須實作這三個方法:initOutput、output、releaseOutputResource,但是實際上只有output方法中有代碼,其他兩個是空方法;
-
新建檔案GrabImageFromCamera.java,這是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方法,注意引數10表示持續執行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/blog_demos):
| 名稱 | 鏈接 | 備注 |
|---|---|---|
| 專案主頁 | https://github.com/zq2599/blog_demos | 該專案在GitHub上的主頁 |
| git倉庫地址(https) | https://github.com/zq2599/blog_demos.git | 該專案原始碼的倉庫地址,https協議 |
| git倉庫地址(ssh) | [email protected]:zq2599/blog_demos.git | 該專案原始碼的倉庫地址,ssh協議 |
- 這個git專案中有多個檔案夾,本篇的原始碼在javacv-tutorials檔案夾下,如下圖紅框所示:

- javacv-tutorials里面有多個子工程,《JavaCV的攝像頭實戰》系列的代碼在simple-grab-push工程下:

你不孤單,欣宸原創一路相伴
https://github.com/zq2599/blog_demos
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/421704.html
標籤:Java
