OpenCV提供了一些基本的Webcam控制接口。用OpenCV C/C++或者Python,可以在任意平台快速创建一个摄像头预览应用。然而使用Java,情况就复杂的多,因为OpenCV Java并没有提供一个类似于imshow的窗口显示接口。想要创建一个带界面的应用,就需要通过OpenCV接口获取数据,并转换成对应的格式,然后通过Java的UI组件显示出来。

OpenCV Java安装

在OpenCV官网下载最新的Windows安装包。

安装后找到目录opencv-4.3\opencv\build\java。

如果用Eclipse,可以直接导入工程。如果用Maven,需要先安装到Maven的本地仓库:

mvn install:install-file -Dfile=opencv-430.jar -DgroupId=org -DartifactId=opencv -Dversion=4.3.0 -Dpackaging=jar

然后在pom.xml文件里添加依赖:

org

opencv

4.3.0

还有一个问题就是dll文件怎么加载。如果找不到,会看到错误信息:

Exception in thread "main" java.lang.UnsatisfiedLinkError: no opencv_java430 in java.library.path

at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1867)

at java.lang.Runtime.loadLibrary0(Runtime.java:870)

at java.lang.System.loadLibrary(System.java:1122)

at com.java.barcode.App.main(App.java:65)

解决方法有几种:

查看系统中的Java库加载路径。把dll文件放到对应的路径下即可: System.out.println(System.getProperty("java.library.path"));

使用全路径加载: System.load("D:/opencv-4.3/opencv/build/java/x64/opencv_java430.dll");

启动程序的时候指定dll路径: java -Djava.library.path= -cp target/opencv-dotcode-1.0-SNAPSHOT-jar-with-dependencies.jar com.java.barcode.App

摄像头视频窗口

在OpenCV Java的文档中提供了一份基于JavaFX的示例代码。

参考逻辑之后,也可以把代码移植到Java Swing中。我这里用JLable来显示视频帧:

public void updateViewer(final BufferedImage image) {

if (!SwingUtilities.isEventDispatchThread()) {

SwingUtilities.invokeLater(new Runnable() {

@Override

public void run() {

mImage.setIcon(new ImageIcon(image));

}

});

return;

}

}

Runnable frameGrabber = new Runnable() {

@Override

public void run() {

Mat frame = grabFrame();

byte[] data = Utils.matToByteArray(frame);

if (!status.get()) {

status.set(true);

barcodeTimer.schedule(new BarcodeRunnable(frame, mBarcodeReader, callback, status), 0, TimeUnit.MILLISECONDS);

}

BufferedImage bufferedImage = Utils.byteToBufferedImage(data, frame.width(), frame.height(), frame.channels());

if (isRunning) updateViewer(bufferedImage);

}

};

this.timer = Executors.newSingleThreadScheduledExecutor();

this.timer.scheduleAtFixedRate(frameGrabber, 0, 33, TimeUnit.MILLISECONDS);

OpenCV接口运行在独立的线程中,需要通过SwingUtilities来更新UI。

示例:DotCode解码

在pom.xml中添加Dynamsoft Barcode Reader SDK:

dbr

https://download.dynamsoft.com/maven/dbr/jar

com.dynamsoft

dbr

7.4.0

然后像OpenCV一样创建一条线程来做条形码解码。

barcodeTimer = Executors.newSingleThreadScheduledExecutor();

Runnable中的代码:

public void run() {

// TODO Auto-generated method stub

try {

TextResult[] results = reader.decodeBuffer(Utils.matToByteArray(frame), frame.width(), frame.height(), (int)frame.step1(), EnumImagePixelFormat.IPF_BGR_888, "");

if (results != null && results.length > 0) {

if (callback != null) {

callback.onResult(results, Utils.matToBufferedImage(frame));

}

}

else {

status.set(false);

}

} catch (BarcodeReaderException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

OpenCV获取的数据类型是Mat。

条形码解码的时候要把Mat转换成byte[]:

public static byte[] matToByteArray(Mat original)

{

int width = original.width(), height = original.height(), channels = original.channels();

byte[] sourcePixels = new byte[width * height * channels];

original.get(0, 0, sourcePixels);

return sourcePixels;

}

而在显示画面的时候,要把数据再转成BufferedImage:

public static BufferedImage byteToBufferedImage(byte[] sourcePixels, int width, int height, int channels)

{

BufferedImage image = null;

if (channels > 1)

{

image = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);

}

else

{

image = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY);

}

final byte[] targetPixels = ((DataBufferByte) image.getRaster().getDataBuffer()).getData();

System.arraycopy(sourcePixels, 0, targetPixels, 0, sourcePixels.length);

return image;

}

最后通过自定义的JLable来绘制条形码的区域:

private ArrayList data = new ArrayList<>();

@Override

protected void paintComponent(Graphics g) {

super.paintComponent(g);

Graphics2D g2d = (Graphics2D) g.create();

if (data.size() > 0) {

g2d.setColor(Color.RED);

for (Point[] points : data) {

for (int i = 0; i < points.length; ++i) {

if (i == 3) {

g2d.drawLine(points[i].x, points[i].y, points[0].x, points[0].y);

} else {

g2d.drawLine(points[i].x, points[i].y, points[i + 1].x, points[i + 1].y);

}

}

}

}

g2d.dispose();

}

