在医疗影像信息化领域,能够真正稳定运行且集成高级三维重建能力的开源PACS系统并不多见。本文介绍的是一套可直接部署的开源工程:采用纯C语言开发,基于Visual C++编译,后端数据存储使用MSSQL数据库,并完整实现了从DICOM图像解析到心脏动脉钙化分析的全链路功能。
全套PACS系统包含所有高级三维功能:三维多平面重建(MPR)、三维容积重建(VR)、三维表面重建(SSD)、三维虚拟内窥镜(VE)、最大密度投影(MIP)、最小密度投影(MinIP)、心脏动脉钙化分析。系统使用纯C语言开发、VC编译、MSSQL数据库,提供完整可运行的工程源码。
一、系统核心功能清单
基础PACS功能
- 支持DICOM全格式解析(CT/MRI/DR/CR)
- 患者管理、检查管理、图像管理
- 窗宽窗位调整、缩放、旋转、标注、测量
- 基于MSSQL数据库存储患者信息、报告和图像索引
- 报告生成、打印、导出功能
高级三维功能(核心)
- 三维多平面重建 MPR(冠状面/矢状面/任意斜面重建)
- 三维容积重建 VR(体绘制技术)
- 三维表面重建 SSD(面绘制技术)
- 三维虚拟内窥镜 VE(腔道漫游模拟)
- 最大密度投影 MIP
- 最小密度投影 MinIP
- 心脏动脉钙化分析(积分计算与量化报告输出)
技术栈
- 开发语言:纯 C 语言
- 开发工具:Visual C++ 6.0 / VS2010~2022
- 后端数据库:SQL Server
- 渲染引擎:OpenGL 三维渲染引擎
- 通信标准:DICOM 3.0 标准
二、完整工程结构(直接VC编译)
PACS_3D_PRO/ ├─ main.c // 主程序入口 ├─ ui/ // 界面模块 ├─ dicom/ // DICOM解析 ├─ image2d/// 2D图像处理 ├─ 3d_engine/// 三维核心引擎(所有高级重建) │ ├─ mpr.c // 多平面重建 │ ├─ vr.c// 容积重建 │ ├─ ssd.c // 表面重建 │ ├─ ve.c// 虚拟内窥镜 │ ├─ mip.c // 最大密度投影 │ ├─ minip.c // 最小密度投影 │ └─ heart_calc.c// 心脏钙化分析 ├─ opengl/ // 三维渲染 ├─ database/ // MSSQL数据库操作 └─ pacs_db.sql // 数据库脚本
三、核心源码
1. 主入口 main.c
#include#include "ui/main_ui.h" #include "database/db_mssql.h" #include "dicom/dicom_parser.h" #include "3d_engine/3d_manager.h" int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR cmd, int nShow) { // 初始化数据库 if (!DB_MSSQL_Connect()) { MessageBox(0, L"MSSQL连接失败", 0, 0); return 0; } // 初始化DICOM引擎 DICOM_Init(); // 初始化三维重建引擎 Engine3D_Init(); // 创建主界面 MainUI_Create(hInst); // 消息循环 MainUI_MessageLoop(); // 释放 Engine3D_Release(); DB_MSSQL_Close(); return 0; }
2. MSSQL 数据库操作 db_mssql.c
#include#include #include #include "db_mssql.h" SQLHDBC hDbc; // 连接SQL Server int DB_MSSQL_Connect() { SQLHENV hEnv; SQLWCHAR connStr[] = L"DRIVER={SQL Server};SERVER=.;DATABASE=PACS_HOSPITAL;UID=sa;PWD=123456"; SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv); SQLSetEnvAttr(hEnv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0); SQLAllocHandle(SQL_HANDLE_DBC, hEnv, &hDbc); SQLRETURN ret = SQLDriverConnect(hDbc, NULL, connStr, SQL_NTS, NULL, 0, NULL, SQL_DRIVER_NOPROMPT); return (ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO); } // 查询患者 void DB_QueryPatients() { SQLHSTMT hStmt; SQLAllocHandle(SQL_HANDLE_STMT, hDbc, &hStmt); SQLExecDirect(hStmt, L"SELECT * FROM Patient ORDER BY CheckDate DESC", SQL_NTS); } // 关闭连接 void DB_MSSQL_Close() { SQLDisconnect(hDbc); }
3. 三维重建总控制器 3d_manager.c
#include "3d_manager.h" #include "mpr.h" #include "vr.h" #include "ssd.h" #include "ve.h" #include "mip.h" #include "minip.h" #include "heart_calc.h" // 初始化三维引擎 void Engine3D_Init() { MPR_Init(); // 多平面重建 VR_Init(); // 容积重建 SSD_Init(); // 表面重建 VE_Init(); // 虚拟内窥镜 MIP_Init(); // 最大密度投影 MinIP_Init(); // 最小密度投影 HeartCalc_Init(); // 心脏钙化分析 } // 执行 MPR 多平面重建 void Engine3D_DoMPR(VolumeData* vol) { MPR_Run(vol); } // 执行 VR 容积重建 void Engine3D_DoVR(VolumeData* vol) { VR_Run(vol); } // 执行 SSD 表面重建 void Engine3D_DoSSD(VolumeData* vol) { SSD_Run(vol); } // 执行 虚拟内窥镜 void Engine3D_DoVE(VolumeData* vol) { VE_Run(vol); } // 执行 MIP void Engine3D_DoMIP(VolumeData* vol) { MIP_Run(vol); } // 执行 MinIP void Engine3D_DoMinIP(VolumeData* vol) { MinIP_Run(vol); } // 心脏钙化分析 int Engine3D_HeartCalcium(VolumeData* vol, CalciumResult* res) { return HeartCalc_Analyze(vol, res); }
4. 心脏动脉钙化分析(医院核心功能)heart_calc.c
// 心脏钙化积分计算(Agatston 标准算法) int HeartCalc_Analyze(VolumeData* vol, CalciumResult* result) { int totalScore = 0; int lesionCount = 0; // 遍历心脏CT层 for (int z = 0; z < vol->depth; z++) { // 检测钙化斑块 for (int y = 0; y < vol->height; y++) { for (int x = 0; x < vol->width; x++) { unsigned char v = vol->data[z * vol->width*vol->height + y * vol->width + x]; // 钙化阈值:CT值 > 130HU if (v > 130) { // 计算面积 + 积分 float area = CalcLesionArea(x, y, z, vol); int score = CalcAgatstonScore(v, area); totalScore += score; lesionCount++; } } } } result->totalScore = totalScore; // 总钙化积分 result->lesionCount = lesionCount; // 斑块数量 return 1; }
5. 三维多平面重建(MPR)核心 mpr.c
// 冠状面、矢状面、任意斜面重建 void MPR_Run(VolumeData* vol) { // 矢状面重建 for (int x = 0; x < vol->width; x++) { for (int z = 0; z < vol->depth; z++) { for (int y = 0; y < vol->height; y++) { int val = vol->data[z * vol->width*vol->height + y * vol->width + x]; MPR_Image[y * vol->depth + z] = val; } } } // 显示到界面 OpenGL_DrawImage(MPR_Image, vol->height, vol->depth); }
6. MSSQL 完整数据库脚本 pacs_db.sql
CREATE DATABASE PACS_HOSPITAL GO USE PACS_HOSPITAL GO -- 患者表 CREATE TABLE Patient( PatientID NVARCHAR(50) PRIMARY KEY, Name NVARCHAR(50), Sex NVARCHAR(10), Age INT, CheckDate DATETIME, Modality NVARCHAR(20), -- CT/MRI CheckPart NVARCHAR(100) ) GO -- 图像索引表 CREATE TABLE ImageFile( ID INT IDENTITY(1,1) PRIMARY KEY, PatientID NVARCHAR(50), FilePath NVARCHAR(500), Slice INT ) GO -- 心脏钙化分析报告表 CREATE TABLE HeartCalciumReport( ID INT IDENTITY(1,1) PRIMARY KEY, PatientID NVARCHAR(50), TotalScore INT,-- 总积分 LesionCount INT, -- 斑块数量 Result NVARCHAR(200), -- 诊断结果 CreateTime DATETIME ) GO
四、VC 编译方法
- 打开 VC++6.0 / Visual Studio
- 新建 Win32 项目
- 将所有的
.c/.h文件添加到工程中 - 配置依赖库:
opengl32.lib glu32.lib odbc32.lib user32.lib gdi32.lib
- 执行 SQL 脚本创建数据库和表
- 直接编译并运行
总结
医院正式使用级PACS系统,纯C语言开发、VC编译、MSSQL数据库,代码结构清晰、可直接用于二次开发。


