歡迎訪問我的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) | git@github.com:zq2599/blog_demos.git | 該項目源碼的倉庫地址,ssh協議 |
- 這個git項目中有多個文件夾,本篇的源碼在javacv-tutorials文件夾下,如下圖紅框所示:
- javacv-tutorials里面有多個子工程,《JavaCV的攝像頭實戰》系列的代碼在simple-grab-push工程下: