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

news2024/11/18 2:32:23

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,它们位于<INSTALL_DIR>\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>();
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 助手类

<PROJECT_NAME>.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 文件,如果您还有其他疑问,欢迎咨询我们或者加入我们官方技术交流群。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/107386.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android系统之路(初识MTK) ------Android11.0添加Recents一键清除最近任务按钮

Android11.0添加Recents一键清除最近任务按钮 今天因为在复测昨天的一个monkey压测并且还没测完,所以打算记录最近做系统开发的一些心得和经验,也记录一下自己的系统开发历程 修改前效果: 修改后的效果: 后期补上… 需要修改的文件列表(注意:各个版本或平台可能要修改…

Git使用

一、Git介绍 1.1、版本控制 在我们日常生活中&#xff0c;使用微信6.5.3版本&#xff0c;QQ7.4版本&#xff0c;Chrome 43.0.2357.65 版本&#xff0c;表示的都是某些软件使用的版本号。这些软件在开发过程中&#xff0c;版本都是由1不断的变化而来。对于软件公司来说&#x…

用魔法打败魔法!AI识别名人造假视频;OpenAI开源Point-E进军3D打印市场;谷歌CALM算法加速文本生成… | ShowMeAI资讯日报

&#x1f440;日报合辑 | &#x1f3a1;AI应用与工具大全 | &#x1f514;公众号资料下载 | &#x1f369;韩信子 &#x1f4e2; 用魔法打败魔法&#xff01;基于面部、手势和声音识别名人 deepfake 视频 https://www.pnas.org/doi/pdf/10.1073/pnas.2216035119 Deepfake 是 …

模型评估指标

模型评估指标【准度、精度、召回率、F1-score及ROC曲线】总结 参考于李沐的机器学习课程。 通常要使用多个模型综合评价一个模型的好坏。 Accuracy 预测正确的个数 / 样本总个数 sum(y_pred y_label)/y_label.size()Precision 正确地预测为类别 i 的个数 / 预测为 i 的总…

【信管5.1】进度管理规划与活动

进度管理规划与活动进度这个东西&#xff0c;相信在不少老板眼里就是你加班的基础。进度赶不上了怎么办&#xff1f;加班呀&#xff0c;进度赶上了呢&#xff1f;再多做点东西呀&#xff01;反正加班这件事是少不了的&#xff0c;当你学习完我们的项目管理知识之后&#xff0c;…

求词频与逆词频SnowNLP.tf与SnowNLP.idf

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 求词频与逆词频 SnowNLP.tf与SnowNLP.idf 选择题 以下关于python代码表述有误的一项是? from snownlp import SnowNLP myText ([ [python, python], [python, 编程, 编程], [django, py…

Java项目:springboot+vue教室图书馆预约管理系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 智慧物联网教室预约系统-后台系统 项目简介&#xff1a; 这是一个前后端分离的教室预约和查看系统项目&#xff0c;能够实现以教室为单位活动的预约和取…

【微服务】Nacos为什么放弃短连接(http)而选择拥抱长连接(gRPC)

目录 一、现状背景 二、场景分析 1、配置 2、服务 三、长连接核心诉求 1、功能性诉求 1.1、客户端 1.2、服务端 2、性能 3、负载均衡 4、连接生命周期 4.1、心跳保活机制 4.2、需要什么 四、长连接选型对比 五、基于长链接的⼀致性模型 1.、配置⼀致性模型 1.…

【软件测试】8年测试老鸟的解读,测试人你的发展?测试开发......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 测试开发到底是测试…

引擎入门 | Unity UI简介–第3部分(3)

本期我们继续为大家进行Unity UI简介&#xff08;第三部分&#xff09;的后续教程 本篇内容 7.使面板上下滑动 文章末尾可免费获取教程源代码 本篇本篇Unity UI简介&#xff08;第三部分&#xff09;篇幅较长&#xff0c;分为八篇&#xff0c;本篇为第三篇。 7.使面板上下…

第6章 关系代数语言

第6章 关系代数语言 考试范围&#xff1a;6.1 考试题型&#xff1a;计算题 考试内容&#xff1a;关系代数操作 Selection Projection Join Cartesian product Rename Union set-difference intersection 1、Selection(选行操作) 2、Projection(选列操作) 3、Join N…

rabbitmq基础4——单机多节点集群、多机集群部署、基础功能测试

文章目录一、一机多实例集群1.1 三机启动1.2 立主纳从1.3 查看集群状态1.4 web监控1.5 测试1.5.1 数据同步1.5.2 一从死&#xff0c;主仍战1.5.3 从复活&#xff0c;死亡期间数据同步1.5.4 主死&#xff0c;从活但不可用二、多机集群2.1 确定主机名2.2 三机部署rabbitmq2.3 设主…

白话说Java虚拟机原理系列【第二章】:Class字节码文件详解

前导说明&#xff1a; 本文基于《深入理解Java虚拟机》第二版和个人理解完成&#xff0c; 以大白话的形式期望能用大家都看懂的描述讲清楚虚拟机内幕&#xff0c; 后续会增加基于《深入理解Java虚拟机》第三版内容&#xff0c;并进行二个版本的对比。 Class字节码文件的数据结构…

ChatGPT 帮我跑了一个完整的 DevOps 流水线,离了个大谱...

大家好&#xff0c;我是米开朗基杨。上篇文章给大家介绍了&#x1f449;如何将 N 个 ChatGPT 账号接入微信&#xff0c;今天就来给大家演示一下如何利用 ChatGPT 帮我工作&#xff0c;让自己有更多的时间摸鱼&#xff01;上篇文章还没看的赶紧去看&#x1f447;我将 9 个 ChatG…

SpringBoot2核心技术(核心功能)- 05、Web开发【5.3 请求参数处理】

5.3、请求参数处理 0、请求映射 1、rest使用与原理 xxxMapping&#xff1b;Rest风格支持&#xff08;使用HTTP请求方式动词来表示对资源的操作&#xff09; 以前&#xff1a;/getUser 获取用户 /deleteUser 删除用户 /editUser 修改用户 /saveUser 保存用户 现在&#xff1…

Google 释出开源软件漏洞扫描工具 OSV-Scanner​

开源开发人员可在项目使用 OSV-Scanner&#xff0c;透过比对依赖项目和 OSV 漏洞资料库&#xff0c;找出项目的依赖项目中所存在的漏洞。Google 推出免费工具 OSV-Scanner&#xff08;https://github.com/google/osv-scanner&#xff09;&#xff0c;供开源开发人员可以更简单地…

docker网络模式 与 搭建nginx

目录 1. docker网络模式 2. 连接容器的三种方法 3. Docker Networking 3.1 创建网络 3.2 查看宿主机中创建的网络 3.3 删除网络 3.3 如何使用网络 4.搭建Nginx 1.准备工作 1.1 拉取镜像 1.2 在宿主机中创建挂载目录 2.准备2个tomcat 容器集群 3.准备 Nginx配置 3.…

ffmpeg 命令的简单使用

ffmpeg命令是在windows端使用的&#xff0c;使用前&#xff0c;需要先下载对应的 exe文件 1.准备环境 访问FFmpeg官网的下载地址&#xff08;https://www.gyan.dev/ffmpeg/builds/&#xff09;下载对应的压缩包&#xff0c;解压后即可使用 2.使用 ffmpeg.exe的使用 • 功能 …

利用Clion编译器完成C++的头文件与源文件的映射

1、前言 嘿嘿&#xff0c;众所周知&#xff0c;本人是一名Java后端人员&#xff0c;那么为什么开始搞C/C了咧&#xff1f; 因为Java是在C/C的基础上开发的语言&#xff0c;而且性能也是业界公认的除了机器语言外最好的编程语言&#xff0c;所以我就想啊&#xff0c;如果将Java…

记一次返工

记一次返工 作者&#xff1a;Grey 原文地址&#xff1a; 博客园&#xff1a;记一次返工 CSDN&#xff1a;记一次返工 本文搬运自自己的博客园博客&#xff0c;发布于 2018-05-12 说明 本周我经历了参加工作以来&#xff0c;最大的一次返工&#xff0c;这一周都是茶饭不思…