1. 程式人生 > >VS2015 編譯DCMTK,讀取CT影象並轉換為OpenCV格式

VS2015 編譯DCMTK,讀取CT影象並轉換為OpenCV格式

一、DCMTK編譯(-mD/-mDd模式)

0. 材料:

  • DCMTK3.6.2原始碼
  • CMake
  • VS2015

1. DCMTK原始碼下載

2. CMake下載

3. 編譯

3.1定位原始碼

開啟CMake,選擇DCMTK原始碼所在目錄,編譯結果存放目錄,如下如所示:開啟CMake,選擇DCMTK原始碼所在目錄,編譯結果存放目錄,如下如所示:
image

3.2 確定編譯器

選擇正確的原始碼目錄和編譯結果存放目錄後,點選【Configuire】,選擇所需編譯器,這裡編譯Win32位,所以選擇Visual Studio 14 2015編譯器,如果需要編譯x64,選擇Visual Studio 14 2015 Win64編譯器,然後點選【確定】.
image

3.3 修改CMake配置

這裡需要修改許多處,不然會編譯出錯,修改處見下圖:
image
image

image

3.5 生成工程

上步完成後,再次點選【Configure】,在點選【Generate】生成工程,點選【Open Project】,用VS2015開啟構建的工程。

3.6 確認工程構建正確

隨便選擇一個解決方案:
1. 確認是使用字符集為:多位元組字串集。
image

  1. 確認是生成動態連結庫形式。
    image
    image

確定無誤後,執行編譯。

3.7 編譯

選擇ALL BUILD解決方案,右鍵【生成】開始編譯。
image

3.8 安裝

3.7步無誤後,選擇INSTALL解決方案,右鍵【生成】,開始安裝,則在安裝目錄下將生成編譯的結果。
image

3.9 Debug和Release版本各生成一份

通過切換VS2015的解決方案配置,Debug版本和Release版本執行3.7和3.8各一次,則能生成Debug和Release版本各生成一份。
image

3.10 結果

結果如下圖所示
image

二、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”中,如下圖所示:
image

不清楚CT片的檔案頭到底包含什麼資訊?? 使用Sante DICOM Viewer 8 檢視CT影象,從【view】——【file Header】中檢視。
image
image

五、可能會遇到的程式設計錯誤

  • 出現錯誤的提示的函式以WSA開頭,如:LNK2001 無法解析的外部符號 [email protected] CC E:\visualstudio\CC\CC\oflog.lib(oflog.obj),如圖:
    image

解決方案:顯示連結ws2_32.lib庫

#pragma comment(lib, "ws2_32.lib")
  • 出現錯誤:LNK2001 無法解析的外部符號 [email protected] CC E:\visualstudio\CC\CC\ofstd.lib(ofstd.obj)
    image

解決方案:顯示連結iphlpapi.lib庫

#pragma comment(lib,"iphlpapi.lib")
  • 出現錯誤:LNK2001 無法解析的外部符號 [email protected] CC E:\visualstudio\CC\CC\dcmdata.lib(dcuid.obj)
    image

解決方案:顯示連結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模型進行影象處理是比較方便的,實現的方法