LEADTOOLS 入门教程: 使用 H264 视频创建 DICOM 文件 - 控制台 C#

LEADTOOLS是一个综合工具包的集合,用于将识别、文档、医疗、成像和多媒体技术整合到桌面、服务器、平板电脑、网络和移动解决方案中,是一项企业级文档自动化解决方案,有捕捉,OCR,OMR,表单识别和处理,PDF,打印捕获,归档,注释和显示功能。利用业界领先的图像处理技术,能够智能识别文件,可以用来识别任何类型的扫描或传真形式的图像。

LEADTOOLS 最新下载(qun:731259648)icon-default.png?t=M85Bhttps://www.evget.com/product/782/download

本教程介绍如何配置 LEADTOOLS DICOM Writer 过滤器,以使用 LEADTOOLS SDK 在 C# Window 控制台应用程序中使用 MPEG-2 传输中的 H.264 创建数据集。本教程通过调整示例 LEADTOOLS 媒体文件之一的大小来对高清视频进行编码,以创建与 MPEG-4 AVC/H.264 BD 兼容的 DICOM 文件。

概述
概括 本教程介绍如何使用 LEADTOOLS DICOM Writer 过滤器在 C# Windows 控制台应用程序中创建包含 H.264 压缩视频的 DICOM 文件。
完成时间 30分钟
视觉工作室项目 下载教程项目 (5 KB)
平台 Windows 控制台 C# 应用程序
集成开发环境 视觉工作室 2017、2019
开发许可 LEADTOOLS

所需知识

在使用文件观察器转换文件 - C# .NET Core教程之前,通过查看添加引用和设置许可证教程熟悉创建项目的基本步骤。

创建项目并添加 LEADTOOLS 引用

从添加引用和设置许可证教程中创建的项目副本开始。如果您没有该项目,请按照该教程中的步骤创建它。

所需的参考取决于项目的目的。可以通过本地 DLL 引用添加引用。

本教程需要以下本地 DLL,它们位于\LEADTOOLS22\Bin\Dotnet4\x64:

  • Interop.LMDSKernelLib2.dll
  • Interop.LMVResizeLib.dll
  • Leadtools.dll
  • Leadtools.Codecs.dll
  • Leadtools.Drawing.dll
  • Leadtools.ImageProcessing.Color.dll
  • Leadtools.ImageProcessing.Core.dll
  • Leadtools.Multimedia.dll

还需要以下非 LEADTOOLS DLL:

  • System.Deployment.dll
  • System.Drawing.dll
  • System.Windows.Forms
  • stdole.dll

有关特定功能所需的 DLL 的完整列表,请参阅要包含在您的应用程序中的文件。

不同的 SDK 功能需要不同的引用。有关完整列表,请参阅您的申请中必须包括的多媒体文件。

设置许可证文件

许可证解锁项目所需的功能。它必须在调用任何工具包函数之前设置。有关详细信息,包括针对不同平台的教程,请参阅设置运行时许可证。

有两种类型的运行时许可证:

  • 评估许可证,在下载评估工具包时获得。它允许评估工具包。
  • 部署许可证。如果需要部署许可证文件和开发人员密钥,请参阅获取许可证。

笔记

添加 LEADTOOLS NuGet 引用和设置许可证在添加引用和设置许可证教程 中有更详细的介绍。

添加创建 DICOM 文件代码

创建项目、添加参考和设置许可证后,就可以开始编码了。

在解决方案资源管理器中,打开Program.cs。将以下语句添加到顶部的 using 块中Program.cs:

【C#】

using System;
using System.IO;

using Leadtools;
using Leadtools.Dicom;
using Leadtools.Dicom.Common.DataTypes;
using Leadtools.Dicom.Common.Extensions;
using Leadtools.Multimedia;
using LTDicWrtLib;

请务必添加以下全局变量:

【C#】

static ConvertCtrl convert;

在Program类中,添加一个名为 的新方法CreateDICOMFile()。在方法内部调用这个方法Main(),如下图。此外,请务必Single-threaded Apartment (STA)通过添加[STAThread].

【C#】

[STAThread]
static void Main(string[] args)
{
SetLicense();
CreateDICOMFile();
}

将以下代码添加CreateDICOMFile()到编码高清视频的方法中,以创建 MPEG-4 AVC/H.264 BD 兼容的 DICOM 文件。您可以在此处.DS下载用于本教程的临时文件。

