2019独角兽企业重金招聘Python工程师标准>>>

树莓派小而强大,有非常多的应用场景。这里分享下使用树莓派,摄像头,以及C和Python代码来实现一个条形码扫描工具。之前分享过如何把OpenCV Python获取的图像传递到C层处理,会用到里面的代码。

测试环境

  • 设备: Raspberry Pi 3
  • 系统: RASPBIAN JESSIE WITH PIXEL

准备工作

  • Dynamsoft Barcode Reader for Raspberry Pi
  • Python 2.7.0
  • OpenCV 3.0.0
  • Raspberry Pi 2 or 3
  • USB webcam

编译和安装

如何在树莓派上编译安装OpenCV

1. 下载源代码。

2. 安装依赖库:

sudo apt-get install cmake
sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
sudo apt-get install libxvidcore-dev libx264-dev
sudo apt-get install python-dev

3. 设置编译环境:

cd ~/opencv-3.0.0/
mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE \-D CMAKE_INSTALL_PREFIX=/usr/local \-D INSTALL_C_EXAMPLES=ON \-D INSTALL_PYTHON_EXAMPLES=ON \-D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-3.0.0/modules \-D BUILD_EXAMPLES=ON ..

4. 编译安装OpenCV:

make -j4
sudo make install

生成的动态链接库会被安装到/usr/local/lib/python2.7/dist-packages/cv2.so。

使用Dynamsoft Barcode SDK创建Python扩展

1. 下载SDK。

2. 创建符号链接:

sudo ln –s <Your dbr path>/lib/libDynamsoftBarcodeReader.so /usr/lib/libDynamsoftBarcodeReader.so

3. 编辑setup.py。设置头文件和库文件路径:

include_dirs=["/usr/lib/python2.7/dist-packages/numpy/core/include/numpy", "<Your dbr path>/include"],
library_dirs=['<Your dbr path>/lib'],

4. 编译安装Python扩展:

sudo python setup.py build install

实现decodeBuffer接口

底层的C代码是从windows版本上移植过来的。需要添加一些定义:

typedef unsigned long DWORD;
typedef long LONG;
typedef unsigned short WORD;typedef struct tagBITMAPINFOHEADER {DWORD biSize;LONG biWidth;LONG biHeight;WORD biPlanes;WORD biBitCount;DWORD biCompression;DWORD biSizeImage;LONG biXPelsPerMeter;LONG biYPelsPerMeter;DWORD biClrUsed;DWORD biClrImportant;
} BITMAPINFOHEADER;

把Python的numpy数据转换成C。然后通过底层的接口检测识别条形码:

