一、簡介
JavaCV使用來自計算機視覺領域(OpenCV, FFmpeg, libdc1394, PGR FlyCapture, OpenKinect, librealsense, CL PS3 Eye Driver, videoInput, ARToolKitPlus, flandmark, Leptonica, and Tesseract)領域的研究人員常用庫的JavaCPP預設的封裝。提供實用程序類,使其功能更易於在Java平台上使用,包括Android。
二、案例1:調用攝像頭
(1)使用IDEA新建Maven項目,然后在pom.xml中引入下列依賴(因為要用到opencv來實現,所以需要引入opencv-platform包,此包會自動引入各大平台的依賴jar(內含dll)):
<!-- https://mvnrepository.com/artifact/org.bytedeco/javacv-platform --> <dependency> <groupId>org.bytedeco</groupId> <artifactId>javacv-platform</artifactId> <version>1.4.1</version> </dependency> <!-- https://mvnrepository.com/artifact/org.bytedeco.javacpp-presets/opencv-platform --> <dependency> <groupId>org.bytedeco.javacpp-presets</groupId> <artifactId>opencv-platform</artifactId> <version>3.4.1-1.4.1</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency>
(2)測試類
import org.bytedeco.javacv.*; import org.junit.Test; import javax.swing.*; import java.util.EnumSet; public class JavaCVTest { @Test public void testCamera() throws InterruptedException, FrameGrabber.Exception { OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0); grabber.start(); //開始獲取攝像頭數據 CanvasFrame canvas = new CanvasFrame("攝像頭");//新建一個窗口 canvas.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); canvas.setAlwaysOnTop(true); while (true) { if (!canvas.isDisplayable()) {//窗口是否關閉 grabber.stop();//停止抓取 System.exit(-1);//退出 } Frame frame = grabber.grab(); canvas.showImage(frame);//獲取攝像頭圖像並放到窗口上顯示, 這里的Frame frame=grabber.grab(); frame是一幀視頻圖像 Thread.sleep(50);//50毫秒刷新一次圖像 } } @Test public void testCamera1() throws FrameGrabber.Exception, InterruptedException { VideoInputFrameGrabber grabber = VideoInputFrameGrabber.createDefault(0); grabber.start(); CanvasFrame canvasFrame = new CanvasFrame("攝像頭"); canvasFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); canvasFrame.setAlwaysOnTop(true); while (true) { if (!canvasFrame.isDisplayable()) { grabber.stop(); System.exit(-1); } Frame frame = grabber.grab(); canvasFrame.showImage(frame); Thread.sleep(30); } } }
(3)兩種方法的測試效果: