如何把OpenCV Python获取的图像传递到C层处理
原文: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层处理相关推荐
- Python 把OpenCV 获取的图像传递到C
Python 把OpenCV 获取的图像传递到C 2016年10月11日 14:47:49 阅读数:1946 用OpenCV Python来开发,如果想要用到一些C/C++的图像处理库,就需要创建Py ...
- 使用OpenCV python模块读取图像并将其另存为灰度系统
In Python, we can use an OpenCV library named cv2. Python does not come with cv2, so we need to inst ...
- OpenCV Python教程(2、图像元素的访问、通道分离与合并)
OpenCV Python教程之图像元素的访问.通道分离与合并 转载请详细注明原作者及出处,谢谢! 访问像素 像素的访问和访问numpy中ndarray的方法完全一样,灰度图为: [python] v ...
- pythonopencv读取图像属性_2、OpenCV Python 图像属性获取
__author__ = "WSX" import cv2 as cv import numpy as np image = cv.imread("1.JPG" ...
- opencv python 从摄像头获取视频、帧率、分辨率等属性设置和使用
opencv python 从摄像头获取视频.帧率.分辨率等属性设置和使用 文章目录: 1,为了获取视频,你应该创建一个 VideoCapture 对象.他的参数可以是设备的索引号,或者是一个视频文件 ...
- OpenCV python(二)图像预处理:改变图像大小 提取感兴趣区域
OpenCV python(二)图像预处理:改变图像大小 && 提取感兴趣区域 一.改变图像大小 1.获取图像宽.高.通道数 2.resize函数 3.案例 二.ROI感兴趣区域 1. ...
- 使用Python,OpenCV+OCR检测护照图像中的机器可读区域(MRZ Machine-Readable Zones)
使用Python,OpenCV+OCR检测护照图像中的机器可读区域(MRZ Machine-Readable Zones) 1. 效果图 2. 原理 3. 源码 参考 这篇博客将介绍如何只使用基本的图 ...
- OpenCV Python教程(1、图像的载入、显示和保存)
本文是OpenCV 2 Computer Vision Application Programming Cookbook读书笔记的第一篇.在笔记中将以Python语言改写每章的代码. PythonO ...
- openCV—Python(6)—— 图像算数与逻辑运算
openCV-Python(6)-- 图像算数与逻辑运算 一.函数简介 1.add-图像矩阵相加 函数原型:add(src1, src2, dst=None, mask=None, dtype=Non ...
最新文章
- Java中如何合并有个具有相同key的Map
- STM32开发 -- 继电器测试
- 类Xadmin插件--海豚插件
- 游标操作 for Oracle
- leetcode—— 401. 二进制手表(使用到将数字转换为字符)
- 国土部明确地面光伏、分布式光伏用地政策
- java怎么销毁session_【Java】问题:Session的销毁方式到底有哪些?
- 使用EasyExcel上传下载excel
- 基于单片机1KW高频感应加热器控制系统仿真设计(毕设)
- 怎样在JavaScript添加图片
- HRBU_20211112训练
- 百度地图 ( 一 ) 显示地图
- 公司口碑及待遇评价的网站
- 赛维安讯LiveCloud直播云服务介绍
- 基于S7-1200 PLC实现PIDNN控制仿真
- centos安装easy_install
- python短网址转换
- 解决:操作必须使用一个可更新的查询
- 蝴蝶,螺旋结构和中微子
- [music]Brand new day--Ryan Star
热门文章
- mysql怎么在海量数据上ddl_浅谈MySQL Online DDL(中)
- nginx 正则匹配优化(一)
- OpenStack 关于admin-openrc.sh的作用(Queens版本)
- git 提交到某分支_Git如何拉取某个分支的某段提交
- 锁屏界面提示某些设置已隐藏_iOS 13隐藏手电筒和相机快捷图标
- 程序控制发送文件到邮箱_Intouch邮件发送的真实案例(一),不可多得的技术尝试...
- s()++php,jquery siblings()函数正确用法
- python从入门到项目实战李兴华网盘_贺胜军Python轻松入门到项目实战【经典完整版】...
- JWT 和 JJWT,别再傻傻分不清了!
- 冰岛试行四天工作制大获成功:每周缩短五小时,生产力没变!