public void appendPoints(Point[] points) {

data.add(points);

}

public void clearPoints() {

data.clear();

}

源码

opencv java 摄像头_使用OpenCV Java创建Windows摄像头扫码程序相关推荐

  1. opencv java 灰度_如何使用Java将图像转换为灰度?

    在Java语言编程中,如何使用Java将图片转换为灰度? 注意:需要访问网址:http://book2s.com/java/jar/o/opencv/download-opencv-3.2.0-0.h ...

  2. java 打开笔记本摄像头_如何使用java启用电脑的摄像头摄相拍照

    在Java语言编程中,如何使用java启用电脑的摄像头摄相拍照? 注意:需要访问网址: , 下载一个OpenCV软件包.这里下载最新版本:opencv-3.2.0-vc14.exe并解压此文件到D:s ...

  3. eclipse无法创建java虚拟机_手把手:Java内存泄漏分析Memory Analyzer Tool

    点击上方"IT牧场",选择"设为星标"点击上方"IT牧场",选择"设为星标"技术干货每日送达 阅读文本大概需要3分钟. ...

  4. opencv获取外接摄像头_利用opencv从USB摄像头获取图片

    由于opencv自带的VideoCapture函数直接从usb摄像头获取视频数据,所以用这个来作为实时的图像来源用于实体检测识别是很方便的. 1. 安装opencv 安装的步骤可以按照之前这个文章操作 ...

  5. eclipse 创建java文件_如何在eclipse创建Java类文件呢?

    现在,很多读者都会对Eclipse工具已经有大体的认识,本次教程将会为大家介绍如何使用Eclipse完成Hello,java程序的频讲解,那么.在Eclipsea中编写java程序,必须先创建项目,那 ...

  6. jetson nano opencv 打开 CSI摄像头_技术文章—选择嵌入式视觉摄像头需考虑哪些方面...

    功能强大的精简型单板计算机的推出催生了令人兴奋的新产品设计.在通过小型化优化成本及(或)效率的应 用中,它的效用尤为明显.另外,视觉系统可以利用功能全面的板级机器视觉摄像头进一步缩小产品总体尺寸 并实 ...

  7. opencv 检测几何图形_使用OpenCV + ConvNets检测几何形状

    opencv 检测几何图形 A simple yet powerful pipeline for detecting shapes in scanned documents 一个简单而强大的管道,用于 ...

  8. python opencv 图像切割_【OpenCV+Python】图像的基本操作与算术运算

    图像的基本操作 在上个教程中,我们介绍了使用鼠标画笔的功能.本次教程,我们将要谈及OpenCV图像处理的基本操作. 本次教程的所有操作基本上都和Numpy相关,而不是与OpenCV相关.要使用Open ...

  9. groovy 使用java类_深入学习java中的Groovy 和 Scala 类

    前言 Java 传承的是平台,而不是语言.有超过 200 种语言可以在 JVM 上运行,它们之中不可避免地会有一种语言最终将取代 Java 语言,成为编写 JVM 程序的最佳方式.本系列将探讨三种下一 ...

最新文章

  1. OpenCV中imread/imwrite与imdecode/imencode的异同
  2. 谷歌大幅削减其应用商店服务费
  3. 利用JFreeChart生成简单柱状图(Java)
  4. python double语法_python上手--基本语法和数据类型基础
  5. LELE的RPG难题
  6. React系列---Webpack环境搭建(二)不同环境不同配置
  7. 【Prince2科普】P2七大主题之商业论证
  8. java 注解scheduler_JAVA注解@Scheduled 不执行
  9. 吴恩达《机器学习训练秘籍》完整中文版,现在可免费下载 | 资源
  10. C# WPF ASP.net 上传多文件和数据
  11. MAC系统镜像几个版本的下载链接
  12. 微博html5版是电脑还是手机,搜狐微博推出手机触屏版 采用HTML5技术
  13. dell服务器u盘启动找不到硬盘,dell台式机u盘装系统启动找不到硬盘怎么办?dell找不到硬盘原因...
  14. NSDate计算时间差
  15. nrf51822+rfx2401c系统板(开源原理图、PCB)
  16. MySql下载及安装部署
  17. window下查看TCP端口连接情况:netstat -ano -p tcp|findstr 10001
  18. 立德教育净利润下滑四成:股价早已“腰斩”,拟并购一所高校
  19. 学子论文:Digg.com:投票的动力因素分析
  20. java女程序员工作_女生适合做java程序员吗 女java程序员好找工作

热门文章

  1. 为什么说OLAP产品毁了BI?
  2. 新会计科目的编号及内容
  3. 外国人起争执时最常说的话
  4. 红米note2移动4g在哪里显示无服务器,红米note2移动版能用联通4g吗?红米note2插联通卡用法介绍...
  5. c语言机器人编程软件,Coconut编程机器人软件官方版下载_Coconut编程机器人软件 v1.3.4官方版 - Win7旗舰版...
  6. 微信小程序轮播中的current_微信小程序 swiper轮播图的按钮切换
  7. mac mysql 连接超时时间设置_MAC下mysql安装连接问题
  8. mysql开源内库_将内裤穿在外面的男人(mysql)
  9. android final函数,Android 回调函数 解析问题
  10. Python正则表达式-常用函数的基本使用