java+WebCam 識別二維碼
阿新 • • 發佈:2019-01-02
專案中需要用到webcam攝像頭去掃描二維碼,網上找來相關的Demo拿來用,稍作修改去使用,在除錯過程中遇到各種奇葩的錯誤,最終除錯成功,攝像頭成功掃描到二維碼資訊。下面總結一下:
除錯過程中遇到的問題基本上是由於缺少java編譯是需要的包檔案,需要用到一下依賴的包:
webcam-capture-0.3.10.jar
zxing-1.6-core.jar
zxing-javase.jar
slf4j-simple-1.6.1.jar
slf4j-api-1.7.2.jar
bridj-0.7-20140918.jar
如果是在raspberry pi 卡片是電腦上使用還需要載入Driver驅動包,
webcam-capture-driver-v4l4j-0.3.11.jar
v4l4j-0.9.1-r507-sources.jar
此外需要在程式中加入如下程式碼:
static { Webcam.setDriver(new V4l4jDriver()); }
如果不加入以上包和程式碼,程式會報如下錯誤:
依賴包下載連線(here)
程式碼如下:
WebcamQRDemo.java
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.image.BufferedImage;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import com.github.sarxos.webcam.Webcam;
import com.github.sarxos.webcam.WebcamPanel;
import com.github.sarxos.webcam.WebcamResolution;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.LuminanceSource;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.NotFoundException;
import com.google.zxing.Result;
import com.google.zxing.client.j2se.
BufferedImageLuminanceSource;
import com.google.zxing.common.HybridBinarizer;
public class WebcamQRDemo extends JFrame implements Runnable, ThreadFactory {
private static final long serialVersionUID =6441489157408381878L;
private Executor executor =Executors.newSingleThreadExecutor(this);
private Webcam webcam = null;
private WebcamPanel wpanel = null;
private JTextArea textarea = null;
public static void main(String[] args) {
// TODO Auto-generated method stub
new WebcamQRDemo();
}
public WebcamQRDemo() {
super();
setLayout(new FlowLayout());
setTitle("Read QR / Bar Code With Webcam");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Dimension size = WebcamResolution.QVGA.getSize();
webcam = Webcam.getWebcams().get(1);
webcam.setViewSize(size);
wpanel = new WebcamPanel(webcam);
wpanel.setPreferredSize(size);
textarea = new JTextArea();
textarea.setEditable(false);
textarea.setPreferredSize(size);
add(wpanel);
add(textarea);
pack();
setVisible(true);
executor.execute(this);
}
@Override
public Thread newThread(Runnable r) {
// TODO Auto-generated method stub
Thread t = new Thread(r, "example-runner");
t.setDaemon(true);
return t;
}
@Override
public void run() {
// TODO Auto-generated method stub
do {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
Result result = null;
BufferedImage image = null;
if (webcam.isOpen()) {
if ((image = webcam.getImage()) == null) {
continue;
}
LuminanceSource source =new BufferedImageLuminanceSource( image) ;
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
try {
result = new MultiFormatReader().decode(bitmap);
} catch (NotFoundException e) {
// fall thru, it means there is no QR code in image
}
}
if (result != null) {
textarea.setText(result.getText());
System.out.println(result.getText());
}
} while (true);
}
}