2023-07-07-liunx环境,python调用ITK(c++版本)批量生成Drr

news2024/11/13 9:33:31

文章目录

  • 一、前言
  • 二、配置过程
    • 2.1.CMake与ITK的配置
    • 2.2.改写ITK的生成drr代码
    • 2.3.编译代码
    • 2.4.python调用cpp
  • 三、总结
  • 四、参考博客

一、前言

最近在做配准,需要用ITK来生成数据,windows版本可以通过cmake与visual studio可以跑通生成。但是想要在linux上跑通,所以重新到linux来配置ITK的环境。同时想要使用python来调用生成drr的代码,方便后面批量生成数据以及标注数据。本文主要是写的是如何使用python通过cmakelist来生成.so动态库,主要利用的是python的ctypes。

需要准备的:

1)在linux安装好cmake;

2)在linux安装好ITK;

3)有生成drr的生成代码;(我使用的是这位博主提供的代码:win10+visual studio 2022+itk+生成drr)

4)我的环境是:ubuntu20.04 + vscode + cmake3.26.4 + ccmake3.26.4 + ITK5.2.1

二、配置过程

2.1.CMake与ITK的配置

这里因为我是按照这位博主走通的这个过程:ITK的安装与测试(Ubuntu系统),注意作者有一步漏了,这点在评论里面有提到:”make以后需要sudo make install“,如果少了这步会报错。

2.2.改写ITK的生成drr代码

跑通上面的过程后,因为我们需要使用ctypes来调用c++代码,这需要我们将代码改编为一个函数,来方便在python里面传参。

这里主要是将代码改写为一个函数了,以下是我改的开头,其他部分没有改动,加了一个extern " c"是为了让它按C语言的方式来编译:

extern "C"{
	int Generate_drr(float rx_value, float ry_value, float rz_value,
		float tx_value, float ty_value, float tz_value,
		float cx_value, float cy_value, float cz_value,
		float sid_value, 
		float sx_value, float sy_value, 
		int dx_value, int dy_value, 
		float o2Dx_value, float o2Dy_value,
		double threshold_value,
		const char* ct_file_path,
		const char* drr_save_path
		) {
		float rx = rx_value;
		float ry = ry_value;
		float rz = rz_value;

		float tx = tx_value;
		float ty = ty_value;
		float tz = tz_value;

		float cx = cx_value;
		float cy = cy_value;
		float cz = cz_value;

		float sid = sid_value;

		float sx = sx_value;
		float sy = sy_value;

		int dx = dx_value;
		int dy = dy_value;

		float o2Dx = o2Dx_value;
		float o2Dy = o2Dy_value;

		float threshold = threshold_value;

		const char* file_path = ct_file_path; //ct路径
		const char* save_path = drr_save_path;

		cout << "input_path = " << file_path << endl;
		cout << "save_path = " << save_path << endl;

有两点需要注意:

1)有个别头文件有可能在windows上不报错,但是在linux会提示找不到,这时候需要可以重新按照那个头文件重新写一遍,一般是由于大小写的问题找不到,换为编译器提示的那个就行。

2)头文件需要将#include <io.h>替换为 #include <sys/io.h>否则可能报错

2.3.编译代码

需要在代码文件所在的同级目录新建一个CMakeLists.txt,将下面的内容加入:

cmake_minimum_required(VERSION 3.12) # 自己设定编译这个文件最低需要的cmake版本
project(Linux_cpp_to_python) # 这里一般填你的上一级文件名称,也就是cpp代码所在的文件夹

# 设置编译标准
set(CMAKE_CXX_STANDARD 14)

# 查找 ITK 库的路径
set(ITK_DIR "安装的ITK路径") # 这里我安装在"home/user_name/ITK"

# 查找 ITK 库
find_package(ITK REQUIRED)
include(${ITK_USE_FILE})

# 源文件列表
set(SOURCES gendrr.cpp) # cpp的文件名

# 生成共享库
add_library(itk_drr SHARED ${SOURCES}) # 最终生成的.so库名字,最后会生成前面带有lib的.so文件

# 链接 ITK 库到共享库
target_link_libraries(itk_drr ${ITK_LIBRARIES}) # 这里写前面的.so库名字

保存好这个文件后,我们在cpp文件同级目录下,新建build文件夹,接下来在vscode打开终端,输入以下命令:

cd build

cmake ..

make

就会发现在build文件下生成了共享库文件,我这里是libitk_drr.so文件。

2.4.python调用cpp

有了上面生成.so库,我们可以复制它放到和.cpp同级的目录下面,再新建一个py文件,来调用。

代码如下:

from ctypes import cdll, c_int, c_char_p, c_float


