二維條形碼比普通的條形碼能保存更多的信息,已經應用到很多領域里面。例如手機電影票,就是一個嵌在彩信里面的二維碼圖像。南航也推出了網上辦理登機牌業務,辦理完成之后往手機發送一條包含二維碼的彩信,到了機場就可以通過自助設備掃描二維碼,打印登機牌。
然而,專業的二維碼掃描設備價格十分昂貴,最便宜的都在1000元以上,到淘寶上搜搜就知道了。借助Java和一個開源的庫,我們卻可以通過普通的網絡攝像頭實現相同的效果,成本只需要幾十塊。
Open Source QR Code Library是一個開源的QR Code(二維條形碼的一種)生成和讀取的庫,官方網站為:http://qrcode.sourceforge.jp/,里面包含了生成和讀取QR Code的所有代碼,其中有個jmfexample就能實現通過攝像頭讀取QR Code,經過本人嘗試,幾十塊的普通攝像頭效果已經不錯了,一次讀取幾百字節都沒問題。
使用這個庫的步驟如下:
1、到其官方網站下載回來;
2、到sun的網站下載JMF包并安裝;
3、插上攝像頭,打開我的電腦,查看是否出現“USB視頻設備”,然后打開,看攝像頭工作是否正常
4、運行JMF里面的JMF Registry程序,點擊“Detect Capture Devices”,查找視頻設備,查找到之后會在左邊的列表里出現“vfw:Microsoft WDM Image Capture (Win32):0”類似的設備,點擊就會在右邊出現其詳細信息,我的攝像頭是這樣的:
Name = vfw:Microsoft WDM Image Capture (Win32):0
Locator = vfw://0
Output Formats---->
0. javax.media.format.YUVFormat
? YUV Video Format: Size = java.awt.Dimension[width=640,height=480] MaxDataLength = 614400 DataType = class [B yuvType = 32 StrideY = 1280 StrideUV = 1280 OffsetY = 0 OffsetU = 1 OffsetV = 3
1. javax.media.format.YUVFormat
? YUV Video Format: Size = java.awt.Dimension[width=160,height=120] MaxDataLength = 38400 DataType = class [B yuvType = 32 StrideY = 320 StrideUV = 320 OffsetY = 0 OffsetU = 1 OffsetV = 3
2. javax.media.format.YUVFormat
? YUV Video Format: Size = java.awt.Dimension[width=176,height=144] MaxDataLength = 50688 DataType = class [B yuvType = 32 StrideY = 352 StrideUV = 352 OffsetY = 0 OffsetU = 1 OffsetV = 3
3. javax.media.format.YUVFormat
? YUV Video Format: Size = java.awt.Dimension[width=320,height=240] MaxDataLength = 153600 DataType = class [B yuvType = 32 StrideY = 640 StrideUV = 640 OffsetY = 0 OffsetU = 1 OffsetV = 3
4. javax.media.format.YUVFormat
? YUV Video Format: Size = java.awt.Dimension[width=352,height=288] MaxDataLength = 202752 DataType = class [B yuvType = 32 StrideY = 704 StrideUV = 704 OffsetY = 0 OffsetU = 1 OffsetV = 3
注意,其中Output Formats都是javax.media.format.YUVFormat,而QR Code Library里默認的設備不是這種格式的,所以需要對源碼作一定的修改。
5、用Eclipse打開QR Code Library的源碼,作出一些適當的修改:
如果攝像頭是上面所說的只支持YUV格式,則需要修改jp.sourceforge.qrcode.example.jmf.camDataSource.java,把setMainSource函數里的
VideoFormat vidformat = new VideoFormat(VideoFormat.RGB);
修改為
VideoFormat vidformat = new VideoFormat(VideoFormat.YUV);
否則永遠也找不到攝像頭。
6、把JMF包里的jmf.jar放到Classpath里
7、執行jp.sourceforge.qrcode.example.jmf.jmfexample,搞定
當然,由于源碼開放的,只要符合許可,你想怎么改都行,可以把它嵌入到某個應用程序里面,這個程序就具有了掃描QR Code的功能了。