JavaCV調用攝像頭並保存圖片

首先要引入javaCV的Maven依賴

<dependency>
    <groupId>org.bytedeco</groupId>
    <artifactId>javacv-platform</artifactId>
    <version>1.4.3</version>
</dependency>

在引入該依賴後javaCV會加載相應平臺的jar包,打開相應平臺的jar包可以看到其中包含相應的dll文件。
 

package com.wxj233.bean;

import org.bytedeco.javacv.FrameGrabber.Exception;
import org.bytedeco.javacv.OpenCVFrameGrabber;

/**
 * @version 0.0.1
 * @since 2018/12/18
 * @author wxj233
 * 攝像頭參數設置
 */
public class Camera {

	/**
	 * 是否存儲圖片
	 * @author wxj233
	 */
	public static enum Img{
		save,
		nosave
	}
	
	/**
	 * 是否正常啓動攝像頭 true:正常啓動/false:異常啓動
	 */
	public static boolean InitCamera;
	
	/**
	 * 攝像頭資源
	 */
	public static OpenCVFrameGrabber grabber;
	
	/**
	 * 是否保存圖片,默認不保存
	 */
	public static Img saveImage = Img.nosave;
	
	/**
	 * 開始攝像頭
	 * @throws Exception 攝像頭初始化失敗!
	 */
	public static void StartCamera() throws Exception {
			grabber.start();
	}
	
	/**
	 * 停止攝像頭
	 * @throws Exception 攝像頭關閉異常!
	 */
	public static void StopCamera() throws Exception {
			grabber.stop();
	}
}
package com.wxj233.System.init;

import javax.annotation.PostConstruct;


import org.bytedeco.javacv.FrameGrabber.Exception;
import org.bytedeco.javacv.OpenCVFrameGrabber;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.wxj233.bean.Camera;
import com.wxj233.serviceImp.SyLogServiceImp;

/**
 * @version 0.0.1
 * @since 2018/12/18
 * @author wxj233
 *
 */
@Component
public class CameraTimerInit {

	@Autowired
	SyLogServiceImp syLogService;
	
	/**
	 * 初始化攝像頭
	 */
	@PostConstruct
	void CameraInit(){
		Camera.grabber = new OpenCVFrameGrabber(0);
		try {
			Camera.StartCamera();
			Camera.InitCamera = true; //攝像頭正常啓動
			syLogService.info(CameraTimerInit.class, "初始化攝像頭!");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			Camera.InitCamera = false;  //攝像頭啓動失敗
			syLogService.info(CameraTimerInit.class, "請檢查攝像頭是否正常或驅動是否更新!");
			//e.printStackTrace();
		}
		
	}
	
}
package com.wxj233.Timer;


import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.atomic.AtomicLong;
import org.bytedeco.javacpp.opencv_core.Mat;
import org.bytedeco.javacpp.opencv_imgcodecs;
import org.bytedeco.javacv.FrameGrabber.Exception;
import org.bytedeco.javacv.OpenCVFrameConverter;
import org.bytedeco.javacv.OpenCVFrameGrabber;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import com.wxj233.bean.Camera;
import com.wxj233.util.SystemUtilServiceImp;

/**
 * @version 0.0.1
 * @since 2018/12/18
 * @author wxj233
 * 開啓攝像頭抓拍
 */
@Component
public class CameraTimer {

	@Autowired
	SystemUtilServiceImp systemUtilService;
	
	//原子類產生不重複數據
	AtomicLong generator = new AtomicLong();
	
	public static OpenCVFrameConverter.ToIplImage converter = new OpenCVFrameConverter.ToIplImage();
	
	@Scheduled(cron = "0/5 * * * * ?")
	public void getPhoto() {
		//System.out.println("抓拍!");
		OpenCVFrameGrabber grabber = Camera.grabber;
		try {
			if(Camera.InitCamera) {
				Mat mat = converter.convertToMat(grabber.grabFrame());
				
				if(Camera.saveImage == Camera.Img.save) {
				//SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日HH時mm分ss秒");javaCV不支持中文路徑
				SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
				Date date = new Date();
				String imgname = format.format(date) + "Num" + String.valueOf(generator.incrementAndGet());
				opencv_imgcodecs.imwrite(systemUtilService.getWebPath("/WEB-INF/CameraPhoto/") + imgname +".jpg", mat);
				}
			}
			} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

相關鏈接:

javacv開發詳解之1:調用本機攝像頭視頻(建議使用javaCV最新版本)

javacv實現人臉檢測

JAVA中通過JavaCV實現跨平臺視頻/圖像處理-調用攝像頭

javaCV下載鏈接:https://www.softpedia.com/get/Programming/Other-Programming-Files/JavaCV.shtml

JavaCV讀寫包含中文路徑的圖片

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章