def ITK_gen_drr(rx, ry, rz, tx, ty, tz, cx, cy, cz, sid, sx, sy, dx, dy, o2Dx, o2Dy, threshold, ct_file_path, drr_save_path):
    rx = rx
    ry = ry
    rz = rz

    tx = tx
    ty = ty
    tz = tz

    cx = cx
    cy = cy
    cz = cz

    sid = sid

    sx = sx
    sy = sy

    dx = dx
    dy = dy

    o2Dx = o2Dx
    o2Dy = o2Dy

    threshold = threshold

    ct_file_path = ct_file_path

    drr_save_path = drr_save_path

    #加载cpp的itk生成drr共享库
    lib_itk = cdll.LoadLibrary("./libitk_drr.so")

    # 输入参数
    lib_itk.Generate_drr.argtypes = [c_float, c_float, c_float,
                        c_float, c_float, c_float,
                        c_float, c_float, c_float,
                        c_float, c_float, c_float,
                        c_int, c_int, c_float,
                        c_float,c_float, c_char_p, c_char_p]
    # 输出参数
    lib_itk.Generate_drr.restype = c_int

    lib_itk.Generate_drr(rx,ry, rz, tx, ty, tz, cx, cy, cz, sid, sx, sy, dx, dy, o2Dx, o2Dy, threshold, ct_file_path.encode('utf-8'), drr_save_path.encode('utf-8'))

if __name__ == "__main__":
    rx = -90
    ry = 0
    rz = 0
    tx = 0
    ty = 0
    tz = 0
    cx = 0
    cy = 0
    cz = 0
    sid = 1000
    sx = 0.25
    sy = 0.25
    dx = 1000
    dy = 1000
    o2Dx = 0
    o2Dy = 0
    threshold = 0
    ct_file_path = ".nii.gz文件路径"
    drr_save_path = "保存图片路径"
    ITK_gen_drr(rx,ry, rz, tx, ty, tz, cx, cy, cz, sid, sx, sy, dx, dy, o2Dx, o2Dy, threshold, ct_file_path, drr_save_path)

注意:

1)输入参数,输出参数那两行代码里面的Generate_drr为cpp代码的函数名;

2)路径需要用utf-8来编码;

三、总结

如上,现在应该可以生成drr了,批量生成我想就不用写了,这个比较简单,写个循环不停的传参即可。示例:

上个礼拜花了一天在linux配好ITK,花了一天实现python来调用cpp,总算挤点时间写下来了,下一篇写如何用python生成drr的coco数据格式。

四、参考博客

1.win10+visual studio 2022+itk+生成drr

2.ITK的安装与测试(Ubuntu系统)

3.Linux 下报错没有 io.h 等文件解决方法

4.Python调用C++

5.Ubuntu下使用cmake运行c++程序
更多的可以到我的个人博客查看

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/736749.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

纯干货,全文手码:如何利用低/无代码平台建立集团信息化系统

信息化系统是企业管理体系的延伸 对于一家集团企业而言&#xff0c;要实现信息化&#xff0c;首先需要考虑是否已经建立了完备的信息化管理制度。早在上世纪九十年代卡特彼勒引入了6 Sigma&#xff0c;使整个集团公司的运营规范化、系统化。通过多年的实践积累&#xff0c;卡特…

【雕爷学编程】Arduino动手做(157)---MX1508双路电机驱动模块

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

计算机视觉:通过边缘检测探究卷积的特征提取功能

本文重点 在前面的课程中,我们学习了卷积核的运算,同时我们也学习了卷积核的含义,我们可以将卷积核理解为特征提取器,也就是说一个卷积核就是一个特征提取器,很多人对这种说法不了解,下面我们就通过一个边缘检测的例子来看一下卷积核是如何进行边缘特征的提取的。 什么…

[ICML 2023] Fast inference from transformers via speculative decoding

Contents IntroductionSpeculative DecodingStandardized SamplingSpeculative Sampling AnalysisNumber of Generated TokensCalculating α \alpha αWalltime ImprovementNumber of Arithmetic OperationsChoosing γ \gamma γ ExperimentsReferences Introduction 为了…

springboot+vue膳食营养健康网站零食美食品商城_4d8g9

随着社会的不断进步与发展&#xff0c;人们对生活质量要求逐步提升。如果开发一款膳食营养健康网站&#xff0c;可以让用户在最短的时间里享受到最好的服务&#xff1b;而开发本网站&#xff0c;又能够提高网站整体工作水平&#xff0c;简化工作程序&#xff0c;这对管理员和用…

北京“数据二十条”发布,筑牢数据安全根基,加速释放数据产能

要实现2000亿的目标&#xff0c;基础保障如何做好&#xff1f; 7月5日&#xff0c;中共北京市委、北京市人民政府印发《关于更好发挥数据要素作用进一步加快发展数字经济的实施意见》&#xff08;《实施意见》分为9个部分&#xff0c;共涉及20项具体任务&#xff0c;也被称作“…

TypeScript 中的 enum 枚举类型的使用解读。

前言 在 TypeScript 中&#xff0c;新增了很多具有特性的一些数据类型处理方法&#xff0c;enum 【枚举】就是其中&#xff0c;很具有代表性的一种&#xff0c;所以本章节就来聊聊 在 TypeScript 中如何去运用 enum 【枚举】。 枚举得的概念&#xff1a; 枚举&#xff08;Enum&…

Web前端工程师笔试题(合集)