#include <ndarraytypes.h>static PyObject *
decodeBuffer(PyObject *self, PyObject *args)
{PyObject *o;if (!PyArg_ParseTuple(args, "O", &o))return NULL;PyObject *ao = PyObject_GetAttrString(o, "__array_struct__");PyObject *retval;if ((ao == NULL) || !PyCObject_Check(ao)) {PyErr_SetString(PyExc_TypeError, "object does not have array interface");return NULL;}PyArrayInterface *pai = (PyArrayInterface*)PyCObject_AsVoidPtr(ao);if (pai->two != 2) {PyErr_SetString(PyExc_TypeError, "object does not have array interface");Py_DECREF(ao);return NULL;}// Construct data with header info and image data char *buffer = (char*)pai->data; // The address of image dataint width = pai->shape[1];       // image widthint height = pai->shape[0];      // image heightint size = pai->strides[0] * pai->shape[0]; // image size = stride * heightchar *total = (char *)malloc(size + 40); // buffer size = image size + header sizememset(total, 0, size + 40);BITMAPINFOHEADER bitmap_info = {40, width, height, 0, 24, 0, size, 0, 0, 0, 0};memcpy(total, &bitmap_info, 40);// Copy image data to buffer from bottom to topchar *data = total + 40;int stride = pai->strides[0];int i = 1;for (; i <= height; i++) {memcpy(data, buffer + stride * (height - i), stride);data += stride;}// Dynamsoft Barcode Reader initialization__int64 llFormat = (OneD | QR_CODE | PDF417 | DATAMATRIX);int iMaxCount = 0x7FFFFFFF;ReaderOptions ro = {0};pBarcodeResultArray pResults = NULL;ro.llBarcodeFormat = llFormat;ro.iMaxBarcodesNumPerPage = iMaxCount;printf("width: %d, height: %d, size:%d\n", width, height, size);int iRet = DBR_DecodeBuffer((unsigned char *)total, size + 40, &ro, &pResults);printf("DBR_DecodeBuffer ret: %d\n", iRet);free(total); // Do not forget to release the constructed buffer // Get resultsint count = pResults->iBarcodeCount;pBarcodeResult* ppBarcodes = pResults->ppBarcodes;pBarcodeResult tmp = NULL;retval = PyList_New(count); // The returned Python objectPyObject* result = NULL;i = 0;for (; i < count; i++){tmp = ppBarcodes[i];result = PyString_FromString(tmp->pBarcodeData);printf("result: %s\n", tmp->pBarcodeData);PyList_SetItem(retval, i, Py_BuildValue("iN", (int)tmp->llFormat, result)); // Add results to list}// release memoryDBR_FreeBarcodeResults(&pResults);Py_DECREF(ao);return retval;
}

树莓派条形码扫描应用

如何用OpenCV Python设置帧率以及每一帧的宽高

可以参考官方文档Property identifier:

  • CV_CAP_PROP_FRAME_WIDTH: Width of the frames in the video stream.
  • CV_CAP_PROP_FRAME_HEIGHT: Height of the frames in the video stream.
  • CV_CAP_PROP_FPS: Frame rate.

如果设置失败,显示这些常量没有定义,可以直接输入值:

vc = cv2.VideoCapture(0)
vc.set(5, 30)  #set FPS
vc.set(3, 320) #set width
vc.set(4, 240) #set height

如何在Python应用中使用decodeBuffer():

while True:cv2.imshow(windowName, frame)rval, frame = vc.read();results = decodeBuffer(frame)if (len(results) > 0):print "Total count: " + str(len(results))for result in results:print "Type: " + types[result[0]]print "Value: " + result[1] + "\n"# 'ESC' for quitkey = cv2.waitKey(20)if key == 27:break

运行树莓派条形码扫描应用

1. 用树莓派2或者3连接一个USB摄像头。

2. 执行程序:

python app.py

源码

https://github.com/yushulx/opencv-python-webcam-barcode-reader/tree/master/raspberrypi

转载于:https://my.oschina.net/yushulx/blog/783559