【C#】

private static void CreateDICOMFile()
{
string templateFile = @"FILE PATH TO TEMP Video_Photography.DS FILE";
string inputFile = @"C:\LEADTOOLS22\Resources\Media\DaDa_H264.mp4";
string outputFile = @"FILE PATH TO OUTPUT THE DCM FILE TO";

// Create instance of Convert control.
convert = new ConvertCtrl();

// Set the source and target files
convert.SourceFile = inputFile;
convert.TargetFile = outputFile;

// Need to resize sample video to be HD since no HD videos are in the SDK setup
convert.SelectedVideoProcessors.Add(convert.VideoProcessors.Resize);

LMVResizeLib.LMVResize resizeFilter = convert.GetSubObject(ConvertObject.SelVideoProcessor + 0) as LMVResizeLib.LMVResize;
resizeFilter.ForceSquarePixelOutput = true;
resizeFilter.Height = 1080;
resizeFilter.Width = 1920;
resizeFilter.OutputAspectRatioMode = LMVResizeLib.OutputAspectRatioModeConstants.OUTPUTASPECTRATIO_16_9;
resizeFilter.HeightControlMode = LMVResizeLib.SizeControlModeConstants.SIZECONTROL_FIXED;
resizeFilter.WidthControlMode = LMVResizeLib.SizeControlModeConstants.SIZECONTROL_FIXED;

// Done configuring the resize filter
System.Runtime.InteropServices.Marshal.ReleaseComObject(resizeFilter);
resizeFilter = null;

convert.VideoCompressors.H264.Selected = true;
convert.AudioCompressors.AAC.Selected = true;

LMH264EncoderLib.LMH264Encoder h264Encoder = convert.GetSubObject(ConvertObject.VideoCompressor) as LMH264EncoderLib.LMH264Encoder;
h264Encoder.EnableRateControl = false;
h264Encoder.QualityFactor = 28;
h264Encoder.FrameRate = 29.970f;
h264Encoder.EncodingSpeed = LMH264EncoderLib.eH264ENCODINGSPEED.H264SPEED_4;
h264Encoder.EncodingThreads = LMH264EncoderLib.eH264ENCODINGTHREADS.H264THREAD_AUTO;
h264Encoder.IFrameInterval = 11;
h264Encoder.PFrameInterval = 1;
h264Encoder.OutputFormat = LMH264EncoderLib.eH264OUTPUTFORMAT.H264FORMAT_HIGH_H264;

// Done configuring the filter
System.Runtime.InteropServices.Marshal.ReleaseComObject(h264Encoder);
h264Encoder = null;

// set the format
convert.TargetFormat = TargetFormatType.MPEG2TransportDICOM;

// Get the Dicom writer filter and set some options
//NOTE: MPEG-2 Transport is the target filter here
// DICOM writer is the file writer/Sink filter
ILTDicWrt2 dicomWriter = (ILTDicWrt2)convert.GetSubObject(ConvertObject.Sink);
dicomWriter.DICOMTemplateFile = templateFile;

dicomWriter.MPEG2DicomCompatibilityOption = MPEG2DicomCompatibilityConstants.MPEG2DICOMCOMP_IGNORE;


// Done configuring the filter
System.Runtime.InteropServices.Marshal.ReleaseComObject(dicomWriter);
dicomWriter = null;

// Add some event handlers
convert.Progress += new ProgressEventHandler(convert_Progress);
convert.Complete += new EventHandler(convert_Complete);

Console.WriteLine(string.Format("Starting to Convert {0}", convert.TargetFile));
convert.StartConvert();

while (convert.State != ConvertState.Stopped)
{
System.Windows.Forms.Application.DoEvents();
}

DicomEngine.Startup();

DicomDataSet ds = new DicomDataSet();
ds.Load(convert.TargetFile, DicomDataSetLoadFlags.LoadAndClose);
PatientBase patientBase = ds.Get();
patientBase.PatientName = new PersonName("Smith^John");
patientBase.PatientSex = PatientSex.Male;
patientBase.PatientID = "1234567890";
patientBase.PatientBirthDate = DateTime.Parse("09/18/1970");
patientBase.PatientBirthTime = DateTime.Parse(DateTime.Now.ToShortTimeString());
ds.Set(patientBase);


DicomElement element;
element = ds.FindFirstElement(null, DicomTag.SOPInstanceUID, true);
if (element != null)
ds.SetValue(element, Leadtools.DicomDemos.Utils.GenerateDicomUniqueIdentifier());

GenerateUidTag(ds, DicomTag.StudyInstanceUID);
GenerateUidTag(ds, DicomTag.SeriesInstanceUID);
GenerateUidTag(ds, DicomTag.SOPInstanceUID);

ds.Save(convert.TargetFile, DicomDataSetSaveFlags.None);

DicomEngine.Shutdown();

Console.WriteLine("Patient information updated and new UIDs generated.");
}

