DCMTK读取dicom图像

背景,使用VTK、ITK读取dicom图像,出现中文路径,无法读取的情况,才找到了DCMTK作为替换方案

#include <dcmtk/dcmdata/dctk.h>
#include <dcmtk/dcmdata/dcfilefo.h>
#include <dcmtk/dcmimgle/dcmimage.h>
#include <dcmtk/dcmimage/diregist.h>
#include <dcmtk/dcmjpeg/djdecode.h>
#include <dcmtk/ofstd/ofstring.h>
#include <dcmtk/dcmdata/dcostrmb.h>

    DcmFileFormat* dcmff = new DcmFileFormat;
    OFCondition oc = dcmff->loadFile(OFFilename(DicomFileName.c_str()));
    if (oc.bad())
    {
        std::cout << "Fail:" << oc.text();
        return false;
    }
    DcmDataset* dataset = dcmff->getDataset();
    OFString   bits;

    if (dataset->findAndGetOFString(DCM_BitsAllocated, bits).bad())
    {
        return false;
    }
    int iBits = atoi(bits.c_str());
        // decompress data set if compressed
    if (dataset->chooseRepresentation(EXS_LittleEndianExplicit, NULL).good() &&
        dataset->canWriteXfer(EXS_LittleEndianExplicit))
    {
        DicomImage* img = new DicomImage(dataset, EXS_LittleEndianExplicit);
        int ingCount = img->getFrameCount();

        int nWidth = img->getWidth();			//获得图像宽度
        int nHeight = img->getHeight();			//获得图像高度

        Size[0] = nWidth;
        Size[1] = nHeight;
        Size[2] = ingCount;

        if (iBits == 8)
        {
            charDataPtr = new unsigned char[Size[0] * Size[1] * Size[2]];
            DataType = "unsigned_char";
            for (int i = 0; i < ingCount; i++)
            {
                unsigned char* pixelData = (unsigned char*)(img->getOutputData(8, i));
                memcpy(charDataPtr + i * nHeight * nWidth, pixelData, nHeight* nWidth * sizeof(unsigned char));
            }
        }
        else if (iBits == 16)
        {
            shortDataPtr = new short[Size[0] * Size[1] * Size[2]];
            DataType = "short";
            for (int i = 0; i < ingCount; i++)
            {
                short* pixelData = (short*)(img->getOutputData(16, i));
                memcpy(shortDataPtr + i * nHeight * nWidth, pixelData, nHeight* nWidth * sizeof(short));
            }
        }
    }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 首先,您需要确保已经成功安装了OpenCV和DCMTK库,并且已经正确配置了Xcode项目。 接下来,您可以使用OpenCV的图形用户界面(GUI)模块来创建一个窗口,并在其中显示DICOM图像。以下是示例代码: ```cpp #include <iostream> #include <opencv2/opencv.hpp> #include <dcmtk/dcmdata/dctk.h> #include <dcmtk/dcmimgle/dcmimage.h> using namespace std; using namespace cv; int main(int argc, char** argv) { // 读取DICOM图像 DcmFileFormat fileformat; OFCondition status = fileformat.loadFile("your_dicom_file_path"); if (!status.good()) { cerr << "Error: cannot read DICOM file!" << endl; return -1; } DcmDataset* dataset = fileformat.getDataset(); DicomImage* image = new DicomImage(dataset, EXS_LittleEndianExplicit); if (image == nullptr || image->getStatus() != EIS_Normal) { cerr << "Error: cannot load DICOM image!" << endl; return -1; } const Uint8* pixelData = (Uint8*)(image->getOutputData(8)); int rows = image->getHeight(); int cols = image->getWidth(); // 将DICOM图像转换为OpenCV格式 Mat cvImage(rows, cols, CV_8UC1, (void*)pixelData); cv::normalize(cvImage, cvImage, 0, 255, NORM_MINMAX); // 创建窗口并显示图像 namedWindow("DICOM Image", WINDOW_NORMAL); imshow("DICOM Image", cvImage); waitKey(0); // 程序结束时释放内存 delete image; return 0; } ``` 接下来,您可以使用OpenCV的鼠标回调函数来实现鼠标拖动画圆的功能。以下是示例代码: ```cpp // 定义全局变量 vector<Point> circle_centers; // 存储所有圆心坐标 // 鼠标回调函数 void onMouse(int event, int x, int y, int flags, void* userdata) { if (event == EVENT_LBUTTONDOWN) // 鼠标左键按下 { circle_centers.push_back(Point(x, y)); // 将圆心坐标存入vector } else if (event == EVENT_LBUTTONUP) // 鼠标左键松开 { Mat* image = (Mat*)userdata; for (int i = 0; i < circle_centers.size(); i++) { circle(*image, circle_centers[i], 10, Scalar(0, 0, 255), 2); // 画圆 } imshow("DICOM Image", *image); } } int main(int argc, char** argv) { // 读取和显示DICOM图像的代码略 // 设置鼠标回调函数 setMouseCallback("DICOM Image", onMouse, (void*)&cvImage); // 等待用户按下ESC键退出程序 while (waitKey(0) != 27); // 程序结束时释放内存 delete image; return 0; } ``` 在此示例代码中,我们使用了一个全局变量circle_centers来存储所有圆心坐标,当鼠标左键按下时将当前坐标存入vector中,当鼠标左键松开时,我们循环遍历所有圆心坐标,并在图像上画圆。最后,我们更新窗口并等待用户按下ESC键退出程序。 希望这个示例代码可以对您有所帮助! ### 回答2: 在Xcode中使用OpenCV、C++DCMTK读取DICOM图像,并且通过鼠标拖动实现在图像上画多个圆并显示。 首先,我们需要使用DCMTK库来读取DICOM图像文件。DCMTK是一个用于处理医学图像和通信的开源软件包。通过使用DCMTK库提供的函数,我们可以轻松地打开和读取DICOM图像文件。 然后,我们需要使用OpenCV库来显示和处理图像。OpenCV是一个功能强大的计算机视觉库,可以提供各种图像处理和计算机视觉任务的功能。通过使用OpenCV库提供的函数,我们可以读取、处理和显示DICOM图像。 接下来,我们需要添加鼠标事件监听器,以便通过鼠标拖动在图像上画圆。我们可以使用OpenCV库提供的鼠标事件处理函数,例如`cv::setMouseCallback()`函数,以便监听鼠标事件并响应用户的操作。 当用户通过鼠标拖动在图像上画圆时,我们可以捕获鼠标事件,获取鼠标的位置,并绘制一个圆形图像。我们可以使用OpenCV库提供的函数,例如`cv::circle()`函数,以便在图像上绘制圆形。每当用户拖动鼠标时,我们可以更新圆的位置和半径,并重新绘制图像,以显示用户绘制的所有圆。 最后,我们可以使用OpenCV库提供的函数,例如`cv::imshow()`函数,以便在窗口中显示图像。这样,当用户通过鼠标拖动绘制圆时,显示的图像会即时更新,以显示用户所绘制的所有圆。 总之,在Xcode中使用OpenCV、C++DCMTK读取DICOM图像,并通过鼠标拖动实现在图像上画多个圆并显示,我们需要使用DCMTK读取DICOM图像文件,使用OpenCV库显示和处理图像,添加鼠标事件监听器,并在事件响应函数中绘制和更新圆。 ### 回答3: 要在Xcode中使用OpenCV和DCMTK读取DICOM图像并实现鼠标拖动画多个圆并显示,可以按照以下步骤进行操作: 1. 在Xcode中创建一个新项目。 2. 导入OpenCV和DCMTK的库文件,并配置项目的编译设置,确保能够成功编译运行。 3. 在代码中使用DCMTK读取DICOM图像,并将其转换为OpenCV的Mat对象。 4. 创建一个窗口,在窗口中显示DICOM图像。 5. 实现鼠标事件的回调函数,用于捕捉鼠标的拖动操作。 6. 在回调函数中,根据鼠标的拖动位置,计算圆的半径和中心坐标,并在图像上绘制圆。 7. 每次鼠标拖动结束后,更新窗口显示的图像,使绘制的圆可以被显示出来。 8. 循环监听鼠标事件,等待用户的操作。 通过以上步骤,您就可以在Xcode中使用OpenCV和DCMTK实现读取DICOM图像,并实现鼠标拖动画多个圆并显示。以上是一个简单的实现思路,根据具体的需求和细节,可能还需要添加一些其他的功能和逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值