Python 把OpenCV 获取的图像传递到C
2016年10月11日 14:47:49

阅读数:1946

用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

Python 把OpenCV 获取的图像传递到C相关推荐

  1. 使用Python,OpenCV获取、更改像素,修改图像通道,剪裁ROI

    使用Python,OpenCV获取.更改像素,修改图像通道,剪裁ROI 1. 效果图 2. 源码 参考 这篇博客将介绍使用Python,OpenCV获取.更改像素,修改图像通道,截取图像感兴趣ROI: ...

  2. Python,OpenCV中的图像修复——cv2.inpaint()

    Python,OpenCV中的图像修复--cv2.inpaint 1. 效果图 2. 原理 3. 源码 参考 image inpainting 图像修改 这篇博客将介绍如何通过OpenCV中图像修复的 ...

  3. python使用openCV加载图像、并将BGR格式转换成HSV格式、定义HSV格式中需要分离颜色的掩码(掩模)区间(mask)、并使用mask信息进行颜色分离、BGR格式的图像转化为RGB、并可视化

    python使用openCV加载图像.并将BGR格式转换成HSV格式.定义HSV格式中需要分离颜色的掩码(掩模)区间(mask).并使用mask信息进行颜色分离.将BGR格式的图像转化为RGB.可视化 ...

  4. python使用OpenCV加载图像为RGB图并可视化加载的图像(Convert to RGB and show image)

    python使用OpenCV加载图像为RGB图并可视化加载的图像(Convert to RGB and show image) 目录 python使用OpenCV加载图像为RGB图并可视化加载的图像( ...

  5. 如何把OpenCV Python获取的图像传递到C层处理

    原文:https://blog.csdn.net/yushulx/article/details/52788051 用OpenCV Python来开发,如果想要用到一些C/C++的图像处理库,就需要创 ...

  6. C++和Python的OpenCV中关于图像坐标的注意事项

    基于C++的OpenCV: .at<float>(y, x) 先列再行 .size() 得到的是Mat的(高,宽) CUDA的GpuMat也是Mat(y,x) 先列再行 cv::Point ...

  7. 使用Python,OpenCV加载图像并将其显示在屏幕上?

    这篇博客展示了如何使用OpenCV从磁盘上读取图像,在屏幕上显示它,然后等待按键关闭窗口并终止脚本. cv2.imread() cv2.imwrite() cv2.imshow() cv2.imrea ...

  8. 如何使用Python在OpenCV中检测图像中的猫脸?

    haar 级联分类器是一种有效的对象检测方法.这是一种基于机器学习的方法.为了训练用于猫脸检测的haar级联分类器,该算法最初需要大量的正面图像(有猫脸的图像)和负面图像(没有猫脸的图像).分类器是从 ...

  9. 2 用python进行OpenCV实战之图像基本知识

    前言 在这一节,我们将学习图像的基本构成单元--像素,我们将详细的探讨什么是像素?像素是如何使用来构成图像的?然后学习如何通过OpenCV来获取和操纵像素. 1 什么是像素 所有的图像都包含一组像素, ...

最新文章

  1. QT的QXmlDefaultHandler类的使用
  2. 服务器虚拟化与虚拟容器,虚拟化与Docker
  3. java long类型转string_JavaSE的学习——数据类型
  4. windows 搜索文件
  5. HRESULT是什么类型
  6. STUN和TURN协议解析
  7. 聚簇索引和非聚簇索引的原理
  8. think in uml 2.1
  9. android 音频对比,差距只有安卓?索尼Zx300a与505全方位对比
  10. JDK版本切换——JDK1.1.1
  11. HTML签名生成图片+可加水印
  12. 【蓝桥杯】欧拉定理 + 欧拉数线性筛法
  13. go语言快速入门:流程控制(7)
  14. 【机器学习】在浏览器中训练模型
  15. MATLAB 声音文件处理
  16. 架构师之路---架构的演变详解
  17. 个人日记-纪录片《蓝海防线》观后感-20200921
  18. Android Camera2 相机拍照流程详解
  19. PHP接入网易易盾验证码
  20. Java工程师的职业规划,java迭代器实现原理

热门文章

  1. Virtio:针对 Linux 的 I/O 虚拟化框架
  2. 文件分享平台php源码,简易社会化用户文件分享系统 v1.0
  3. linux用数字方式显示文件权限,全面解析Linux数字文件权限
  4. 专题 18 Inline Assembly(在C语言中嵌套使用汇编)
  5. php排版word文档试卷,word选择题选项排版
  6. java getaccessflags_Java Method.getAccessFlags方法代码示例
  7. oracle缺少key xe.reg,【Oracle XE系列之一】Windows 7 64位安裝Oracle XE(32位)數據庫(REG_XE報錯、字符集、修改8080端口等)...
  8. 计算机里的音乐都是什么名字,PAPI
  9. Linux中文件描述符1,linux内核中的文件描述符(一)--基础知识简介
  10. 如何从 100 亿 URL 中找出相同的 URL?