Python C++扩展
Python C++扩展
前段时间看了一篇文章,http://blog.jobbole.com/78859/, 颇有感触,于是就结合自己工作中的知识作了一个简单的Python移动侦测:移动侦测的算法使用C++实现,封装成Python可以调用的格式,具体流程如图1。
图1
首先看一下C++的工程配置,如图2
图2
C++部分代码:
#include "stdafx.h"
#include "Python.h"
#include "C:\Python27\Lib\site-packages\numpy\core\include\numpy\arrayobject.h"
#include "motiondetector.h"
static int MD_GRID_W = 32;
static int MD_GRID_H = 32;
static int MD_NOISE_LEVEL = 150;
static int MD_SENSITIVITY = 150;
class VideoDetector
{
public:
~VideoDetector()
{
if (m_motionDetector != NULL)
{
delete m_motionDetector;
m_motionDetector = NULL;
printf("~VideoDetector\r\n");
}
}
VideoDetector(int width, int height):m_width(width), m_height(height)
{
m_motionDetector = new simple_md::MotionDetector();
if (m_motionDetector != NULL)
{
m_motionDetector->init(MD_GRID_W, MD_GRID_H, m_width, height);
m_motionDetector->set_noise_level(MD_NOISE_LEVEL);
m_motionDetector->set_sensitivity(MD_SENSITIVITY);
// Setup default zone
std::vector<simple_md::Zone> zones;
simple_md::Zone z;
z.sensitivity = 100;
for (int i = 0; i < MD_GRID_W * MD_GRID_H; ++i)
{
z.mask.push_back(100);
}
zones.push_back(z);
m_motionDetector->set_zones(zones);
m_motionDetector->set_md_enbale();
printf("VideoDetector\r\n");
}
}
int process_frame(uint8_t *frame)
{
if (m_motionDetector != NULL && frame != NULL)
{
m_motionDetector->feed_frame(frame, m_width, m_height, m_width - 1, GetTickCount(), NULL, 0, NULL, 0, NULL, 0);
return m_motionDetector->get_state();
}
return 0;
}
int test(void)
{
return m_width * m_height;
}
private:
VideoDetector();
simple_md::MotionDetector *m_motionDetector;
int m_width;
int m_height;
};
static void PyDelVideoDetector(void *ptr)
{
printf("VideoDetector_UnInit\n");
VideoDetector *tmp = static_cast<VideoDetector *>(ptr);
delete tmp;
return;
}
PyObject *VideoDetector_Init(PyObject *self, PyObject *args)
{
printf("VideoDetector_Init\n");
int arg1 = 0;
int arg2 = 0;
int ret = PyArg_ParseTuple(args, "ii", &arg1, &arg2);
if (ret == 0)
{
printf("VideoDetector_Init fail\n");
return NULL;
}
VideoDetector *vd = new VideoDetector(arg1, arg2);
return PyCObject_FromVoidPtr(vd, PyDelVideoDetector);
}
#define f(x0) (*((uint8_t*)PyArray_DATA(py_pix) + (x0) * PyArray_STRIDES(py_pix)[0]))
#define shape(i) (py_pix->dimensions[(i)])
PyObject *VideoDetector_Process(PyObject *self, PyObject *args)
{
printf("VideoDetector_Process\n");
PyObject *py_obj = 0;
PyArrayObject *py_pix = 0;
npy_int64 idx = 0;
int ret = PyArg_ParseTuple(args, "OO", &py_obj, &py_pix);
if (ret == 0)
{
printf("VideoDetector_Process fail\n");
return NULL;
}
uint8_t *frame = (uint8_t *)malloc(sizeof(uint8_t) * shape(0));
if (frame == NULL)
{
return NULL;
}
for (idx = 0; idx < shape(0); idx++)
{
*(frame + idx) = (uint8_t)f(idx);
}
printf("-------process_frame start-------\n");
void * tmp = PyCObject_AsVoidPtr(py_obj);
VideoDetector *vd = static_cast<VideoDetector *>(tmp);
int result = vd->process_frame(frame);
free(frame);
frame = NULL;
printf("-------process_frame end(%d)-------\n", result);
return Py_BuildValue("i", result);
}
PyObject *VideoDetector_Test(PyObject *self, PyObject *args)
{
printf("VideoDetector_Test\n");
PyObject *pynum = 0;
int ret = PyArg_ParseTuple(args, "O", &pynum);
if (ret == 0)
{
printf("VideoDetector_Test fail\n");
return NULL;
}
void * tmp = PyCObject_AsVoidPtr(pynum);
VideoDetector *vd = static_cast<VideoDetector *>(tmp);
int result = vd->test();
return Py_BuildValue("i", result);
}
static PyMethodDef VideoDetector_methods[] = {
{"VideoDetector", VideoDetector_Init , METH_VARARGS},
{"test" , VideoDetector_Test , METH_VARARGS},
{"process" , VideoDetector_Process , METH_VARARGS},
{NULL, NULL, 0}
};
PyMODINIT_FUNC initVideoDetector(void)
{
Py_InitModule("VideoDetector", VideoDetector_methods);
}
videodetector.py代码:
from VideoDetector import *
class videodetector(object):
def __init__(self, arg1, arg2):
self._base = VideoDetector(arg1, arg2)
def test(self):
return test(self._base)
def process(self, frame):
return process(self._base, frame)
camera.py代码:
import cv2
import time
import datetime
import numpy as np
from videodetector import *
frame_num = 0
def motion_detect(obj, frame):
global frame_num
if frame_num % 5 == 0:
print frame_num
pixels = []
for ch in frame.tostring():
pixels.append(ord(ch))
#rgb2yuv = np.array([[0.299, 0.587, 0.114],
# [-0.14713, -0.28886, 0.436],
# [0.615, -0.51499, -0.10001]])
#rgb = np.array(pixels).reshape(len(pixels) / 3, 3)
#yuv = np.dot(rgb, rgb2yuv.T)
#y = np.array(yuv[ :, 0]).reshape(len(yuv), 1)
#print yuv.shape
#print y.shape
#print obj.process(y)
rgb = np.array(pixels).reshape(len(pixels) / 3, 3)
r = rgb[ : , 0];
g = rgb[ : , 1];
b = rgb[ : , 2];
raw = r + g + b;
#print datetime.datetime.now().second
#print datetime.datetime.now().microsecond
print raw.shape;
print obj.process(raw)
frame_num += 1
camera = cv2.VideoCapture(0)
fps = camera.get(cv2.cv.CV_CAP_PROP_FPS)
(width, height) = (int(camera.get(cv2.cv.CV_CAP_PROP_FRAME_WIDTH)), int(camera.get(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT)))
print width
print height
obj = videodetector(width, height)
#print obj.test()
print("program begin")
while True:
(grabbed, frame) = camera.read()
if not grabbed:
continue
cv2.imshow("Frame", frame)
motion_detect(obj, frame)
key = cv2.waitKey(1) & 0xFF
if key == ord("q"):
break
print("program end")
camera.release()
cv2.destroyAllWindows()
print("program release")
效果如图3:
图3
Python C++扩展的更多相关文章
- Python 7 —— 扩展与嵌入
Python 7 —— 扩展与嵌入 所谓扩展是指,在Python当中调用其他语言,由于Python的问题主要是效率,这里的扩展主要是指扩展C C++程序(重点) 所谓嵌入是指,在其他语言当中可以调用P ...
- windows 下 使用codeblocks 实现C语言对python的扩展
本人比较懒就粘一下别人的配置方案了 从这开始到代码 摘自http://blog.csdn.net/yueguanghaidao/article/details/11538433 一直对Python扩展 ...
- Python之美[从菜鸟到高手]--一步一步动手给Python写扩展(异常处理和引用计数)
我们将继续一步一步动手给Python写扩展,通过上一篇我们学习了如何写扩展,本篇将介绍一些高级话题,如异常,引用计数问题等.强烈建议先看上一篇,Python之美[从菜鸟到高手]--一步一步动手给Pyt ...
- Python3.x:python: extend (扩展) 与 append (追加) 的区别
Python3.x:python: extend (扩展) 与 append (追加) 的区别 1,区别: append() 方法向列表的尾部添加一个新的元素.只接受一个参数: extend()方法只 ...
- python基础扩展(二)
python基础扩展(二) 常用操作 1.startswith(以什么开始) endswith(y)什么结束 s='taiWanw39dd' print(s.startswith('t')) #意思是 ...
- Python之扩展包安装
读者朋友,在比较新的版本(Python 2 >=2.7.9 or Python 3 >=3.4)中,pip或者easy_install 扩展包命令已经默认安装(可查看 你的安装目录\p ...
- window环境下安装 pip 工具 【pip为Python的扩展管理工具】
Python有一些扩展管理工具,例如easy_install和pip工具,我推荐各位使用pip工具,因为pip工具具有很好的安装和卸载体验. 我们首先需要打开pip的官方网站, 下载必要的文件包,然后 ...
- Python 数据处理扩展包: numpy 和 pandas 模块介绍
一.numpy模块 NumPy(Numeric Python)模块是Python的一种开源的数值计算扩展.这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list str ...
- Python和C++的混合编程(使用Boost编写Python的扩展包)
想要享受更轻松愉悦的编程,脚本语言是首选.想要更敏捷高效,c++则高山仰止.所以我一直试图在各种通用或者专用的脚本语言中将c++的优势融入其中.原来贡献过一篇<c++和js的混合编程>也是 ...
随机推荐
- 201521123076《java程序设计》第12周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对象(属性:int id, String name,int age,doubl ...
- 201521123064 《Java程序设计》第12周学习总结
本次作业参考文件 正则表达式参考资料 1. 本章学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. ① 标准输入输出流(字节流):标准输入流 System.in,标准输出流 ...
- 201521123057 《Java程序设计》第12周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 1.字符流与文本文件:使用 PrintWriter(写),BufferedReader(读) ...
- 201521123075 《Java程序设计》第10周学习总结
1. 本周学习总结 2. 书面作业 本次PTA作业题集异常.多线程 1.finally 题目4-2 1.1 截图你的提交结果(出现学号) 1.2 4-2中finally中捕获异常需要注意什么? fin ...
- vim基础详解
目录: 什么是vim Vim能做什么 如何学习vim 如何用vim打开一个文件 Vim的三种模式 插入模式 命令模式 扩展命令模式 光标移动 在命令模式下 删除,复制,粘贴 扩展命令模式 可视化模式 ...
- Oracle与Mysql区别简述
在Mysql中,一个用户下可以创建多个库: 而在Oracle中,Oracle服务器是由两部分组成 数据库实例[理解为对象,看不见的] 数据库[理解为类,看得见的] 一个数据库实例可拥有多个用户,一个用 ...
- Spring-java-模板设计模式
1,模板设计模式指的是将相应的模板方法提取出来在专门的位置定义,然后把相同调用过程操作,通过模板来实现对于模板设计模式而言,一般有两种实现方式 1)基于继承的实现 2)基于组合的实现 Spring的J ...
- 你的专属定制——JQuery自定义插件
前 言 絮叨絮叨 jQuery是一个快速.简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(或JavaScript框架).jQuery设计的宗 ...
- Spring框架(一)
Spring: Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由 Rod Johnson在其著作 Expert One-On-One J2EE Deve ...
- Linux入门之常用命令(11) 系统监控 vmstat top
vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况.这个命令是我查看Linux/Unix最 ...