引入依赖
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv</artifactId>
<version>1.5.10</version>
</dependency>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacpp</artifactId>
<version>1.5.10</version>
<classifier>windows-x86_64</classifier>
</dependency>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>opencv</artifactId>
<version>4.9.0-1.5.10</version>
<classifier>windows-x86_64</classifier>
</dependency>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>openblas</artifactId>
<version>0.3.26-1.5.10</version>
<classifier>windows-x86_64</classifier>
</dependency>
注意:这里使用的是1.5.10版本;对应的opencv是4.9.0版本;
如果在使用过程中版本过高,则需要降低javacv的版本,对应的opencv的版本也需要降低
由于是在windows环境开发时使用,所以这里引入依赖时使用的classifier是windows-x86_64;如果生产环境则需要根据具体的环境修改classifer(如果是linux环境则需要使用linux-x86_64),最好是maven打包时能够根据部署环境的不同打包方式不同:
<profiles>
<profile>
<id>dev</id>
<dependencies>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacpp</artifactId>
<version>1.5.10</version>
<classifier>windows-x86_64</classifier>
</dependency>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>opencv</artifactId>
<version>4.9.0-1.5.10</version>
<classifier>windows-x86_64</classifier>
</dependency>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>openblas</artifactId>
<version>0.3.26-1.5.10</version>
<classifier>windows-x86_64</classifier>
</dependency>
</dependencies>
</profile>
<profile>
<id>prd</id>
<dependencies>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacpp</artifactId>
<version>1.5.10</version>
<classifier>linux-x86_64</classifier>
</dependency>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>opencv</artifactId>
<version>4.9.0-1.5.10</version>
<classifier>linux-x86_64</classifier>
</dependency>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>openblas</artifactId>
<version>0.3.26-1.5.10</version>
<classifier>linux-x86_64</classifier>
</dependency>
</dependencies>
</profile>
</profiles>
使用这种方式配置后,如果是dev环境,打包时会使用windows-x86_64的jar包;如果是prd环境,打包时会使用linux-x86_64的jar包
识别二维码
这里直接给出代码
package cn.busframework.qrcode;
import org.bytedeco.javacpp.BytePointer;
import org.bytedeco.opencv.opencv_core.StringVector;
import org.bytedeco.opencv.opencv_wechat_qrcode.WeChatQRCode;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import java.io.File;
import java.net.URISyntaxException;
import java.nio.charset.StandardCharsets;
import static org.bytedeco.opencv.global.opencv_imgcodecs.imread;
public class QrcodeTests {
@Test
public void testRead() throws URISyntaxException {
File qrcodeFile = new File(Thread.currentThread().getContextClassLoader().getResource("qrcode.jpg").toURI());
WeChatQRCode we = new WeChatQRCode();
StringVector stringVector = we.detectAndDecode(imread(qrcodeFile.getAbsolutePath()));
if (!stringVector.empty()) {
BytePointer bytePointer = stringVector.get(0);
byte[] buffer = bytePointer.getStringBytes();
System.out.println(new String(buffer, 0, buffer.length - 1, StandardCharsets.UTF_8));
}
}
}
代码中读取的是类路径下的qrcode.jpg图片,从中解析图片中第一个验证码的内容;
需要注意的是:
1、qrcode.jpg图片的全路径中不能包含中文或空格,否则图片将无法解析。
2、代码中引入的类需要是org.bytedeco包下的类,否则图片将无法解析。