首页 > 编程语言 >Java识别图片二维码

Java识别图片二维码

时间:2024-12-26 18:33:24浏览次数:3  
标签:Java resultPoint opencv 二维码 new println import 识别

方法一:ZXing

使用ZXing识别,可以返回二维码识别内容,还可以找到二维码的位置坐标。

1、引入依赖

    implementation group: 'com.google.zxing', name: 'core', version: '3.5.3'
    implementation group: 'com.google.zxing', name: 'javase', version: '3.5.3'

2、识别代码

import com.google.zxing.*;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.common.HybridBinarizer;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;

/**
 * @author zhengqian
 * @since 2024.12.26
 */
public class ZXingQRCode {

    public static void main(String[] args) {
        String urlPath = "https://url";
        zxing(urlPath);
    }

    public static void zxing(String urlPath) {
        try {
            // 读取二维码图片文件
//            File file = new File("二维码图片1.png");
//            BufferedImage image = ImageIO.read(file);
            
            URL url = new URL(urlPath);
            BufferedImage image = ImageIO.read(url);
            // 使用LuminanceSource和Binarizer将图片转化为二进制数据
            LuminanceSource source = new BufferedImageLuminanceSource(image);
            BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
            // 创建一个解码器
            Result qrCodeResult = new MultiFormatReader().decode(bitmap);
            // 输出解码结果
            System.out.println("二维码内容: " + qrCodeResult.getText());
            // 解码
            ResultPoint[] resultPoint = qrCodeResult.getResultPoints();
            System.out.println("二维码坐标:\npoints1: " + resultPoint[0] + ",\npoints2: " + resultPoint[1] + ",\npoints3: "
                    + resultPoint[2] + ",\npoints4: " + resultPoint[3]);

            // 获得二维码坐标
            float point1X = resultPoint[0].getX();
            float point1Y = resultPoint[0].getY();
            float point2X = resultPoint[1].getX();
            float point2Y = resultPoint[1].getY();
            // 宽高
            final int w = (int) Math
                    .sqrt(Math.abs(point1X - point2X) * Math.abs(point1X - point2X) + Math.abs(point1Y - point2Y) * Math.abs(point1Y - point2Y))
                    + 12 * (7 - 1);
            final int h = w;
            System.out.println("二维码宽高:" + h);

        } catch (NotFoundException e) {
            System.out.println("二维码未找到");
            // 这里判断如果识别不了带LOGO的图片,重新添加上一个属性
            try {
                URL url = new URL(urlPath);
                BufferedImage image = ImageIO.read(url);
                LuminanceSource source = new BufferedImageLuminanceSource(image);
                Binarizer binarizer = new HybridBinarizer(source);
                BinaryBitmap binaryBitmap = new BinaryBitmap(binarizer);
                Map<DecodeHintType, Object> hints = new HashMap<>(3);
                // 设置编码格式
                hints.put(DecodeHintType.CHARACTER_SET, "UTF-8");
                // 设置优化精度
                hints.put(DecodeHintType.TRY_HARDER, Boolean.TRUE);
                // 设置复杂模式开启
                hints.put(DecodeHintType.PURE_BARCODE, Boolean.TYPE);
                // 解码
                Result result = new MultiFormatReader().decode(binaryBitmap, hints);
                System.out.println("图片中内容:  ");
                System.out.println("content: " + result.getText());
            } catch (IOException e1) {
                e1.printStackTrace();
            } catch (NotFoundException e1) {
                e1.printStackTrace();
            }
        } catch (IOException e) {
            System.out.println("二维码读取错误");
            e.printStackTrace();
        }
    }
}


方法二 使用opencv

1、引入依赖

    // opencv
    implementation group: 'org.bytedeco', name: 'opencv', version: '4.10.0-1.5.11'
    implementation group: 'org.bytedeco', name: 'javacpp', version: '1.5.11'
    implementation group: 'org.bytedeco', name: 'openblas', version: '0.3.28-1.5.11'
    implementation group: 'org.bytedeco', name: 'javacv-platform', version: '1.5.11'

2、识别代码


import org.bytedeco.opencv.opencv_core.Mat;
import org.bytedeco.opencv.opencv_core.StringVector;
import org.bytedeco.opencv.opencv_wechat_qrcode.WeChatQRCode;

import java.nio.charset.StandardCharsets;

import static org.bytedeco.opencv.global.opencv_imgcodecs.imread;

/**
 * @author zhengqian
 * @since 2024.12.26
 */
public class OpenCVQRCode {

    public static void main(String[] args) {
        String filePath = "二维码图片1.png";
        wechat(filePath);
    }

