工具: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 }
用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
注意,傳進去的數據是array中的ctypes。實際上,array中的ctypes記錄的是指向array數據的地址。spa
結果:code
通過測度,用python實現gen_lbp59img處理QCIF的灰度圖像,須要耗時200ms左右,而用C實現後,耗時不到1.5ms。這差距太大了吧!看來PYTHON雖然方便了編程,可是耗時太可觀了!blog