linux下使用SWIG实现Python调用C++ sdk读取相机图片

linux下使用SWIG实现Python调用C++ sdk读取相机图片

最近在弄相机的项目,算法用python 在linux下使用SWIG实现Python调用C++ sdk读取相机图片,获取Mat图像,并转换成numpy。
另外,多说一句,海康之类的监控摄像头支持rtsp协议,opencv 可以打开rtps地址读取摄像头,所以如果只是读取图像,不需要sdk,直接opencv方便实用。

参考了很多网上的资料:


SWIG

SWIG是Simplified Wrapper and Interface Generator的缩写。SWIG本质上是个代码生成器,为C/C++程序生成到其他语言的包装代码(wrapper code,为了生成这些包装代码,SWIG需要一个接口描述文件,描述将什么样的接口暴露给其他语言。SWIG可以直接接受”.h”头文件做为接口描述文件。

一个小例子

先写一个C++类,之后用python调用该类。

//c++源文件
//example.h
#include <iostream>
using namespace std;
class Example{
public:
void say_hello();
//example.cpp

#include "example.h"

void Example::say_hello()
{
      printf("hello");
}

再写一个swig模块定义文件如下

%module example
%{
#include "example.h"
%}
%include "example.h"

swig -python -c++ example.i,生成example_wrap.cxx和python文件example.py。
之后利用example_wrap.cxx和example.cpp生成一个链接库,重命名为_example.so,之后利用example.py和_example.so就可以导入example的包了。

g++ -c -fPIC -I/usr/include/python3.5m example.cpp
g++ -c -fPIC -I/usr/include/python3.5m example_wrap.cxx
g++ -shared example.o example_wrap.o -o _example.so -lpython3.5m

使用opencv

在编写接口文件的时候,要将依赖的头文件都添加进来,而opencv里面的文件繁多,在Github上面有人已经写好了opencv.i

新的.i文件

%module example
%include <opencv.i>
%cv_instantiate_all_defaults

%{
#include "example.h"
using namespace std;
%}

%include "example.h"

生成example_wrap.cxx和python文件example.py

swig -I/home/user/opencv-swig/lib/ -I/usr/local/include/ -python -c++ camera_py.i

根据自己的目录改下路径,之后生成.so文件就可以了。需要注意,返回的img要通过np.asarray转换一下类型。

cam = example.camera_py()
img = cam.get_img()
cv2.imshow('frame',np.asarray(img))

喜欢请大打赏

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值