You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
│ └── download_samples.py # Script to fetch public DICOM samples
68
74
└── doc/
69
-
└── dicom_to_ros.png
75
+
└── workflow_dicom.png
70
76
```
71
77
72
78
---
@@ -116,73 +122,47 @@ DICOM Client (storescu)
116
122
117
123
> **Synchronization:** All messages produced from a single DICOM file share the same `header.stamp`, making them compatible with `message_filters::TimeSynchronizer` for exact alignment of spatial, visual, and clinical data.
118
124
119
-
<!--### Image Normalization
125
+
### Image Normalization
120
126
121
-
DICOM images are typically 12-bit or 16-bit integers. The pipeline normalizes them to `mono8` (uint8) for compatibility with standard ROS 2 computer vision tooling:
127
+
DICOM images often come in 12-bit or 16-bit integers with varying ranges.
128
+
To make them compatible with standard Computer Vision tools (OpenCV/ROS), the imaging nodes perform Min-Max normalization to cast them to `mono8` (uint8):
- [Docker](https://docs.docker.com/get-docker/) and [Docker Compose](https://docs.docker.com/compose/)
132
-
- A Linux host with X11 (for RViz2 visualization)
134
+
The `dicom_server` node is responsible for parsing the incoming DICOM file. It extracts all necessary metadata—including patient info, study details, and geometric data—and publishes it in a single, comprehensive `dicom_interfaces/Dicom` message.
133
135
134
-
### Run the Demo
136
+
Downstream nodes subscribe to this topic and use the pre-parsed data:
137
+
* The `dicom2studyinfo` node subscribes to the `Dicom` message and republishes a subset of this information (patient demographics and study details) as a `StudyInfo` message. The fields include:
* The imaging (`dicom2img`, `dicom2video`) and point cloud (`dicom2pcl`) nodes use the geometric data like `pixel_spacing` and `slice_thickness` directly from the `Dicom` message to generate physically accurate `CameraInfo` and `PointCloud2` messages.
# Build and start the full pipeline (DICOM listener + RViz2)
144
-
docker compose up --build -d
145
-
```
146
-
147
-
On first run, a `sample_downloader` service automatically downloads and organizes sample DICOM files into `dicom_samples/2D/CT/`, `dicom_samples/3D/MRI/`, etc. The pipeline starts immediately after and listens for DICOM connections on port `11112`.
-[Docker](https://docs.docker.com/get-docker/) and [Docker Compose](https://docs.docker.com/compose/)
151
+
- A Linux host with X11 (for RViz2 visualization)
162
152
163
-
### Verify Output
153
+
### Running the Core Pipeline
164
154
165
-
Exec into the container to inspect the live topics:
155
+
The `docker/` directory runs the ROS 2 DICOM listener and all processing nodes. It mounts the `dicom_interfaces` and `dicom_to_ros` packages from the repo root into the container workspace.
docker compose -f docker/docker-compose.yml up --build -d
176
163
```
177
164
178
-
View images from the host:
179
-
180
-
```bash
181
-
ros2 run rqt_image_view rqt_image_view
182
-
# Select /dicom_image or /dicom_video_frames from the dropdown
183
-
```
184
-
185
-
3D point clouds and TF transforms are visualized automatically in the RViz2 instance launched by Docker Compose.
165
+
The pipeline starts immediately and listens for DICOM C-STORE requests on port `11112`.
186
166
187
167
### DICOM Server Parameters
188
168
@@ -193,16 +173,11 @@ ros2 run rqt_image_view rqt_image_view
193
173
194
174
---
195
175
196
-
## Test Data
197
-
198
-
The automated downloader fetches small, freely hosted DICOM samples sufficient for functional verification. For high-resolution clinical rendering (detailed head CTs, torso MRIs), manually place DICOM files into `dicom_samples/` from these sources:
176
+
## Demo
199
177
200
-
- **[OsiriX DICOM Library](https://www.osirix-viewer.com/resources/dicom-image-library/)** — High-resolution 3D volumes (e.g., MANIX head CTA)
0 commit comments