将Numpy数组通过ctypes模块传递到C++函数
python文件
a.py
import cv2
import numpy as np
import ctypes
from ctypes import string_at
def sendToC():
lib = ctypes.cdll.LoadLibrary("./test.so")
arr = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]],dtype = np.int32)
print(arr)
rows, cols = arr.shape
#下面三行代码等价,都是指定数据类型
arr = arr.ctypes.data_as(ctypes.POINTER(ctypes.c_int))
# arr = arr.ctypes.data_as(ctypes.c_char_p)
# lib.show_matrix.argtypes = [np.ctypeslib.ndpointer(ctypes.c_int),ctypes.c_int,ctypes.c_int]
lib.show_matrix(arr, rows, cols)
sendToC()
cpp文件
test.cpp
// 编译命令 g++ -o libtryPython.so -shared -fPIC tryPython.cpp
#include<iostream>
using namespace std;
extern "C"{
void show_matrix( int *matrix, int rows, int columns)
{
int i, j;
for (i=0; i<rows; i++) {
for (j=0; j<columns; j++) {
cout<<matrix[i*columns + j]<<"\t";
}
cout<<endl;
}
}
}
注意事项:
编译命令:g++ -o libtryPython.so -shared -fPIC tryPython.cpp
文件名替换一下就可以。
C++编译的时候要extern “C”,不然调用的时候会报错。
注意numpy数组的数据类型,要和ctypes声明、C++函数中的数组数据类型对应。
参考资料:
ctypes的运用(把一个numpy数组传入c中)
注意这里面有个“错”的地方,困了我很久。。
一般人的用法都是一行一行显示,因此这里要改为matrix[i*columns+j]