是否可以通过 Ctypes 调用带有指向 3dim 数组的指针的 C DLL?

如何解决是否可以通过 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 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-