1. 程式人生 > >java+WebCam 識別二維碼

java+WebCam 識別二維碼

專案中需要用到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); } }