您的位置:首页 > 编程语言 > C语言/C++

python调用c++动态库(2)

2019-04-07 16:37 856 查看

在上一个博客里,已经实现了python需要调用的c++动态库

接下来我将实现用python的ctypes,调用c++动态库

导入python的必要库
import ctypes
import cv2
import os
from time import sleep
os.environ["CUDA_VISIBLE_DEVICES"]="0"
from ctypes import *

使用ctypes调用动态库

ll = ctypes.cdll.LoadLibrary
so = ll("./libcppde.so.1.0.0")

这里对你需要调用c++动态库里的函数指定参数输入类型和输出类型,参数类型名与C++, C里的也有不同,具体如下:

ctypes type

C type

Python type

c_bool

_Bool

bool (*)

c_char

char

1-character string

c_wchar

wchar_t

1-character unicode string

c_byte

char

int/long

c_ubyte

unsigned char

int/long

c_short

short

int/long

c_ushort

unsigned short

int/long

c_int

int

int/long

c_uint

unsigned int

int/long

c_long

long

int/long

c_ulong

unsigned long

int/long

c_longlong

__int64 or long long

int/long

c_ulonglong

unsigned __int64 or unsigned long long

int/long

c_float

float

float

c_double

double

float

c_longdouble

long double

float

c_char_p

char * (NUL terminated)

string or None

c_wchar_p

wchar_t * (NUL terminated)

unicode or None

c_void_p

void *

int/long or None

例如C++里的loadModel输入是两个string型的参数文件,这里对应的就是两个c_char_p,具体代码如下:

so.loadModel.argtypes = [c_char_p, c_char_p]

so.detectToJson.argtypes = [c_float, c_int, c_int, POINTER(c_ubyte), c_char_p]
so.detectToJson.restype = c_char_p


model_file = "/home/czy/Documents/CPPDE0.2/cppde/cfg/deploy.prototxt"
weights_file = "/home/czy/Documents/CPPDE0.2/cppde/weights/VisDrone_refinedet_vgg16_512x512_iter_55000.caffemodel"
so.loadModel(model_file, weights_file)

#so.release()
img_id = "1111"
img = cv2.imread("./0001.png")
(rows, cols) = (img.shape[0], img.shape[1])
result = so.detectToJson(0.45, rows, cols, img.ctypes.data_as(POINTER(c_ubyte)), img_id)
print result
while True:
    sleep(5000)

检查代码无误后,运行代码成功如图:

 

 

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: