public static DRR ParseDICOM(string dcmFile) { var drr = new DRR(); var dcm = DICOMObject.Read(dcmFile); if (!dcm.IsDRR()) { throw new Exception("DICOM object not DRR"); } var sel = dcm.GetSelector(); //READ VOXELS TO MAT var pixels = SliceReader.ReadVoxels(dcm); var window = sel.WindowWidth.Data; var level = sel.WindowCenter.Data; using (var im = new Mat((int)sel.Rows.Data, (int)sel.Columns.Data, MatType.CV_32FC1, pixels.ToArray())) { drr.Image = im.WindowAndLevel(level, window).CvtColor(ColorConversionCodes.GRAY2BGR); } var orient = PatientPosition.FromAbbreviation(sel.PatientPosition.Data); FieldRenderer.Render(sel, drr); //DRAW ISO var iso = sel.IsocenterPosition?.Data_; if (iso != null) { var identity = MatMaker.Identity(4, 4); var iso3d = iso.ToPoint3f(); var gantryAngle = sel.GantryAngle.Data; var collAngle = sel.BeamLimitingDeviceAngle.Data; var tableAngle = sel.PatientSupportAngle.Data; var dcm2IEC = Transform.DICOM2IEC(orient.Orientation); var tx = Transform.GantryTransform(gantryAngle); // iso3d = Transform.IECToDICOM(orient.Orientation).TransformPoint3f(isoDICOM_BEVCoord); var sid = sel.RTImageSID.Data; var mag = 1.0f;// (float)(sid / (sid - isoDICOM_BEVCoord.Z)); var origin = new Point2f((float)sel.RTImagePosition.Data_[0], (float)sel.RTImagePosition.Data_[0]); var spacing = sel.ImagePlanePixelSpacing.Data_; // var isoDICOM_BEV = Transform.IECToDICOM(orient.Orientation).TransformPoint3f(isoIEC_BEV); GraticuleRenderer.Render(drr.Image, collAngle, spacing[0]); //drr.Image.Line(iso2D, pt2, // new Scalar(255, 255, 0), 1, LineTypes.Link8); drr.Label = sel.RTImageLabel?.Data; } return(drr); }
public static void Render(Mat image, double collimatorAngleDeg, double mmPerPixel) { var extent = 200; var baseTickSize = 5; var iso2D = new Point(image.Cols / 2, image.Rows / 2); var x1Grat = new Point(extent / mmPerPixel, 0); var x2Grat = new Point(-extent / mmPerPixel, 0); var y1Grat = new Point(0, extent / mmPerPixel); var y2Grat = new Point(0, -extent / mmPerPixel); for (int i = -extent; i <= extent; i += 10) { int tickSize = baseTickSize; if (i % 50 == 0) { tickSize = 2 * baseTickSize; } var tickY1 = new Point(i / mmPerPixel, tickSize / mmPerPixel); var tickY2 = new Point(i / mmPerPixel, -tickSize / mmPerPixel); var tickX1 = new Point(tickSize / mmPerPixel, i / mmPerPixel); var tickX2 = new Point(-tickSize / mmPerPixel, i / mmPerPixel); tickY1 = DRR.Rotate(tickY1, collimatorAngleDeg) + iso2D; tickY2 = DRR.Rotate(tickY2, collimatorAngleDeg) + iso2D; tickX1 = DRR.Rotate(tickX1, collimatorAngleDeg) + iso2D; tickX2 = DRR.Rotate(tickX2, collimatorAngleDeg) + iso2D; image.Line(tickX1, tickX2, new Scalar(0, 255, 255), 1, LineTypes.Link8); image.Line(tickY1, tickY2, new Scalar(0, 255, 255), 1, LineTypes.Link8); } x1Grat = DRR.Rotate(x1Grat, collimatorAngleDeg) + iso2D; x2Grat = DRR.Rotate(x2Grat, collimatorAngleDeg) + iso2D; y1Grat = DRR.Rotate(y1Grat, collimatorAngleDeg) + iso2D; y2Grat = DRR.Rotate(y2Grat, collimatorAngleDeg) + iso2D; image.Line(x1Grat, x2Grat, new Scalar(0, 255, 255), 1, LineTypes.Link8); image.Line(y1Grat, y2Grat, new Scalar(0, 255, 255), 1, LineTypes.Link8); image.DrawMarker(new Point(iso2D.X, iso2D.Y), new Scalar(0, 0, 255), MarkerTypes.Cross, (int)(10 * mmPerPixel), 1, LineTypes.Link8); }
public static void Render(DICOMSelector sel, DRR drr) { //Field rendering var exposure = sel.ExposureSequence; var beamLimits = exposure?.Select(s => s.BeamLimitingDeviceSequence); if (beamLimits != null) { var collAngle = sel.BeamLimitingDeviceAngle.Data; var mmPerPixel = sel.ImagePlanePixelSpacing.Data_; var points = new List <List <Point> >(); var xLimits = beamLimits.Items.FirstOrDefault(b => b.GetSelector().RTBeamLimitingDeviceType.Data == "X" || b.GetSelector().RTBeamLimitingDeviceType.Data == "ASYMX"); var yLimits = beamLimits.Items.FirstOrDefault(b => b.GetSelector().RTBeamLimitingDeviceType.Data == "Y" || b.GetSelector().RTBeamLimitingDeviceType.Data == "ASYMY"); if (xLimits != null && yLimits != null) { var xjaws = xLimits.GetSelector().LeafJawPositions.Data_; var yjaws = yLimits.GetSelector().LeafJawPositions.Data_; var x1y1 = new Point(xjaws[0] / mmPerPixel[0], yjaws[0] / mmPerPixel[0]); var x1y2 = new Point(xjaws[0] / mmPerPixel[0], yjaws[1] / mmPerPixel[0]); var x2y2 = new Point(xjaws[1] / mmPerPixel[0], yjaws[1] / mmPerPixel[0]); var x2y1 = new Point(xjaws[1] / mmPerPixel[0], yjaws[0] / mmPerPixel[0]); x1y1 = DRR.Rotate(x1y1, collAngle) + drr.Iso2D; x1y2 = DRR.Rotate(x1y2, collAngle) + drr.Iso2D; x2y2 = DRR.Rotate(x2y2, collAngle) + drr.Iso2D; x2y1 = DRR.Rotate(x2y1, collAngle) + drr.Iso2D; points.Add(new List <Point>() { x1y1, x1y2, x2y2, x2y1 }); } //points.Add(field.Points().Select(p => new Point(p.X, p.Y)).ToList()); drr.Image.DrawContours(points, 0, new Scalar(255, 0, 0)); } }