树莓派应用:摄像头条形码扫描相关推荐

  1. 树莓派linux扫码枪,树莓派应用:摄像头条形码扫描

    树莓派小而强大,有非常多的应用场景.这里分享下使用树莓派,摄像头,以及C和Python代码来实现一个条形码扫描工具.之前分享过如何把OpenCV Python获取的图像传递到C层处理,会用到里面的代码 ...

  2. SAP UI5 应用开发教程之五十二 - 如何使用 SAP UI5 的标准控件结合 Cordova 插件调用手机摄像头进行条形码扫描试读版

    本教程之前的这几篇文章,算是围绕着 SAP UI5 和 Cordova 的一个小系列: SAP UI5 应用开发教程之四十八 - 如何在 SAP UI5 应用里开发条形码扫描功能 - 通过这篇文章介绍 ...

  3. SAP UI5 应用开发教程之五十二 - 如何使用 SAP UI5 的标准控件结合 Cordova 插件调用手机摄像头进行条形码扫描

    本教程之前的这几篇文章,算是围绕着 SAP UI5 和 Cordova 的一个小系列: SAP UI5 应用开发教程之四十八 - 如何在 SAP UI5 应用里开发条形码扫描功能 - 通过这篇文章介绍 ...

  4. H5调摄像头并扫描条形码初探

    最近公司有个业务,是要在pad版调取摄像头并扫描条形码.一开始觉得这个功能无从下手,光是调取一个摄像头就应该挺费事的,更何况还要扫描条形码. 但是诸如微信这些流行的APP也都内嵌了这种功能,可惜大厂们 ...

  5. 利用条形码扫描技术的智能仓储管理解决方案

    许多企业正转向智能化的仓库管理方案,从而极大提高生产效率.机器视觉技术使许多企业能够通过读取可靠的条形码标签进行商品跟踪.但是,如果使用条形码作为智能仓储管理的解决方案,我们需要考虑什么呢? 一个现代 ...

  6. 不借助 Fiori client,直接在手机浏览器里调用 SAP UI5 BarcodeScanner 实现条形码扫描的可能性?

    这个 StackOverflow 讨论 说不可行. sap.ndc.BarcodeScanner 在命名空间 sap.ndc 下声明. 这里的"ndc"代表 Native Devi ...

  7. SAP UI5 应用开发教程之四十八 - 如何在 SAP UI5 应用里开发条形码扫描功能试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...

  8. opensll、libcurl库安装的使用,树莓派CSI摄像头的配置,树莓派调用智能API平台实现人脸识别、树莓派配置中文环境

    接着上一节人工智能翔云平台介绍: 人工智能OCR识别: OCR 是英文Optical Character Recognition的缩写,意思是光学字符识别,也可简单地称为文字识别,是文字自动输入的一种 ...

  9. 关于iOS原生条形码扫描,你需要注意的两三事

    前言 这篇文章是我们在新发布的  礼物说 的iOS端开发过程中遇到的一些关于条形码的问题总结而来. 本文记录的问题是:当AVFoundation使用多译码器扫描的时候.二维码是秒杀,但是条形码却经常扫 ...

最新文章

  1. Redis集群:哨兵(Sentinel)
  2. 每天一道LeetCode-----删除链表倒数第n个节点
  3. elasticsearch id查询_互联网公司中对【Elasticsearch】的真实应用案例
  4. mongodb 多表查询
  5. 一个简单又高效的日志系统
  6. 删除顺序表中重复元素,并按照原序输出
  7. 对象序列化与反序列化(二进制 byte[])
  8. 流计算及在特来电监控引擎中的实践
  9. 创业者妻子发声力挺老公:合伙创业七年未分股份被踢出局
  10. 初级会计资料-常用会计公式(三)
  11. 【ERROR】java java.lang.NoClassDefFoundError 的解决办法(全)
  12. 电脑配置要多少功率的电源?电源功率越大越好吗?
  13. 深度操作系统20.7正式发布
  14. 操作系统之页面置换算法(FIFO、LFU、LRU、OPT算法)
  15. node mysql商城开发_NideShop:基于Node.js+MySQL开发的微信小程序商城开源啦
  16. 第一个项目:D触发器,DFRB1C。
  17. 华为云CDN加速,让你告别网速慢的烦恼
  18. 全栈工程师真的全栈吗?
  19. pycharm中创建包时加入的_init_.py文件及_all_的作用
  20. 响应式手机商城页面顶部样式HTML代码

热门文章

  1. AI综述专栏 | 基于深度学习的目标检测算法综述
  2. 2018AI最佳应用回顾
  3. SAP MM Overall Level 审批的采购申请中行项目里的成本中心必须是同一个!
  4. python刷CSDN阅读量
  5. jupyter写python的时候换行总是换到下一行的中间
  6. 2022年,哪些科技趋势将持续改变世界?这里有一份来自百度研究院的预测
  7. 2021年值得关注的人工智能与机器学习的五大趋势
  8. IEEE:2021年的机遇、挑战以及关键的科技趋势
  9. Nature突破:首个比头发丝还细的机器人诞生了!可用针头注射入人体
  10. 为何苹果为何苹果甘愿冒险自主研发芯片?