輕鬆使用OpenCV Python控制Webcam,讀取Barcode

雖然手機上Barcode應用已經很是流行,可是工做的時候仍是用Webcam比較方便。好比須要檢測Barcode,我只須要拿Webcam對着電腦屏幕或者紙張掃一下就能夠了。今天分享下如何輕鬆使用OpenCV控制Webcam,以及如何獲取一幀圖像作Barcode檢測。html

參考原文:Reading Barcode with Webcam in OpenCV and Pythonpython

做者:Xiao Linggit

翻譯:yushulxgithub

軟件安裝

  • Dynamsoft Barcode SDK: http://www.dynamsoft.com/Downloads/Dynamic-Barcode-Reader-Download.aspxweb

  • Python: https://www.python.org/ftp/python/ui

  • NumPy: http://sourceforge.net/projects/numpy/files/NumPy/spa

  • SciPy: http://sourceforge.net/projects/scipy/files/scipy/.net

  • OpenCV: http://sourceforge.net/projects/opencvlibrary/files/opencv-win/翻譯

控制Webcam,讀取Barcode

基本步驟:
code

  1. 拷貝<opencv_installation_dir>\build\python\2.7\x86\cv2.pyd到 <Python27>\Lib\site-packages\cv2.pyd。

  2. 建立一個工程目錄。

  3. 構建Python Barcode動態連接庫。

  4. 拷貝全部依賴的動態連接庫到工程目錄。

  5. 把Webcam鏈接到PC上。

  6. 建立Python腳本控制Webcam,捕捉Webcam圖像,並使用Python Barcode庫來讀取圖像中的Barcode。

使用Dynamsoft Barcode SDK建立Python Barcode動態連接庫

編譯Python Barcode動態連接庫。

#include "Python.h"
 
#include "If_DBR.h"
#include "BarcodeFormat.h"
#include "BarcodeStructs.h"
#include "ErrorCode.h"
 
#ifdef _WIN64
#pragma comment(lib, "DBRx64.lib")
#else
#pragma comment(lib, "DBRx86.lib")
#endif
 
void SetOptions(pReaderOptions pOption, int option_iMaxBarcodesNumPerPage, int option_llBarcodeFormat){
 
    if (option_llBarcodeFormat > 0)
        pOption->llBarcodeFormat = option_llBarcodeFormat;
    else
        pOption->llBarcodeFormat = OneD;
 
    if (option_iMaxBarcodesNumPerPage > 0)
        pOption->iMaxBarcodesNumPerPage = option_iMaxBarcodesNumPerPage;
    else
        pOption->iMaxBarcodesNumPerPage = INT_MAX;
 
}
 
static PyObject *
initLicense(PyObject *self, PyObject *args)
{
    char *license;
 
    if (!PyArg_ParseTuple(args, "s", &license)) {
        return NULL;
    }
 
    printf("information: %s\n", license);
 
    int ret = DBR_InitLicense(license);
 
    printf("return value = %d", ret);
 
    return Py_None;
}
 
static PyObject *
decodeFile(PyObject *self, PyObject *args)
{
    char *pFileName;
    int option_iMaxBarcodesNumPerPage = -1;
    int option_llBarcodeFormat = -1;
 
    if (!PyArg_ParseTuple(args, "s", &pFileName)) {
        return NULL;
    }
 
    pBarcodeResultArray pResults = NULL;
    ReaderOptions option;
    SetOptions(&option, option_iMaxBarcodesNumPerPage, option_llBarcodeFormat);
 
    int ret = DBR_DecodeFile(
        pFileName,
        &option,
        &pResults
        );
 
    if (ret == DBR_OK){
        int count = pResults->iBarcodeCount;
        pBarcodeResult* ppBarcodes = pResults->ppBarcodes;
        pBarcodeResult tmp = NULL;
 
        PyObject* list = PyList_New(count);
        PyObject* result = NULL;
 
        for (int i = 0; i < count; i++)
        {
            tmp = ppBarcodes[i];
            result = PyString_FromString(tmp->pBarcodeData);
 
            PyList_SetItem(list, i, Py_BuildValue("iN", (int)tmp->llFormat, result));
        }
 
        // release memory
        DBR_FreeBarcodeResults(&pResults);
 
        return list;
    }
 
    return Py_None;
}
 
static PyMethodDef methods[] = {
    { "initLicense", initLicense, METH_VARARGS, NULL },
    { "decodeFile", decodeFile, METH_VARARGS, NULL },
    { NULL, NULL }
};
 
PyMODINIT_FUNC
initDynamsoftBarcodeReader(void)
{
    Py_InitModule("DynamsoftBarcodeReader", methods);
}

具體請參考GitHub上的源碼。編譯成功以後請記得拷貝DynamsoftBarcodeReader.pydDynamsoftBarcodeReaderx64.dll /DynamsoftBarcodeReaderx86.dll到工程目錄中。

使用OpenCV打開Webcam

import cv2.cv as cv
 
title = "Dynamsoft Barcode Reader"
cv.NamedWindow(title, 1)
capture = cv.CaptureFromCAM(0)
 
while True:
    img = cv.QueryFrame(capture)
    cv.ShowImage(title, img)

使用OpenCV繪製顯示結果

line_type = cv.CV_AA
font = cv.InitFont(cv.CV_FONT_HERSHEY_COMPLEX,
                          0.1, 1, 1, 1, line_type)
fileName = 'test.jpg'
img = cv.QueryFrame(capture)
cv.SaveImage(fileName, img)
 
results = DynamsoftBarcodeReader.decodeFile(fileName)
top = 30
increase = 20
if results:
    for result in results:
        barcode_format = "Format: " + formats[result[0]]
        barcode_value = "Value: " + result[1]
        cv.PutText(img, barcode_format, (10, top), font, (254, 142, 20))
        top += increase
        cv.PutText(img, barcode_value, (10, top), font, (254, 142, 20))
        top += increase
        cv.PutText(img, "************************", (10, top), font, (254, 142, 20))
        top += increase
 
cv.ShowImage(title, img)

源碼

https://github.com/yushulx/webcam-barcode-reader

相關文章
相關標籤/搜索