zl程序教程

您现在的位置是:首页 >  其他

当前栏目

利用DCMTK将DCM图像像素数据转换为Mat数据

转换数据 利用 图像 像素 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

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包吧,我在安装完成之后,运行通过!