如何解决是否可以通过 Ctypes 调用带有指向 3dim 数组的指针的 C DLL?
问题
是否可以通过 Ctypes 调用带有指向 3dim 数组的指针的 C DLL?
进展
首先,我对 C 和 DLL 还很陌生,所以我可能不知道/没有监督过一些琐碎的事情。
我让它用一个指向 1dim 数组的指针运行。然而,能够使用 3dim 数组真的很好,因为我想操作 RGB 图像数据,这确实需要重复边缘。
Python 代码
#include <math.h>
float * RGB2BW(const float * matrixIn,int size)
{
float * matrixOut = (float *)malloc(sizeof(float)*size);
for(int i = 0; i < size; i++)
{
matrixOut[i] = matrixIn[i];
}
return matrixOut;
}
C 代码
appBar: AppBar(
toolbarHeight: 110,// Set this height
flexibleSpace: Container(
color: Colors.blue,child: Column(children: <Widget>[
Row(children: <Widget>[
SizedBox(width: 15),Icon(Icons.menu,color: Colors.white),SizedBox(width: 10),Text("Demo",style: TextStyle(fontSize: 23,color: Colors.white))
]),SizedBox(height: 8),Container(
height: 40,margin: EdgeInsets.symmetric(horizontal: 20,vertical: 5),child: TextField(
textAlign: TextAlign.center,controller: search,decoration: InputDecoration(
contentPadding:
EdgeInsets.symmetric(vertical: 10,horizontal: 10),filled: true,fillColor: Colors.white,prefixIcon: Icon(Icons.search,color: Colors.black),border: OutlineInputBorder(
borderRadius:
BorderRadius.all(Radius.circular(40))),hintStyle: new TextStyle(color: Colors.black38),hintText: "Search"),)),]),),)
替代方案
如果通过 Ctypes 调用 DLL 不能使用 3dim 指针,那么在内部将 1dim 数组转换为 3dim 数组是否可行?
不确定性
我也不确定 numpy 数组是如何存储在内存中的。会不会是因为底层的 numpy 数组并没有真正存储为 3dim,所以我传递一个指向 3dim 数组的指针的努力没有成功?
解决方法
Numpy 数组默认存储在与 C 数组相同的内存方向。在 Python 方面,您可以使用 3D 数组,但在 C 方面更容易将其视为一维数组并进行数学运算以访问行和列。
下面的示例需要一个 3D numpy 数组作为参数,但传递维度以便 C 代码可以访问元素。 C 代码就地修改数组:
test.c
#include <stdio.h>
__declspec(dllexport)
void RGB2BW(float* matrix,int x,int y,int z)
{
for(int i = 0; i < x; ++i)
for(int j = 0; j < y; ++j)
for(int k = 0; k < z; ++k)
{
int index = i * y * z + j * z + k;
printf("matrix[%d][%d][%d] = %f\n",i,j,k,matrix[index]);
matrix[index] *= 2;
}
}
test.py
import numpy as np
from ctypes import *
dll = CDLL('./test')
dll.RGB2BW.argtypes = np.ctypeslib.ndpointer(dtype=np.float32,ndim=3),c_int,c_int
dll.RGB2BW.restype = None
a = np.arange(0,2.4,.1,dtype=np.float32).reshape(2,3,4)
dll.RGB2BW(a,*a.shape)
print(a)
输出:
matrix[0][0][0] = 0.000000
matrix[0][0][1] = 0.100000
matrix[0][0][2] = 0.200000
matrix[0][0][3] = 0.300000
matrix[0][1][0] = 0.400000
matrix[0][1][1] = 0.500000
matrix[0][1][2] = 0.600000
matrix[0][1][3] = 0.700000
matrix[0][2][0] = 0.800000
matrix[0][2][1] = 0.900000
matrix[0][2][2] = 1.000000
matrix[0][2][3] = 1.100000
matrix[1][0][0] = 1.200000
matrix[1][0][1] = 1.300000
matrix[1][0][2] = 1.400000
matrix[1][0][3] = 1.500000
matrix[1][1][0] = 1.600000
matrix[1][1][1] = 1.700000
matrix[1][1][2] = 1.800000
matrix[1][1][3] = 1.900000
matrix[1][2][0] = 2.000000
matrix[1][2][1] = 2.100000
matrix[1][2][2] = 2.200000
matrix[1][2][3] = 2.300000
[[[0. 0.2 0.4 0.6 ]
[0.8 1. 1.2 1.4 ]
[1.6 1.8000001 2. 2.2 ]]
[[2.4 2.6000001 2.8 3. ]
[3.2 3.4 3.6000001 3.8 ]
[4. 4.2000003 4.4 4.6 ]]]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。