實例描述如何用python組件ctypes調用c的dll中的函數

工具:winpython,vc2010(我認爲只要能生成dll的編譯工具都行)python

步驟1:編程

新建一個VC的DLL工程zm_funs,實現函數:ide

 1 #include "stdio.h"
 2 #include "string.h"
 3 
 4 typedef unsigned char uchar;
 5 //__declspec(dllexport)
 6 void gen_lbp59img(uchar *pu8Img, uchar *pu8LBP59Img, int dwW, int dwH, uchar *pu8LBP89Table)
 7 {
 8     int dwRI, dwCI, dwPI;
 9     int dwOft, dwVal;
10     int adwOffset8[8] = {-dwW - 1, -dwW, -dwW + 1, 1, dwW + 1, dwW, dwW - 1, -1};
11 
12     memset(pu8LBP59Img, 0, dwW * dwH);
13 
14     for (dwRI = 1; dwRI < dwH - 1; dwRI++)
15     {
16         for (dwCI = 1; dwCI < dwW - 1; dwCI++)
17         {
18             dwOft = dwRI * dwW + dwCI;
19             dwVal = 0;
20             for (dwPI = 0; dwPI < 8; dwPI++)
21             {
22                 if (pu8Img[dwOft + adwOffset8[dwPI]] > pu8Img[dwOft])
23                 {
24                     dwVal += 1 << (7 - dwPI);
25                 }
26             }
27             pu8LBP59Img[dwOft] = pu8LBP89Table[dwVal] - 1;
28         }
29     }
30 
31     return;
32 }
gen_lbp59img

用def文件或__declspec(dllexport)將函數名gen_lbp59img導出。而後編譯成DLL(DLL的名字是zm_funs.dll)。函數

步驟2:工具

打開winpython,寫一個同名的函數(之因此同名是爲了好記)用來準備好要傳給DLL中函數的數據:ui

 1 import scipy as sp
 2 import ctypes as ct
 3 
 4 zmfuns = ct.CDLL('zm_funs.dll')
 5 
 6 def gen_lbp59img(img, lbptable):
 7     sz = img.shape
 8     if len(sz) > 2:
 9         print 'can''t handle color image.'
10         return
11     imgh, imgw = sz
12     lbpimg = sp.zeros(sz, dtype = sp.uint8)
13 #    call gen_lbp59img of c
14     zmfuns.gen_lbp59img(img.ctypes, lbpimg.ctypes, imgw, imgh, lbptable.ctypes)
15     
16     return lbpimg
gen_lbp59img

注意,傳進去的數據是array中的ctypes。實際上,array中的ctypes記錄的是指向array數據的地址。spa

結果:code

通過測度,用python實現gen_lbp59img處理QCIF的灰度圖像,須要耗時200ms左右,而用C實現後,耗時不到1.5ms。這差距太大了吧!看來PYTHON雖然方便了編程,可是耗時太可觀了!blog

相關文章
相關標籤/搜索