    public static void wechat(String filePath) {
        Mat img = imread(filePath);
        WeChatQRCode we = new WeChatQRCode();
        StringVector stringVector = we.detectAndDecode(img);
        if (stringVector.empty()) {
            System.out.println("not found");
        }
        System.out.println("识别内容:" + stringVector.get(0).getString(StandardCharsets.UTF_8));

        // 不过暂时不太清楚怎么输出二维码坐标。。。
    }
}

标签:Java,resultPoint,opencv,二维码,new,println,import,识别
From: https://www.cnblogs.com/ylty/p/18633946

相关文章

  • 押题率高达97%!Java面试突击八股文,五面阿里终拿下!!
    进大厂是大部分程序员的梦想,而进大厂的门槛也是比较高的,所以这里整理了一份阿里、 美团、 滴​​​​​​滴、头条等大厂面试大全,其中概括的知识点有:Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、Redis、MySQL、Spring、SpringBoot、SpringCloud、RabbitM......
  • 使用vosk模型进行语音识别
    importwaveimportsysimportjsonfromvoskimportModel,KaldiRecognizer,SetLogLevel#Youcansetloglevelto-1todisabledebugmessagesSetLogLevel(-1)wf=wave.open(sys.argv[1],"rb")ifwf.getnchannels()!=1orwf.getsampwidth()!......
  • Java中使用redis作为消息队列
    Java中使用redis作为消息队列使用redis作为消息队列在Java中使用Redis作为消息队列,可以通过Redis的List​数据结构或者Pub/Sub​模式来实现。以下是一个简单的示例,展示了如何使用Redis的List​作为消息队列。1.使用Redis的List作为消息队列Redis的List​数据结构非常适合用来......
  • 纯JS加密+时间校验(没引用任何框架),Java解密
    1、JS加密functioncaesarEncrypt(text,shift){ letstr="G7bCk1Xf2A9qLmJ0pVrTz5D4oS6wEhN"+Date.now().toString(); returnstr.split('') .map(char=>String.fromCharCode(char.charCodeAt(0)+3)) .join('');}2、Java校验......
  • Java重要面试名词整理(五):Redis
    文章目录Redis高级命令Redis持久化RDB快照(snapshot)**AOF(append-onlyfile)****Redis4.0混合持久化**管道(Pipeline)**StringRedisTemplate与RedisTemplate详解**Redis集群方案gossip脑裂RedisLuaRedisMultiLockRedis红锁缓存相关问题**缓存穿透****缓存失效(击穿)****......
  • 摄像头挪动角度识别智慧矿山一体机关于智慧矿山系统在全球矿业中的应用情况如何?
    随着科技的不断进步,全球矿业正经历着一场智能化的革命。智慧矿山系统的应用,不仅提高了矿业的效率和安全性,还推动了整个行业的可持续发展。本文将探讨智慧矿山系统在全球矿业中的应用情况,并深入分析其技术特点和发展趋势。一、智慧矿山系统在全球矿业中的应用情况如何1、发达国......
  • 农家乐系统|Java|SSM|VUE| 前后端分离
                 【技术栈】1⃣️:架构:B/S、MVC2⃣️:系统环境:Windowsh/Mac3⃣️:开发环境:IDEA、JDK1.8、Maven、Mysql5.7+4⃣️:技术栈:Java、Mysql、SSM、Mybatis-Plus、VUE、jquery,html5⃣️数据库可视化工具:navicat6⃣️服务器:SpringBoot自带apachetomca......
  • 企业销售人员培训系统|Java|SSM|VUE| 前后端分离
                  【技术栈】1⃣️:架构:B/S、MVC2⃣️:系统环境:Windowsh/Mac3⃣️:开发环境:IDEA、JDK1.8、Maven、Mysql5.7+4⃣️:技术栈:Java、Mysql、SSM、Mybatis-Plus、VUE、jquery,html5⃣️数据库可视化工具:navicat6⃣️服务器:SpringBoot自带apacheto......
  • 想到了个童年小游戏,2个人4只手就能玩,简单用JavaScript实现一下
    /** *规则:双方各有左右2个数,初始值为1。每回合,可以将自身的一个数与对方的一个数相加,然后模10。 *如,第一回合你操作:你(11)机器人(11)-->你(12)机器人(11) *下回合机器人操作:你(12)机器人(11)-->你(12)机器人(13) *第三回合你操作:你(12)机器人(13)-->你(15)机器人(13) *......
  • 【Java并发】读写锁ReadWriteLock
    目录什么是读写锁什么时候使用读写锁怎么使用读写锁 使用步骤1.创建 ReentrantReadWriteLock实例2.获取读锁和写锁3.锁和解锁完整代码使用读写锁的注意事项什么是读写锁ReadWriteLock是Java并发包(java.util.concurrent.locks)中提供的一种锁机制,旨在......