二维码解码的过程(Java)-调用JavaCv 附源码

二维码解码的过程(Java)-调用JavaCv 附源码一 二维码识别的原理 二维码的原理主要是依靠斜左上方的三个矩形框来进行定位 然后解析图片的黑白像素对应计算机编码的 01 操作 本次练习我是调了 JavaCv 的库 所以代码的实现和原理没什么关系 只是了解一下 二 如何使用电脑实现二维码解码 1 首先调用电脑的摄像头

大家好,我是讯享网,很高兴认识大家。

 一、二维码识别的原理:

​    二维码的原理主要是依靠斜左上方的三个矩形框来进行定位,然后解析图片的黑白像素对应计算机编码的01操作,本次练习我是调了JavaCv的库,所以代码的实现和原理没什么关系,只是了解一下。

二、如何使用电脑实现二维码解码

1. 首先调用电脑的摄像头

使用了JavaCv库来实现调用摄像头,代码中调用的是默认的摄像头,并且将视频流放到了CanvasFrame窗口中以显示

VideoCapture capture = new VideoCapture(0)//0是索引,这里的意思是调用默认摄像头 CanvasFrame canvas = new CanvasFrame("Camera", CanvasFrame.getDefaultGamma() / capture.get(5));//这里创建了一个窗口用来显示视频 Mat frame = new Mat();//创建一个Mat类型的对象用来存储图像帧数据 capture.read(frame);//将摄像头中获取到一帧图片数据,并存储在可以展示的frame中 BufferedImage image = toBufferedImage(frame);//将图片帧转化成canvas窗口BufferedImage类 canvas.showImage(image);//在窗口中显示图片

讯享网

以上就实现了如何在图形界面中显示摄像头中获取的视频

2. 如何判断图片中是否有二维码

这里就直接调了MultiFormatReader类来判断所获取的图片是否有二维码,这里对每一张获取的图片进行二维码解码,若是找到了二维码且解码成功,就返回true,对以上操作进行try-catch,表示若是没找到则返回false,让外层代码继续执行。

讯享网try { // 转换图像为BinaryBitmap LuminanceSource source = new BufferedImageLuminanceSource(image); BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(source)); // 解码二维码 Result result = reader.decode(binaryBitmap); // 输出解码结果 String qrCodeContent = result.getText(); System.out.println("二维码内容: " + qrCodeContent); // 判断二维码内容是否为网址,如果是,则使用浏览器打开 if (isURL(qrCodeContent)) { Desktop.getDesktop().browse(new URI(qrCodeContent)); } return true; } catch (NotFoundException e) { // 如果未找到二维码,忽略异常,继续执行代码 } catch (IOException | URISyntaxException e) { throw new RuntimeException(e); } return false;

3. 解码的内容处理

因为本代码只是测试用,所以就直接将解码后的数据放在了控制台上,且防止一直识别,在识别成功一次后就直接关闭程序,但是如果里面的内容是一个网址的话,则跳转后再关闭

public static boolean isURL(String text) { try { URI uri = new URI(text); return uri.getScheme() != null && uri.getHost() != null; } catch (Exception e) { return false; } }

综上,就完成了二维码的解码操作

三、最终效果演示

因为我的电脑没有摄像头,所以直接用的,手机充当电脑的摄像头,接下来的图,是我调用摄像头以及识别二维码的效果演示图


讯享网

电脑摄像头展示:

测试用例二维码,以及输出在控制台上的解码内容:

四、源代码

讯享网import com.google.zxing.*; import com.google.zxing.client.j2se.BufferedImageLuminanceSource; import com.google.zxing.common.HybridBinarizer; import org.bytedeco.javacv.CanvasFrame; import org.bytedeco.opencv.opencv_core.Mat; import org.bytedeco.opencv.opencv_videoio.VideoCapture; import java.awt.*; import java.awt.image.BufferedImage; import java.awt.image.DataBufferByte; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; public class MyFrame { public static void main(String[] args) { VideoCapture capture = new VideoCapture(0); CanvasFrame canvas = new CanvasFrame("Camera", CanvasFrame.getDefaultGamma() / capture.get(5)); Mat frame = new Mat(); MultiFormatReader reader = new MultiFormatReader(); while(true) { capture.read(frame); BufferedImage image = toBufferedImage(frame); canvas.showImage(image); if (QRScan(reader, image)){ System.exit(1); } } } //扫描二维码的实现类,调用 public static boolean QRScan(MultiFormatReader reader, BufferedImage image) { try { // 转换图像为BinaryBitmap LuminanceSource source = new BufferedImageLuminanceSource(image); BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(source)); // 解码二维码 Result result = reader.decode(binaryBitmap); // 输出解码结果 String qrCodeContent = result.getText(); System.out.println("二维码内容: " + qrCodeContent); // 判断二维码内容是否为网址,如果是,则使用浏览器打开 if (isURL(qrCodeContent)) { Desktop.getDesktop().browse(new URI(qrCodeContent)); } return true; } catch (NotFoundException e) { // 如果未找到二维码,忽略异常,继续执行代码 } catch (IOException | URISyntaxException e) { throw new RuntimeException(e); } return false; } //将Mat图像帧转换为BufferedImage类型的图片 public static BufferedImage toBufferedImage(Mat matrix) { int type = BufferedImage.TYPE_BYTE_GRAY; //matrix的通道数大于1的情况 if (matrix.channels() > 1) { type = BufferedImage.TYPE_3BYTE_BGR; } int bufferSize = matrix.channels() * matrix.cols() * matrix.rows(); byte[] buffer = new byte[bufferSize]; //将图像放入字节数组的缓冲区 matrix.data().get(buffer); BufferedImage image = new BufferedImage(matrix.cols(), matrix.rows(), type); final byte[] targetPixels = ((DataBufferByte) image.getRaster().getDataBuffer()).getData(); System.arraycopy(buffer, 0, targetPixels, 0, buffer.length); return image; } //判断内容是否为网页 public static boolean isURL(String text) { try { URI uri = new URI(text); return uri.getScheme() != null && uri.getHost() != null; } catch (Exception e) { return false; } } }

小讯
上一篇 2025-03-06 15:45
下一篇 2025-03-17 08:27

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/64795.html