Web前端开发工程师笔试题篇1 1. 在一个框架的属性面板中&#xff0c;不能设置下面哪一项。( C ) A.源文件 ; B.边框颜色 ; C.边框宽度 D.滚动条 2. CSS样式表根据所在网页的位置&#xff0c;可分为?(B ) A.行内样式表、内嵌样式表、混合样式表 B.行内样式表、内嵌样式表…

MySQL数据库——多表查询练习2

一、练习素材 创建表 --创建部门表dept create table dept ( dept1 int , dept_name varchar(11));--创建员工表emp create table emp ( sid int , name varchar(11), age int, worktime_start date, incoming int, dept2 int); 插入数据 --部门表插入数据 insert into dep…

C++ 栈和队列(stack and queue)语法使用及底层实现原理

本篇文章会对C中的容器stack和queue用法进行详解&#xff0c;也包含对优先队列&#xff08;priority_queue&#xff09;的讲解。同时会模拟实现stack、queue和priority_queue底层。希望本篇文章会对你有所帮助&#xff01; 目录 一、stack 栈 1、1 什么是适配器 1、2 stack 语法…

C++ 线程池实现

思路 创建多个工作线程同时维护一个公共的任务队列, 任务队列非空时通过信号量唤醒阻塞等待的工作线程, 工作线程通过互斥锁互斥的从任务队列中取出任务, 然后执行任务 实现 信号量类 class sem {//封装信号量类 public:sem(int num 0) {if (sem_init(&m_sem, 0, num)…

Kernel-Pwn-FGKASLR保护绕过

FGKASLR FGASLR&#xff08;Function Granular KASLR&#xff09;是KASLR的加强版&#xff0c;增加了更细粒度的地址随机化。因此在开启了FGASLR的内核中&#xff0c;即使泄露了内核的程序基地址也不能调用任意的内核函数。 layout_randomized_image 在fgkaslr.c文件中存在着…

支持中文手写和多画布的Handraw

什么是 Handraw ? Handraw 是支持中文手写和多画布的 Excalidraw 白板工具。 官网上项目名称还是 Excalidraw-CN&#xff0c;所以 Handraw 应该是基于 Excalidraw 二开的&#xff0c;特点是支持中文手写字体和多画布 官方也提供了免费使用的站点&#xff1a;https://handraw.t…

ModaHub魔搭社区:向量数据库Zilliz Cloud插入 Entity教程

目录 开始前 插入单个 Entity 批量插入 Entity 准备数据 插入数据 写入操作 本文介绍如何将 Entity 插入到 Zilliz Cloud 集群中的 Collection。 Entity 是 Collection 中的基本数据单元。同一个 Collection 中的 Entity 具有相同的属性,这些属性共同定义在 Schema 中…

低代码开发平台助力解决企业开发效率问题

编者按&#xff1a;随着企业应用需求的不断增加&#xff0c;提高企业开发效率已经成为许多企业的目标。传统的开发方法显然不适用&#xff0c;开发平台通过可视化拖拉拽搭建等易用性和高扩展性可以帮助企业解决这个问题。 关键词&#xff1a;可视化开发、私有化部署、前后端分离…

设计模式--------行为型模式

行为型模式 行为型模式用于描述程序在运行时复杂的流程控制&#xff0c;即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务&#xff0c;它涉及算法与对象间职责的分配。 行为型模式分为类行为模式和对象行为模式&#xff0c;前者采用继承机制来在类间…

飞控学习笔记-IMU姿态算法

扩展卡尔曼滤波算法 传感器融合算法 卡尔曼滤波算法 最小二乘法 毕卡逼近法 对上式进行泰勒展开 得到四元数各阶近似算法&#xff1a; 梯度下降算法 梯度下降 互补滤波算法 chatgpt解释&#xff1a; 互补滤波&#xff08;Complementary Filter&#xff09;算法是一种常用…

zk-IMG:对抗虚假信息

1. 引言 前序博客&#xff1a; ZKP图片授权——PhotoProof&#xff1a;proofs of permissible photo edits Daniel Kang等人2022年论文《ZK-IMG: Attested Images via Zero-Knowledge Proofs to Fight Disinformation》&#xff0c;在该论文中提供了一个简单的deep fake ima…

高级编程技巧之Python装饰器详解

概要 装饰器是Python中一种强大而灵活的编程技巧&#xff0c;它可以用于修改或扩展函数的行为&#xff0c;同时又不需要修改函数的源代码。本文将介绍Python中的装饰器的基本概念、使用方法以及高级技巧&#xff0c;帮助你从入门到精通装饰器的使用。 一、基本概念 在深入学习…

【面试必考点】这一次带你彻底学会this的指向问题

文章目录 前言一、this的指向问题1.1 全局中的this1.2 普通函数中的this1.3 定时器中的this1.4 事件处理函数中的this1.5 构造函数中的this1.6 构造函数静态方法中的this1.7 箭头函数中的this 二、修改函数中的this指向2.1 call2.2 apply2.3 bind 三、 this指向练习3.1 某小游戏…