基于fo-dicom 的 Worklist & CStore 我的学习实现路线

学习了三个周的DICOM协议,主要进行了Worklist、CStore应用测试,下面总结一下过程中收获的心得

刚开始接触DICOM这个东西领导提出两个需求测试实现Worklist和DICOM文件下载,后面又加了压缩DCM文件,而且他说网上有代码,让我下下来马上在机器上测试,我当时还是一头雾水,不知从何下手,先没管代码的事,最直接的入手材料就是DICOM协议

[DICOM标准网站](https://www.dicomstandard.org/ - https://www.dicomstandard.org/current/),在CSDN下了中文版的协议,三个文件讲到第十章,应该不全,不过了解基本内容是够了,陆续看了两天协议,医学影像领域算是入门了,知道医学影像按照DICOM协议规定的数据格式、含义、条目存储为二进制文件,收集各种概念HIS、RIS、PACS,对协议的基本元素、组成、含义有了大致的了解,但对于自己接下来的任务还不明确,要怎么做。

之前无医疗行业开发经验,表示连HIS都不知道,了解正常的就医流程是把我开发方向的重要支持。

病人在HIS上注册,经hl7消息传至RIS,RIS上便有了病人的登记信息。做检查时,成像设备通过DICOM Worklist来从RIS上取得需做检查的病人列表,选择后做检查。检查完成后,图像便可以传到PACS中进行存储。在这个过程中,病人信息仅在HIS端输入一遍,但它流经RIS,Modality以及PACS。可以节省时间,减少错误,规范流程,互联互通,形成数据共享。理想的情况下,让医生专注于检查及诊断,而缩短的时间,也会提高病人的满意度。

第一个任务是实现worklist,我在各个地方找关于worklist的信息,协议里其实讲的很清楚

A worklist is the structure to present information related to a particular set of tasks. It specifies particular details for each task. The information supports the selection of the task to be performed first, and supports the perfomance of that task.

简单理解就是把数据库中的客户信息上传至设备界面,免去手动输入客户信息可能录入错误的问题。 

如何实现呢?

有了点基础只是就可以看代码了,一开始搜到关于Worklist的都提到了DCMTK,这是什么东东,也不管三七二十一,

跟着教程就开始愉快的操作啦,就是参考下面这两个博客

[dcmtk在PACS开发中的应用(基础篇) 第三章 工作列表(Work List)(一)](https://blog.csdn.net/pachleng/article/details/5800513)

[dcmtk在PACS开发中的应用(基础篇) 第四章 工作列表(Work List)(二)](https://blog.csdn.net/pachleng/article/details/5827232)

经过DCMTK的编译和配置(也没管这个是DICOM的C++支持库,就跟着做,在一抹黑的时候尽量不去管是什么,先弄出来再说)、准备dump文件,执行指令,整个过程还比较顺利,命令窗口展示如下

亲眼看到了协议中提到信息,比如病人姓名PN,这应该是设备机需要的数据吧,一下和DICOM拉近了距离,这些和worklist有什么关系?看到指令中有wlistqry 应该是worklist query

wlmscpfs指令指定了wlistdb和端口信息,应该是提供数据的服务端,findscu指令执行完就看到了查询的数据,明白了大概的过程,但是怎么测试设备机呢,需要说明的是在没接触设备前我一直没搞清楚服务端和客户端的问题。。

继续搜索,终于遇到了DICOM大神的博客(https://blog.csdn.net/zssureqh),他的博客应该是我们学习DICOM最佳参考,我后面的很多疑问都是看了他的博客才清楚了,收获很大。

然后就看到了这篇[DICOM:fo-dicom、dcm4che14、dcm4chee等开源库持续自我维护](https://blog.csdn.net/zssureqh/article/details/51926908),原来有基于.net的DICOM库,喜极而泣,终于要跑上正轨了

基于.net 4.5 [fo-dicom](https://github.com/fo-dicom/fo-dicom)

和示例程序[fo-dicom-samples](https://github.com/fo-dicom/fo-dicom-samples)

然而。。示例程序下下来却不知道如何上手,这么多项目,运行也直接看不到结果,令我感到惊喜的是确实有worklist相关的项目,一个是SCP 一个是SCU,再看协议,知道是服务端和客户端,又不能两个项目一起启动,那怎么办,,后来知道debugge下有可执行程序,于是先启动SCP 再启动SCU,程序运行起来我就踏实多了,结合源码又看了很多相关的文章,基本程序都理解通了,下一步可以上机测试了,只是后又遇到客户机竟然是XP系统不支持.net4.5 哭了,于是找到下面的库版本:

基于.net 4.0 [fo-dicom](https://github.com/zssure-thu/fo-dicom)

基于两个版本的实现方式差别很大,根据4.5的示例程序,在4.0上进行编码,也是由于对worklist理解不透彻,一直没跑通,折腾了两三天,不过CStore一下就通了,后来得知并不一定要在那台XP系统电脑上部署,就没怎么再看4.0的程序了

在见到设备电脑之前,我一直没怎么想通我的程序要怎么运行,看到仪器设备的操作界面,我一下懂了,设备就是所谓的客户端,我只需要提供服务端就可以了,又经过一个周的测试,几个仪器都测试通了worklist和CStore。

后面的学习我都是参考zssureqh的博客指导,特别是下面这篇

[DICOM:DICOM标准学习路线图](https://blog.csdn.net/weixin_42665418/article/details/82112865)

CStore没有问题,但是花了很多时间折腾下载直接压缩dcm,后来通过完全下载再在本地压缩然后上传云端的方式解决

DICOM的学习研究告一段落

 

以下是使用 FO-DICOM 库打印彩色胶片的示例代码: ```c++ #include "dcmtk/config/osconfig.h" #include "dcmtk/dcmdata/dctk.h" #include "dcmtk/dcmimgle/dcmimage.h" #include "dcmtk/dcmimgle/digsdfn.h" #include "dcmtk/dcmimgle/diutils.h" #include "dcmtk/dcmimage/diregist.h" #include "dcmtk/dcmimage/diprint.h" int main(int argc, char *argv[]) { // 初始化 FO-DICOM 库 if (!dcmDataDict.isDictionaryLoaded()) { fprintf(stderr, "Error: no data dictionary loaded.\n"); return 1; } // 创建 DicomImage 对象 DicomImage *image = new DicomImage("input.dcm"); // 获取图像的宽度和高度 unsigned int width = image->getWidth(); unsigned int height = image->getHeight(); // 创建一个 DicomImagePrint 对象,并设置打印参数 DicomImagePrint *printer = new DicomImagePrint(); printer->setDestinationAE("PRINT_SCP"); printer->setPrintLUTShape(PLUT_SHAPE_IDENTITY); printer->setMagnificationType(DIMAGPRINT_REPLICATE); printer->setBorderDensity(0); printer->setEmptyImageDensity(255); // 设置打印参数,包括图像的位置、大小和颜色模式等 printer->setFilmSizeID("8INX10IN"); printer->setMagnificationType(DIMAGPRINT_REPLICATE); printer->setPrintObjectSides(DIMSE_PRINT_BOTH); printer->setPrintPriority(DIMSE_PRIORITY_MEDIUM); printer->setImageDisplayFormat(DIMSE_PRINT_PORTRAIT); printer->setImagePosition(1, 1); printer->setImageSize(width, height); printer->setColorMode(COLOR_MODE_FULL); // 设置打印胶片类型为彩色 printer->setFilmType(DIMSE_FILM_TYPE_DV); // 打印图像 printer->printImage(image); // 删除 DicomImagePrint 对象和 DicomImage 对象 delete printer; delete image; return 0; } ``` 在上述示例代码中,我们首先创建了一个 DicomImage 对象,用于读取 DICOM 影像文件。然后,我们创建了一个 DicomImagePrint 对象,并设置打印参数。最后,我们调用 DicomImagePrint 对象的 printImage 方法,将图像打印到胶片上。需要注意的是,我们在打印参数中设置了打印胶片类型为彩色(DIMSE_FILM_TYPE_DV),从而实现了彩色胶片打印。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值