VS2015 編譯DCMTK,讀取CT影象並轉換為OpenCV格式
一、DCMTK編譯(-mD/-mDd模式)
0. 材料:
- DCMTK3.6.2原始碼
- CMake
- VS2015
1. DCMTK原始碼下載
2. CMake下載
3. 編譯
3.1定位原始碼
開啟CMake,選擇DCMTK原始碼所在目錄,編譯結果存放目錄,如下如所示:開啟CMake,選擇DCMTK原始碼所在目錄,編譯結果存放目錄,如下如所示:
3.2 確定編譯器
選擇正確的原始碼目錄和編譯結果存放目錄後,點選【Configuire】,選擇所需編譯器,這裡編譯Win32位,所以選擇Visual Studio 14 2015編譯器,如果需要編譯x64,選擇Visual Studio 14 2015 Win64編譯器,然後點選【確定】.
3.3 修改CMake配置
這裡需要修改許多處,不然會編譯出錯,修改處見下圖:
3.5 生成工程
上步完成後,再次點選【Configure】,在點選【Generate】生成工程,點選【Open Project】,用VS2015開啟構建的工程。
3.6 確認工程構建正確
隨便選擇一個解決方案:
1. 確認是使用字符集為:多位元組字串集。
- 確認是生成動態連結庫形式。
確定無誤後,執行編譯。
3.7 編譯
選擇ALL BUILD解決方案,右鍵【生成】開始編譯。
3.8 安裝
3.7步無誤後,選擇INSTALL解決方案,右鍵【生成】,開始安裝,則在安裝目錄下將生成編譯的結果。
3.9 Debug和Release版本各生成一份
通過切換VS2015的解決方案配置,Debug版本和Release版本執行3.7和3.8各一次,則能生成Debug和Release版本各生成一份。
3.10 結果
結果如下圖所示
二、VS2015配置DCMTK,OpenCV
0. 材料
- 編譯好的DCMTK動態連結庫
- OpenCV(這裡是2.4.13版本)
1.配置OpenCV
2. 配置DCMTK
跟配置OpenCV一模一樣,此處略過。
三、*.dcm轉OpenCV格式
程式碼及解釋如下:
#include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */
#include "dcmtk/ofstd/ofstdinc.h"
#include "dcmtk/dcmdata/dctk.h"
#include "dcmtk/dcmdata/cmdlnarg.h"
#include "dcmtk/ofstd/ofconapp.h"
#include "dcmtk/dcmdata/dcuid.h" /* for dcmtk version name */
#include "dcmtk/dcmjpeg/djdecode.h" /* for dcmjpeg decoders */
#include "dcmtk/dcmjpeg/dipijpeg.h" /* for dcmimage JPEG plugin */
#pragma comment(lib, "ws2_32.lib") // 包含socket,因為.dcm影象包含網路通訊協議
#pragma comment(lib,"iphlpapi.lib")
#pragma comment(lib, "netapi32.lib")
/*
* dcm2Mat:將.dcm格式影象轉換為OpenCV的Mat格式
* fileName:CT影象的名字
* mat: 儲存轉換後的CT影象
*返回值:成功返回true,失敗返回false
*/
bool dcm2Mat(const char* const fileName, cv::Mat & mat)
{
DJDecoderRegistration::registerCodecs(); // register JPEG codecs
DcmFileFormat fileformat; //DcmFileFormat fileformat;
if (!(fileformat.loadFile(fileName).good()))
return false;
DcmDataset *dataset = fileformat.getDataset();
// decompress data set if compressed
dataset->chooseRepresentation(EXS_LittleEndianExplicit, NULL);
DcmElement* element = NULL;
OFCondition result = dataset->findAndGetElement(DCM_PixelData, element);
if (result.bad() || element == NULL)
return false;
unsigned short* pixData;
result = element->getUint16Array(pixData);
OFintptr_t rows = 0; // 影象行數
OFintptr_t cols = 0; // 影象列數
dataset->findAndGetLongInt(DCM_Rows, rows);
dataset->findAndGetLongInt(DCM_Columns, cols);
if (rows == 0 || cols == 0)
return false;
unsigned short *pbuf = new unsigned short[rows*cols];
memcpy(pbuf, pixData, rows*cols * 2);
Mat xxx(rows, cols, CV_16SC1, pbuf);
Mat xx;
cv::normalize(xxx, xx, 0, 255, NORM_MINMAX, CV_8UC1); // 畫素值歸一化到0~255
Mat afull(xx.rows, xx.cols, CV_8UC1, 255); // 全白影象
xx = afull - xx; // 影象顏色反轉,黑變白,白變黑
mat = xx.clone(); // 為什麼不直接用xx? 因為為了防止記憶體洩漏
cvtColor(mat, mat, CV_GRAY2RGB); // 灰度轉彩色,視具體工程而定,如果只需灰度圖,可以不轉換
delete[]pbuf; // 防止記憶體洩漏
DJDecoderRegistration::cleanup(); // deregister JPEG codecs
return true;
}
四、*.dcm檔案頭資訊讀取
// 功能:讀取病人姓名
OFFilename filename= "ct.1";//這裡改為你的CT影象檔案
OFCondition status = fileformat.loadFile(filename);
DcmDataset *dataset = fileformat.getDataset(); // 通過dataset 同時獲取檔案頭資訊和影象資料
OFString PatientName;
dataset->findAndGetOFString(DCM_PatientName, PatientName); // DCM_PatientName:病患姓名
cout <<"姓名:"<<PatientName<<endl;
其他資訊的關鍵字都定義在標頭檔案“dcdeftag.h”中,如下圖所示:
不清楚CT片的檔案頭到底包含什麼資訊?? 使用Sante DICOM Viewer 8 檢視CT影象,從【view】——【file Header】中檢視。
五、可能會遇到的程式設計錯誤
- 出現錯誤的提示的函式以WSA開頭,如:LNK2001 無法解析的外部符號 [email protected] CC E:\visualstudio\CC\CC\oflog.lib(oflog.obj),如圖:
解決方案:顯示連結ws2_32.lib庫
#pragma comment(lib, "ws2_32.lib")
- 出現錯誤:LNK2001 無法解析的外部符號 [email protected] CC E:\visualstudio\CC\CC\ofstd.lib(ofstd.obj)
解決方案:顯示連結iphlpapi.lib庫
#pragma comment(lib,"iphlpapi.lib")
- 出現錯誤:LNK2001 無法解析的外部符號 [email protected] CC E:\visualstudio\CC\CC\dcmdata.lib(dcuid.obj)
解決方案:顯示連結netapi32.lib庫
#pragma comment(lib, "netapi32.lib")
六、總結
本文內容包含以下幾個方面:
1. 如何編譯DCMTK;
2. 如何進行*.dcm影象資料的讀取,並轉換為OpenCV的Mat格式;
3. *.dcm檔案的檔案頭資訊分析;
4. 期間遇到的常見錯誤列舉。
最後,祝你在醫學影象處理的道路上越走越好!
相關推薦
VS2015 編譯DCMTK,讀取CT影象並轉換為OpenCV格式
一、DCMTK編譯(-mD/-mDd模式) 0. 材料: DCMTK3.6.2原始碼 CMake VS2015 1. DCMTK原始碼下載 2. CMake下載 3. 編譯 3.1定位原始碼 開啟CMake,選擇
java讀取json檔案並轉換為String
import java.io.*; public class Output { //測試 public static void main(String[] args){ String json = "null"; try { json = readJsonData("I
Spark讀取文字檔案並轉換為DataFrame
本文首發於我的個人部落格QIMING.INFO,轉載請帶上鍊接及署名。 Spark ML裡的核心API已經由基於RDD換成了基於DataFrame,為了使讀取到的值成為DataFrame型別,我們可以直接使用讀取CSV的方式來讀取文字檔案,可問題來了,當文字檔案中每一行的各
讀取MongoDB ObjectID並轉換為string
c++程式碼為: boost::shared_ptr<LoginPage> LoginService::Login(const std::string& email, const std::string& pwd) { boost::shar
【技術筆記】實現一個非常簡易的flac裁剪並轉換為wav格式
最近專案中遇到了一個需求是要實現對Flac歌曲的裁剪,而且不能是GPL開源協議的軟體,網上查了一下,foolbar和千千靜聽都是會支援,其中foolbar是開放原始碼的,下載程式碼看了發現是使用的libflac(後來我又找了兩個支援flac格式裁剪的mp3splt和pysourcefile,發現
開啟DICOM圖片(影象內容轉換為BMP格式)
很久前寫的,也其實就實現一個簡單顯示的問題,對於“窗位”,“窗寬”的取值問題,以前在CSDN上提問過,卻沒有得到很好的解決方案。 對與DICOM圖片的開啟也就實現了,“窗位”,“窗寬”標明的。把顯示部分的程式碼放上來,希望對剛接觸DICOM圖片格式的人有點幫助,若有高手希望
通過Ajax技術,將陣列型別資料轉換為JSON格式的物件
一、在伺服器端將list型別資料放入JSON物件中的方法 tjyjList=PxcscjbDAO.getTjyjList(pxcscjbQOMap); //生成JSON物件,用來容納獲得的樣卷陣列 JSONObject jsonObject=new JSONObjec
C#檢查目錄下所有檔案的編碼格式並轉換為UTF8格式
1、檢查目錄下所有檔案的編碼格式(遞迴) 2、將不是utf8的格式轉換為UTF8格式 .config <appSettings> <add key="ExceptList" value=".git,.nuget,.vs,.dll,.pdb,
web 上讀取圖片,並轉化為指定格式
一、 轉換為 base64 public static string ObtainBase64FromWeb(string domain, string path) { string url = "https://" + domain + path; System.Net.WebReq
c++ 解析從瀏覽器端傳過來的影象base64編碼,並轉換成opencv識別的格式
#include <cstdint> #include <fstream> #include <iostream> #include <string> #include <vector> #includ
java讀取xml檔案並轉換成物件,並進行修改
1.首先要寫工具類,處理讀取和寫入xml檔案使用的工具。XMLUtil.java import java.io.FileInputStream; import java.io.FileWriter; import java.io.IOException; import j
opencv-python 讀取影象並轉換顏色空間
#-*- encoding:utf-8 -*- ''' python 繪製顏色直方圖 ''' import cv2 import numpy as np from matplotlib import pyplot as plt def readImage(): #
.net讀取影象並儲存為檔案
{ byte[] mBlob = (byte[])reader["影象"]; System.IO.MemoryStream ms =new System.IO.MemoryStream(mBlob); System.Drawing.Image
javacpp-FFmpeg系列之2:通用拉流解碼器,支持視頻拉流解碼並轉換為YUV、BGR24或RGB24等圖像像素數據
tope sca 封裝 ams 定義 throw tco 如何使用 都是 javacpp-ffmpeg系列: javacpp-FFmpeg系列之1:視頻拉流解碼成YUVJ420P,並保存為jpg圖片 javacpp-FFmpeg系列之2:通用拉流解碼器,支持視頻拉流解碼並
Go讀取論文並轉換為simhahs
package main import ( "fmt" _"flag" _ "os" _ "io/ioutil" _"strings" _ "path" "log" _ "baliance.com/gooxml/document" "
前端上傳檔案前預覽,.net將base64位轉換為圖片並儲存到本地
前端上傳檔案前預覽 <img src="" id="img-change" width="200px" height="200px" id="filePath" name="filePath"> <input type="file" id="file" style="displ
基於GDAL庫,讀取海洋風場資料(.nc格式)c++版
經過這一段時間的對海洋資料的處理,接觸了大量的與海洋相關的資料,例如海洋地形、海洋表面溫度、鹽度、溼度、雲場、風場等資料,除了地形資料是grd格式外,其他的都是nc格式的資料。本文將以海洋風場資料為例,進行nc格式檔案的讀取。  
js計算兩個時間戳的時間差,並轉換為:幾天幾時幾分
function sj() { //功能:計算兩個時間之間相差多少個小時 var date = '2013-08-30 16:55:49:173'; date = date.substring(0
java 讀取資料庫資料並下載為Excel
java 讀取資料庫資料並下載為Excel 前臺 html <input type="button" id="javaExcel" value="java下載表格"> script <script> $("#javaExcel").clic
「新手必看」Python+Opencv實現攝像頭呼叫RGB影象並轉換成HSV模型
在ROS機器人的應用開發中,呼叫攝像頭進行機器視覺處理是比較常見的方法,現在把利用opencv和python語言實現攝像頭呼叫並轉換成HSV模型的方法分享出來,希望能對學習ROS機器人的新手們一點幫助。至於為什麼轉換成HSV模型,因為在機器視覺方面用HSV模型進行影象處理是比較方便的,實現的方法