利用DCMTK将DCM图像像素数据转换为Mat数据
2023-09-11 14:22:29 时间
附:
1. 一个文件夹下的文件名导出到TXT
在windows下进入目标文件夹,在文件夹窗口下按住Shift键,点击鼠标右键选择
“在此处打开命令行窗口”,之后再Dos窗口下输入如下命令,将文件夹下的所有文件名保存到list.txt文件夹中。
dir /b >list.txt
2. 配置DCMTK、Opencv
Opencv在VS下的配置已经有很多大牛进行了详细描述,这里就不赘述。DCMTK在VS下的配置稍微比Opencv复杂,为了方便大家我将我编译好的DCMTKlib和附加依赖库在下面贴出分享链接,在分享的文件路径中包含了Opencv的调试看图工具Image watch
链接:http://pan.baidu.com/s/1bpbq1Gj 密码:lifo
我电脑上的DCMTK是解压在D盘下的,我也将以这个目录进行说明,各位解压之后也可以根据自己的需求进行配置。DCMTK的配置类似于Opencv的配置,首先配置bin目录,这里没加入到系统变量,所以就直接配置了。
配置DCMTK的包含目录
配置库目录
配置附加依赖项
至此DCMTK在工程下的配置基本完成,下面贴出我包含的DCMTK的lib
charls.lib
cmr.lib
dcmdata.lib
dcmdsig.lib
dcmfg.lib
dcmimage.lib
dcmimgle.lib
dcmiod.lib
dcmjpeg.lib
dcmjpls.lib
dcmnet.lib
dcmpstat.lib
dcmqrdb.lib
dcmrt.lib
dcmseg.lib
dcmsr.lib
dcmtls.lib
dcmwlm.lib
i2d.lib
ijg12.lib
ijg16.lib
ijg8.lib
libi2d.lib
oflog.lib
ofstd.lib
dcmtkeay.lib
dcmtkssl.lib
iconv.lib
libpng.lib
libtiff.lib
libxml2.lib
zlib.lib
cmr.lib
dcmdata.lib
dcmdsig.lib
dcmfg.lib
dcmimage.lib
dcmimgle.lib
dcmiod.lib
dcmjpeg.lib
dcmjpls.lib
dcmnet.lib
dcmpstat.lib
dcmqrdb.lib
dcmrt.lib
dcmseg.lib
dcmsr.lib
dcmtls.lib
dcmwlm.lib
i2d.lib
ijg12.lib
ijg16.lib
ijg8.lib
libi2d.lib
oflog.lib
ofstd.lib
dcmtkeay.lib
dcmtkssl.lib
iconv.lib
libpng.lib
libtiff.lib
libxml2.lib
zlib.lib
1. dcm图像转成Mat数据
// Dcmtk_test.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <stdlib.h>
#include <iostream>
//OPencv
#include <opencv2/opencv.hpp>
//DCMTK
#include "dcmtk/config/osconfig.h"
#include "dcmtk/dcmdata/dctk.h"
#include "dcmtk/dcmimgle/dcmimage.h"
#pragma comment(lib, "Netapi32.lib")
#pragma comment(lib, "ws2_32.lib")
int _tmain(int argc, _TCHAR* argv[])
{
system("color f0");
std::string file_path= "File0001.dcm"; //dcm文件
DicomImage *img = new DicomImage(file_path.c_str());
if (img->isMonochrome() && img->getStatus() == EIS_Normal && img != NULL)
{
if (img->isMonochrome())
{
int nWidth = img->getWidth(); //获得图像宽度
int nHeight = img->getHeight(); //获得图像高度
Uint16 *pixelData = (Uint16*)(img->getOutputData(16)); //获得16位的图像数据指针
std::cout << nWidth << ", " << nHeight << std::endl;
if (pixelData != NULL)
{
//方法1
/*IplImage *srcImage = cvCreateImageHeader(cvSize(nWidth, nHeight), IPL_DEPTH_16U, 1);
cvSetData(srcImage, pixelData, nWidth*sizeof(unsigned short));
cv::Mat dst(srcImage);
cv::imshow("image1", dst);*/
//方法2
cv::Mat dst2(nWidth, nHeight, CV_16UC1, cv::Scalar::all(0));
unsigned short* data = nullptr;
for (int i = 0; i < nHeight; i++)
{
data = dst2.ptr<unsigned short>(i); //取得每一行的头指针 也可使用dst2.at<unsigned short>(i, j) = ?
for (int j = 0; j < nWidth; j++)
{
*data++ = pixelData[i*nWidth + j];
}
}
cv::imshow("image2", dst2);
}
}
}
cv::waitKey(0);
delete img;
return 0;
}
运行结果:
2. Debug调试错误
2.1 _MSC_VER 不匹配错误
这是由
平台工具集不匹配造成的,修改到2010就好了(我这里用的是VS2013)
2.2 /GL /ZI命令行不兼容问题
解决办法
2.3 字符集问题
VS下的工程默认是Unicode字符集,但是在调试的时候会报错
通过实践有两种方法可以解决:
1. 将工程的字符集改为
多字符集
2. 要是不想改那么就将报错的地方注释掉,基本上是log部分,不影响使用
2.4 Link error 问题
在程序运行的开始出添加
#pragma comment(lib, "Netapi32.lib")
#pragma comment(lib, "ws2_32.lib")
2.5 LINK:fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
原来在工程机上嵌入DCMTK的时候没出现问题,但是在自己的笔记本上出现2.1节的问题和这个错误提示,第一个错误的原因是没有安装VS2010所以平台工具集没有10对应的工具集,第二个原因是我安装的VS2010没有安装VS2010 SP1升级包(官方地址),现在安装就好了。
注意:
当出现上面我说的第二个问题的时候,(针对集成DCMTK)建议不要听信网上的如下类似解决办法:
还是乖乖安装VS2010 SP1包吧,我在安装完成之后,运行通过!
相关文章
- SpringMVC基础-08-数据转换 & 数据格式化 & 数据校验
- 使用AutoMapper 处理DTO数据对象的转换
- php如何转换html标签
- 【Linux基础】VI命令模式下大小写转换
- JAVA中int、String的类型相互转换
- list,set,map,数组之间的相互转换详细解析
- (剑指Offer)面试题49:把字符串转换为整数
- [工具类]视频音频格式转换
- C# 获取xml数据,并转换为dataset
- Atitit 持久化 Persistence概念的艺术 目录 1. 持久化是将程序数据在持久状态和瞬时状态间转换的机制。1 2. DBC就是一种持久化机制。文件IO也是一种持久化机制。2 3.
- NLP:自然语言处理技术中常用的文本特征表示方法之字典特征抽取(对字典型数据通过特征抽取和向量化进而实现特征数字化,one-hot编码/仅有值稀疏矩阵,如对类别型特征转换数字型)代码实现
- angular 时间戳转换(星期过滤器)
- 一个数据结构转换的问题
- 编码转换
- PHP:Laravel cast array json数据存数据库时unicode 编码问题和update更新不触发数据转换
- 如何将一个长URL转换为一个短URL
- Postgresql/Greenplum中将数字转换为字符串TO_CHAR函数前面会多出一个空格
- 使用函数实现数据大小端转换
- [linux]date命令时间戳和时间之间的转换
- 数据转换
- AI机器学习模型python到C/C++的转换播
- 上手Pandas,带你玩转数据(5)-- 数据转换与数据定位
- 生存分析 合并三个数据集的结果 自建函数id转换 geo duqiang