[CSharp]把WebCam當QRCode的DeCode解碼器

QRCode的使用可分成編碼EnCode及解碼DeCode二部份,在各種平台上也有需多人依據編碼規則製作了許多可用的解碼與編碼器,之前文章也介紹過 [Java]QRCode產生VCard使用的是swetake這個framework,不過現在已經有統一的單位在研究 ZXing (“Zebra Crossing”) ,而且各種平台上均提供原始碼供大家使用,對於解碼DeCode、解碼EnCode及歪斜辨識效果、速度都讓人滿意。

二維條碼Quick Response Code的發展上大都份落在手機平台上,在桌機上不像是一般的一維條碼有專用的條碼機,所以在就只能利用WebCam的影像解析功能,即時拍照給QRCode解碼器zxing解碼DeCode。

執行畫面:

產生QRCode,使用kayway網站來產生QRCode

generator.png

Start可以開始取得WebCam影像資料,而Stop會停止,Continue其實跟Start功能是一樣的。

openform.png

解碼成功時會顯示於下方TextBox,並停止再解碼,影像取得並不停止,使用continue會再次開始解碼QRCode。

QRCodeDecode.png

範例使用的是C#來製作Windows程式,使用的套件有zxing及WebCam_Capture,其中WebCam_Capture會使用到剪貼簿功能,大概是利用此功能來傳遞WebCam與GUI原件間的圖像,如果需要在解碼後複製內容的話,需要把WebCam功能停止,而解碼失敗判定則直接利用zxing解碼失敗會產生Exception,因為解碼速度很快,幾乎不會感覺到delay的狀況。ps.會慢的話是WebCam_Capture在慢。

28 thoughts to “[CSharp]把WebCam當QRCode的DeCode解碼器”

  1. 版主您好:
    版主所發布的這篇剛好與我現在作的論文有關,不知是否可請版主提供開發環境。
    謝謝您~

  2. 請問一下這個掃描器
    用webcam拍攝
    由於我用在手機上
    手機上的qrcode不是有個定位的方塊
    產生的方塊大小如何改變
    想把定位方快變大 有辦法嗎

    製作qrcode的方法是從大大上一篇產生qrcode出來的^^

    1. 其實那個方塊是個假像而已…
      只是利用一個遮色片遮在那裡而已…
      並不會真的影響解碼能力

  3. this.textBox1.Text = “checking”;
    System.Drawing.Bitmap img = new System.Drawing.Bitmap(this.pictureBox1.Image, this.pictureBox1.Image.Size);
    thread1 obj = new thread1(img, this);
    System.Threading.Thread t = new System.Threading.Thread(obj.runMe);

    t.Start();

    上面段source code 是放在哪的??

    我用eclipse 可以用這段code嗎??

    1. 他的code lib是給csharp用的,如果你有裝eclipse的csharp開發環境是可以用的,否則則不行

  4. 版主您好:
     我想請問關於QRcode解碼的部份是否有C/C++的範例程式,或有可以更改輸入跟輸出方式的解碼範例,因為已經蒐尋很久實在找不到,所以想求助於版主,我的開發環境是Visual Studio 2008。

  5. 你好啊,那是不是,ENCODE跟DECODE都是一套用C#的語言寫的?!

    1. 其實不一定的….zxing他就提供多種程式語言的方式decode跟encode,你可以參考看看
      或著如果怕麻煩的話直接取用它complier好的dll,用程式呼叫dll指令也是可以的

  6. vCard 可以用WEBCAM scan嗎?scan其他可以,但vCard 是error??
    加我的msn ok?? (就是那個email,,我是香港的)

  7. 版主你好:
    請問該如何在thread1的class外(form1的class裡面)取得他解碼出來的文字呢?

  8. 版主你好:
    請問如何在thread1的class外面(form1的class裡面)取得解碼出來的字串呢?

    1. 你把解碼出來的東西set回去form裡的一個變數…然後再呼叫invoke去顯示在畫面上

  9. 版主你好:
    請問有沒有方法可以得知被分析的qrcode是位於圖片中的何處呢?

  10. 版主你好,執行檔與原始碼連結已經失效了,可否補上 謝謝

  11. 版主您好,請問您有在Win10下執行過嗎?

    我依照這個方法在開發環境Win7筆電下可以使用,
    但是拿到測試的Win10平板上,就無法開啟WebCam

    按下”Start”後出現錯誤訊息如下:

    An error ocurred while capturing the video image. The video capture will now be terminated.
    並未將物件參考設定為物件的執行個體

    請問是否有解??

    麻煩您了!

    1. 不好意思,我並沒有測試過windows 10喔
      如果您有找到解決方法,再請您告知,
      謝謝

      1. 版主您好,我使用您的程式修改成解析一維條碼,
        您程式內的舊版zxing.dll 不支援解析Code 93,
        新版的ZXing.Net.0.16.4.0有支援,新舊版的參數差異為RGBLuminanceSource,
        需將System.Drawing.Bitmap轉換為 byte[],
        我加入了函式 byte[] GetRGBValues,程式加入這個函式之後變得很難掃描條碼,
        且目前掃描出來的數字並不是正確的,還會辨識成錯誤格式
        請問版主,我是否在轉換的過程出了什麼問題呢?
        還是說新版的還要另外解析WebCam的圖檔呢?

        麻煩您了,謝謝!

  12. 版主您好,我成功將您的程式碼修改成可辨識一維條碼。
    但目前遇到一個問題,Code 93 無法辨識。
    查詢了相關資訊,發現版主使用的舊版zxing.dll未支援Code 93
    下載了新版的ZXing.Net.0.16.4.0,並且載入dll檔執行,
    遇到的問題為須將System.Drawing.Bitmap轉換為 byte[]

    ZXing.LuminanceSource source = new RGBLuminanceSource(GetRGBValues(picDecode), picDecode.Width, picDecode.Height);

    但目前掃描出來的數字並不是正確的,新舊版的參數差異為RGBLuminanceSource,
    我加入了函式 byte[] GetRGBValues,
    private byte[] GetRGBValues(System.Drawing.Bitmap picDecode)
    {
    // Lock the bitmap’s bits.
    System.Drawing.Rectangle rect = new System.Drawing.Rectangle(0, 0, picDecode.Width, picDecode.Height);
    System.Drawing.Imaging.BitmapData bmpData = picDecode.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadOnly, picDecode.PixelFormat);

    // Get the address of the first line.
    IntPtr ptr = bmpData.Scan0;

    // Declare an array to hold the bytes of the bitmap.
    int bytes = bmpData.Stride * picDecode.Height;
    byte[] rgbValues = new byte[bytes];
    // Copy the RGB values into the array.
    System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes);
    picDecode.UnlockBits(bmpData);

    return rgbValues;
    }

    請問版主,我是否在轉換的過程出了什麼問題呢?
    程式加入這個函式之後變得很難掃描條碼,
    還是說新版的還要另外解析webcam的圖檔呢?

    麻煩您了,謝謝!

  13. 版主您好,舊版的zxing.dll沒有支援Code 93
    但使用新版的ZXing.dll無法解析條碼
    請問您有什麼建議嗎
    謝謝

發表迴響