原文:https://blog.csdn.net/yushulx/article/details/52788051

用OpenCV Python来开发,如果想要用到一些C/C++的图像处理库,就需要创建Python的C/C++扩展,然后把数据从Python传递到底层处理。这里分享下如何在C/C++层获取数据。

参考原文:How to Convert OpenCV Image Data from Python to C

作者:Xiao Ling

翻译:yushulx

开发环境

  • Dynamsoft Barcode Reader 4.2
  • Python version: 2.7.0
  • OpenCV version: 2.4.10. Download cv2.pyd
  • Windows 10
  • USB webcam

Python C/C++扩展

把DynamsoftBarcodeReaderx86.dll和cv2.pyd拷贝到目录Python27\Lib\site-packages。

OpenCV Python获取的图像数据类型是numpy.ndarray:

> rval, frame = vc.read();
> print type(frame)
> <type 'numpy.ndarray'>

在C层我们希望能获取到数据的指针。查看OpenCV源码文件opencv\modules\python\src2\cv2.cv.hpp可以找到方法:

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 data
int width = pai->shape[1];       // image width
int height = pai->shape[0];      // image height
int size = pai->strides[0] * pai->shape[0]; // image size = stride * height

这样就可以了。现在可以用这个数据做点事情,比如调用barcode接口来做检测。我依然用Dynamsoft Barcode Reader SDK做示例。首先需要构建一下数据:

char *total = (char *)malloc(size + 40); // buffer size = image size + header size
memset(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 top
char *data = total + 40;
int stride = pai->strides[0];
for (int i = 1; i <= height; i++) {memcpy(data, buffer + stride * (height - i), stride);data += stride;
}

接下来就可以检测barcode了:

// 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;for (int i = 0; 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);

在Windows上构建Python扩展需要先设置一下,不然会出错。我使用Visual Studio 2015。命令行如下:

SET VS90COMNTOOLS=%VS140COMNTOOLS%
python setup.py build install

好了。现在可以用Python脚本来调用了。首先打开摄像头:

import cv2
from dbr import *
import timevc = cv2.VideoCapture(0)

接下来读取一帧的数据:

cv2.imshow(windowName, frame)
rval, frame = vc.read();

现在可以实时检测barcode了:

initLicense("<license>") # Invalid license is fine.
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"

源码

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

如何把OpenCV Python获取的图像传递到C层处理相关推荐

  1. Python 把OpenCV 获取的图像传递到C

    Python 把OpenCV 获取的图像传递到C 2016年10月11日 14:47:49 阅读数:1946 用OpenCV Python来开发,如果想要用到一些C/C++的图像处理库,就需要创建Py ...

  2. 使用OpenCV python模块读取图像并将其另存为灰度系统

    In Python, we can use an OpenCV library named cv2. Python does not come with cv2, so we need to inst ...

  3. OpenCV Python教程(2、图像元素的访问、通道分离与合并)

    OpenCV Python教程之图像元素的访问.通道分离与合并 转载请详细注明原作者及出处,谢谢! 访问像素 像素的访问和访问numpy中ndarray的方法完全一样,灰度图为: [python] v ...

  4. pythonopencv读取图像属性_2、OpenCV Python 图像属性获取

    __author__ = "WSX" import cv2 as cv import numpy as np image = cv.imread("1.JPG" ...

  5. opencv python 从摄像头获取视频、帧率、分辨率等属性设置和使用

    opencv python 从摄像头获取视频.帧率.分辨率等属性设置和使用 文章目录: 1,为了获取视频,你应该创建一个 VideoCapture 对象.他的参数可以是设备的索引号,或者是一个视频文件 ...

  6. OpenCV python(二)图像预处理:改变图像大小 提取感兴趣区域

    OpenCV python(二)图像预处理:改变图像大小 && 提取感兴趣区域 一.改变图像大小 1.获取图像宽.高.通道数 2.resize函数 3.案例 二.ROI感兴趣区域 1. ...

  7. 使用Python,OpenCV+OCR检测护照图像中的机器可读区域(MRZ Machine-Readable Zones)

    使用Python,OpenCV+OCR检测护照图像中的机器可读区域(MRZ Machine-Readable Zones) 1. 效果图 2. 原理 3. 源码 参考 这篇博客将介绍如何只使用基本的图 ...

  8. OpenCV Python教程(1、图像的载入、显示和保存)

    本文是OpenCV  2 Computer Vision Application Programming Cookbook读书笔记的第一篇.在笔记中将以Python语言改写每章的代码. PythonO ...

  9. openCV—Python(6)—— 图像算数与逻辑运算

    openCV-Python(6)-- 图像算数与逻辑运算 一.函数简介 1.add-图像矩阵相加 函数原型:add(src1, src2, dst=None, mask=None, dtype=Non ...

最新文章

  1. Java中如何合并有个具有相同key的Map
  2. STM32开发 -- 继电器测试
  3. 类Xadmin插件--海豚插件
  4. 游标操作 for Oracle
  5. leetcode—— 401. 二进制手表(使用到将数字转换为字符)
  6. 国土部明确地面光伏、分布式光伏用地政策
  7. java怎么销毁session_【Java】问题:Session的销毁方式到底有哪些?
  8. 使用EasyExcel上传下载excel
  9. 基于单片机1KW高频感应加热器控制系统仿真设计(毕设)
  10. 怎样在JavaScript添加图片
  11. HRBU_20211112训练
  12. 百度地图 ( 一 ) 显示地图
  13. 公司口碑及待遇评价的网站
  14. 赛维安讯LiveCloud直播云服务介绍
  15. 基于S7-1200 PLC实现PIDNN控制仿真
  16. centos安装easy_install
  17. python短网址转换
  18. 解决:操作必须使用一个可更新的查询
  19. 蝴蝶,螺旋结构和中微子
  20. [music]Brand new day--Ryan Star

热门文章

  1. mysql怎么在海量数据上ddl_浅谈MySQL Online DDL(中)
  2. nginx 正则匹配优化(一)
  3. OpenStack 关于admin-openrc.sh的作用(Queens版本)
  4. git 提交到某分支_Git如何拉取某个分支的某段提交
  5. 锁屏界面提示某些设置已隐藏_iOS 13隐藏手电筒和相机快捷图标
  6. 程序控制发送文件到邮箱_Intouch邮件发送的真实案例(一),不可多得的技术尝试...
  7. s()++php,jquery siblings()函数正确用法
  8. python从入门到项目实战李兴华网盘_贺胜军Python轻松入门到项目实战【经典完整版】...
  9. JWT 和 JJWT,别再傻傻分不清了!
  10. 冰岛试行四天工作制大获成功:每周缩短五小时,生产力没变!