在上一个博客里,已经实现了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)
检查代码无误后,运行代码成功如图: