亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

python調(diào)用動態(tài)鏈接庫的基本過程詳解

系統(tǒng) 1831 0

動態(tài)鏈接庫在Windows中為.dll文件,在linux中為.so文件。以linux平臺為例說明python調(diào)用.so文件的使用方法。
本例中默認(rèn)讀者已經(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
          

注意:

  • 如果python在調(diào)用C函數(shù)內(nèi)部出現(xiàn)了問題,系統(tǒng)不會提示具體出現(xiàn)什么問題,只會提示"segmentation fault"。所以最好是先用C語言調(diào)用該動態(tài)庫驗證沒有問題了再提供給python調(diào)用。
  • python傳參給C函數(shù)時,可能會因為python傳入實參與C函數(shù)形參類型不一致會出現(xiàn)問題( 一般int, string不會有問題,float要注意 )。這時需要在python調(diào)用時傳入的實參做一個類型轉(zhuǎn)換(見so.add(float, float)函數(shù)的調(diào)用)。轉(zhuǎn)換方式見下表:

python調(diào)用動態(tài)鏈接庫的基本過程詳解_第1張圖片

數(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) //有點(diǎn)類似malloc的方式生成carray
print so.sum_array(carray, len(pyarray))
          

refer

如果如果需要將C array返回python,需要提前把a(bǔ)rray傳入,然后在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");
          

這時候進(jìn)入ctypes_so.fun的圖片會變成一個亂碼

即,crop之后的numpy image的type雖然也為numpy array,但實際傳入的image data卻不正確

解決方法:

無論是何種方式得到的numpy image,都強(qiáng)行轉(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)換原則

  • 所有的C++關(guān)鍵字及其特有的使用方式均不能出現(xiàn)在.h文件里,.h中僅有C函數(shù)的包裝函數(shù)聲明
  • 在class.cpp中實現(xiàn)對類的成員函數(shù)接口轉(zhuǎn)換的函數(shù),包括對類內(nèi)成員的讀寫函數(shù)get() and set()
  • 如果要在包裝函數(shù)中要實例化對象,盡量用new constructor()的將對象的內(nèi)存實例化在堆中,否則對象會被析構(gòu)
  • 記得在所有包含函數(shù)聲明的文件中加入以下關(guān)鍵字,聲明該函數(shù)為C函數(shù),否則該函數(shù)的符號不會記錄在二進(jìn)制文件中
            
#ifdef __cplusplus
extern "C" {
#endif
xxxxxx function declaration xxxxx
#ifdef __cplusplus
}
#endif
          

code
refer
refer

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 免费的成人a视频在线观看 免费的黄色网 | 亚洲国产第一区 | 美女网站色视频 | 久草色播| 亚洲天堂一区 | 国产福利91精品一区二区三区 | 性做久久久久久坡多野结衣 | 亚洲免费区| 久久狠狠色狠狠色综合 | 四虎亚洲国产成人久久精品 | 久久成人精品视频 | 成人毛片免费在线观看 | 天天操天天爱天天干 | 日日骑夜夜操 | 四虎精品免费永久在线 | 色狠狠综合 | 国产福利免费视频 | 91在线视频在线 | 中文字幕一区二区在线视频 | 久久精品国产久精国产果冻传媒 | 国产乱码在线精品可播放 | 中文字幕一级毛片 | 波多野结衣一区免费作品 | 天天色综合2 | 天天综合久久久网 | 亚洲十欧美十日韩十国产 | 日韩三区| 国产成人亚洲精品一区二区在线看 | 成人免费一区二区三区在线观看 | 西西做人爱免费视频 | 伊人久久成人 | 亚洲美色综合天天久久综合精品 | 久久精品阿娇 | 色综合一本 | 欧美一区二区在线视频 | 五月花精品视频在线观看 | 亚洲综合在线成人一区 | 一本一本久久a久久精品综合麻豆 | 久草在在线 | 国产人伦视频在线观看 | 性生活免费网站 |