首页 » 软件优化 » 使用OpenCV Java创建Windows摄像头扫码程序(路径条形码摄像头接口解码)

使用OpenCV Java创建Windows摄像头扫码程序(路径条形码摄像头接口解码)

南宫静远 2024-11-24 02:36:04 0

扫一扫用手机浏览

文章目录 [+]

安装后找到目录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文件里添加依赖:

使用OpenCV Java创建Windows摄像头扫码程序(路径条形码摄像头接口解码) 软件优化
(图片来自网络侵删)

<dependency> <groupId>org</groupId> <artifactId>opencv</artifactId> <version>4.3.0</version></dependency>

还有一个问题就是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=<dll path> -cp target/opencv-dotcode-1.0-SNAPSHOT-jar-with-dependencies.jar com.java.barcode.App摄像头视频窗口

在OpenCV Java的文档中提供了一份基于JavaFX的示例代码https://opencv-java-tutorials.readthedocs.io/en/latest/03-first-javafx-application-with-opencv.html。

参考逻辑之后,也可以把代码移植到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:

<repositories> <repository> <id>dbr</id> <url>https://download.dynamsoft.com/maven/dbr/jar</url> </repository></repositories><dependencies> <dependency> <groupId>com.dynamsoft</groupId> <artifactId>dbr</artifactId> <version>7.4.0</version> </dependency></dependencies>

然后像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<Point[]> data = new ArrayList<>(); @Overrideprotected 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();}

源码

https://github.com/yushulx/java-dotcode-reader

标签:

相关文章

图片传输协议,技术演进与未来展望

在数字化时代,图片作为信息传递的重要载体,其传输效率和质量直接影响着用户体验。图片传输协议,作为保障图片高效、安全传输的技术基石,...

软件优化 2024-12-25 阅读1 评论0

合作共赢,代理协议助力商业发展新篇章

在当今竞争激烈的市场环境中,合作已成为企业发展的关键。而合作代理协议作为一种重要的商务合作方式,不仅能够帮助企业拓展市场,实现资源...

软件优化 2024-12-25 阅读0 评论0

追溯语言起源,人类文明的曙光

自古以来,语言一直是人类文明的重要组成部分。追溯语言的起源,有助于我们更好地理解人类文明的演变过程。本文将从语言起源的背景、语言的...

软件优化 2024-12-25 阅读1 评论0

协议封装,构建高效数据交互的桥梁

随着信息技术的飞速发展,数据交互已成为各行各业不可或缺的环节。在数据交互过程中,协议封装技术发挥着至关重要的作用。本文将从协议封装...

软件优化 2024-12-25 阅读0 评论0

安农经代码,农业科技创新的智慧引擎

农业,作为国民经济的基础产业,其发展水平直接关系到国家粮食安全和农民增收。在新时代背景下,科技创新已成为推动农业发展的关键因素。安...

软件优化 2024-12-25 阅读0 评论0