在Program类中,添加一个名为 的新方法GenerateUidTag(DicomDataSet dicom, long UidTag)。CreateDICOMFile()如上所示,将在方法内部调用此方法以创建唯一标识符。

private static void GenerateUidTag(DicomDataSet dicom, long UidTag)
{
DicomElement element;
element = dicom.FindFirstElement(null, UidTag, true);
if (element != null)
dicom.SetValue(element, Leadtools.DicomDemos.Utils.GenerateDicomUniqueIdentifier());
}

Program在名为convert_Complete(object sender, EventArgs e)and的类中添加两个新的事件处理程序convert_Progress(object sender, ProgressEventArgs e)。这些将在CreateDICOMFile()方法内部使用,如上所示,并将用于将应用程序进度打印到控制台的目的。这些是可选的。

private static void convert_Complete(object sender, EventArgs e)
{
Console.WriteLine(string.Format("\nConversion of \"{0}\" complete!", convert.TargetFile));
}

private static void convert_Progress(object sender, ProgressEventArgs e)
{
Console.Write(string.Format("\rConversion progress: {0}%", e.percent));
}

添加 Utils 助手类

.csproj在Solution Explorer中右键单击并选择Add -> New Item...。选择类选项并命名文件Utils.cs。

将以下语句添加到顶部的 using 块中Utils.cs:

using System;
using System.Text;
using System.Diagnostics;

在Utils类中,添加以下变量。

private static String _prevTime;
private static String _leadRoot = null;
private static Object _lock = new object();
private static int _count = 0;
private const int _maxCount = int.MaxValue;

Utils向名为的类添加一个新方法GenerateDicomUniqueIdentifier()。添加以下代码以生成 UID。

public static string GenerateDicomUniqueIdentifier()
{
try
{
lock (_lock)
{
// yyyy four digit year
// MM month from 01 to 12
// dd 01 to 31
// HH hours using a 24-hour clock form 00 to 23
// mm minute 00 to 59
// ss second 00 to 59
// fffffff ten millionths of a second
const string dateFormatString = "yyyyMMdd.HHmmss.fffffff";

string sUidRet = "";
if (_leadRoot == null)
{
StringBuilder sb = new StringBuilder();

sb.Append("1.2.840.114257.1.1");

// Process Id
sb.AppendFormat(".{0}", (uint)Process.GetCurrentProcess().Id);

_leadRoot = sb.ToString();

_prevTime = DateTime.UtcNow.ToString(dateFormatString);
}

StringBuilder uid = new StringBuilder();
uid.Append(_leadRoot);

String time = DateTime.UtcNow.ToString(dateFormatString);
if (time.Equals(_prevTime))
{
if (_count == _maxCount)
throw new Exception("GenerateDicomUniqueIdentifier error -- max count reached.");

_count++;
}
else
{
_count = 1;
_prevTime = time;
}

uid.AppendFormat(".{0}.{1}", time, _count);

sUidRet = uid.ToString();

// This should not happen
if (sUidRet.Length > 64)
sUidRet = sUidRet.Substring(0, 64);

return sUidRet;
}
}
catch (Exception ex)
{
throw ex;
}
}

运行项目

按F5或选择Debug -> Start Debugging运行项目。

如果正确遵循这些步骤,应用程序将运行并在 MPEG-2 传输中使用 H.264 创建数据集。您可以在此处找到预期的输出 DCM 和 AVI 文件。

以上便是使用 H264 视频创建 DICOM 文件,如果您还有其他疑问,欢迎咨询我们或者加入我们官方技术交流群。

你可能感兴趣的:(Leadtools系列教程,c#,音视频,开发语言,leadtools,医疗影像)