您好,登錄后才能下訂單哦!
動態(tài)鏈接庫在Windows中為.dll文件,在linux中為.so文件。以linux平臺為例說明python調(diào)用.so文件的使用方法。
本例中默認讀者已經(jīng)掌握動態(tài)鏈接庫的生成方法,如果不太清楚的可以參考動態(tài)鏈接庫的使用
調(diào)用上例動態(tài)鏈接庫的使用中的sum.so
import ctypes so = ctypes.CDLL('./sum.so') print "so.sum(50) = %d" % so.sum(50) so.display("hello world!") print "so.add() = %d" % so.add(ctypes.c_float(2), ctypes.c_float(2010))
output
so.sum(50) = 1275 hello world! so.add() = 2012
注意:
數(shù)組的傳入傳出
如果將python中l(wèi)ist傳入C函數(shù)數(shù)組,則需要提前轉(zhuǎn)換。
import ctypes pyarray = [1, 2, 3, 4, 5] carrary = (ctypes.c_int * len(pyarray))(*pyarray) //有點類似malloc的方式生成carray print so.sum_array(carray, len(pyarray))
refer
如果如果需要將C array返回python,需要提前把array傳入,然后在C函數(shù)中修改,返回時再把c array轉(zhuǎn)換為np.array
pyarray = [1,2,3,4,5,6,7,8] carray = (ctypes.c_int*len(pyarray))(*pyarray) so.modify_array(carray, len(pyarray)) print np.array(carray)
output
[10 20 30 40 50 60 70 80]
也可以用形參方式提前定義函數(shù)接口,然后再傳入numpy結(jié)構(gòu)
import ctypes import numpy as np from numpy.ctypeslib import ndpointer so = ctypes.CDLL('./sum.so') pyarray = np.array([1,2,3,4,5,6,7,8], dtype="int32") fun = so.modify_array fun.argtypes = [ndpointer(ctypes.c_int), ctypes.c_int] fun.restype = None fun(pyarray, len(pyarray)) print np.array(pyarray)
注意:numpy中的數(shù)據(jù)類型指定很重要,即dtype的設(shè)定
圖片的傳入傳出
轉(zhuǎn)遞數(shù)據(jù)域
背景知識:
python中的opencv圖片是用numpy的方式保存的,而opencv3 C語言的圖片數(shù)據(jù)結(jié)構(gòu)為cvMat (IplImage已經(jīng)逐棄用)
所以需要把python中numpy圖片轉(zhuǎn)換為ctypes.POINTER(ctypes.c_ubyte)的指針轉(zhuǎn)入其數(shù)據(jù)域,再將其行列信息傳入,就可以在C中從最底層初始化一個CvMat,如果要初始化一個別數(shù)據(jù)結(jié)構(gòu)的圖片也是同理(如darknet的image,caffe的blob)
python numpy image 轉(zhuǎn)換為 C pointer的方法
python_frm.ctypes.data_as(C.POINTER(ctypes.c_ubyte))
注意:傳入numpy image前一定要確保numpy image是numpy array數(shù)據(jù)類型
比如我遇到的bug
image = cv2.imread("xxx.jpg");
image傳入ctypes_so.fun之中圖片是有效的,但
image = cv2.imread("xxx.jpg");
這時候進入ctypes_so.fun的圖片會變成一個亂碼
即,crop之后的numpy image的type雖然也為numpy array,但實際傳入的image data卻不正確
解決方法:
無論是何種方式得到的numpy image,都強行轉(zhuǎn)換為numpy array,再傳入ctypes_so.fun
image = numpy.array(image)
可以解決這個bug
refence
如果使用opencv2 可以考慮直接將numpy image轉(zhuǎn)換為IplImage
opencv3 python已經(jīng)不支持cv2.cv的函數(shù)了
但Opencv2可能還可以嘗試以下方法
numpy image to iplimage
python調(diào)用C++中的類
因為python不能直接調(diào)用C++中的類,所以必須把C++中的類轉(zhuǎn)換為C的接口
轉(zhuǎn)換原則
#ifdef __cplusplus extern "C" { #endif xxxxxx function declaration xxxxx #ifdef __cplusplus } #endif
code
refer
refer
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。