public void SetGainFile(string fn) { if ((IntPtr)gain_map_ != IntPtr.Zero) { Marshal.FreeHGlobal((IntPtr)gain_map_); Kernel32Interface.CloseHandle((IntPtr)gain_map_); gain_map_ = (ushort *)IntPtr.Zero; } if ((IntPtr)gain_med_map_ != IntPtr.Zero) { Marshal.FreeHGlobal((IntPtr)gain_med_map_); Kernel32Interface.CloseHandle((IntPtr)gain_med_map_); gain_med_map_ = (ushort *)IntPtr.Zero; } if (File.Exists(fn)) { List <ushort[, ]> list = HisObject.OpenFile(fn).dataList; gain_seq_num_ = list.Count; int count = list[0].Length; width_ = list[0].GetLength(1); height_ = list[0].GetLength(0); gain_map_ = ArrayListToBuffer(list); gain_med_map_ = (ushort *)Marshal.AllocHGlobal((int)(gain_seq_num_ * sizeof(short))); PKL_Interface.Acquisition_CreateGainMap(gain_map_, gain_med_map_, count, gain_seq_num_); offset_map_ = (ushort *)Marshal.AllocHGlobal((int)(width_ * height_ * sizeof(short))); for (int i = 0; i < width_ * height_; i++) { offset_map_[i] = 0; } } }
public void SetPixelMapFile(string fn) { if ((IntPtr)pixel_corr_list_ != IntPtr.Zero) { Marshal.FreeHGlobal((IntPtr)pixel_corr_list_); Kernel32Interface.CloseHandle((IntPtr)pixel_corr_list_); pixel_corr_list_ = (int *)IntPtr.Zero; } if (File.Exists(fn)) { List <ushort[, ]> list = HisObject.OpenFile(fn).dataList; int Frames = list.Count; width_ = list[0].GetLength(1); height_ = list[0].GetLength(0); int pCorrListSize = 0; ushort *pPixelSoure = ArrayListToBuffer(list); PKL_Interface.Acquisition_CreatePixelMap(pPixelSoure, height_, width_, null, ref pCorrListSize); pixel_corr_list_ = (int *)Marshal.AllocHGlobal((int)(pCorrListSize * sizeof(int))); PKL_Interface.Acquisition_CreatePixelMap(pPixelSoure, height_, width_, pixel_corr_list_, ref pCorrListSize); Marshal.FreeHGlobal((IntPtr)pPixelSoure); Kernel32Interface.CloseHandle((IntPtr)pPixelSoure); pPixelSoure = (ushort *)IntPtr.Zero; } }
protected override void Trigger_TriggerChanged(TRIGGER_STATUS status) { if ((TRIGGER_STATUS)status == TRIGGER_STATUS.ON) { seqenceNum = 0; int msgID = GenerateWinMessage("Simulate capturing images..."); RefreshScale(); if (captureImageMode == CapturePKI.PanelCaptureMode.Sequence) { Kernel32Interface.SendMessage(HostHandle, WIN_MSG.WM_SHOW_PROGRESS, msgID, FrameCount); } else if (captureImageMode == CapturePKI.PanelCaptureMode.Continuous) { Kernel32Interface.SendMessage(HostHandle, WIN_MSG.WM_SHOW_PROGRESS, msgID, 0); } Kernel32Interface.SendMessage(HostHandle, WIN_MSG.WM_TRIGGER_CHANGE, (int)status, 0); timerGenerateImage.Start(); //Trigger.Stop(); //int msgID = GenerateWinMessage("Capturing images..."); } else if ((TRIGGER_STATUS)status == TRIGGER_STATUS.OFF) { Kernel32Interface.SendMessage(HostHandle, WIN_MSG.WM_SHOW_PROGRESS, -2, 0); Kernel32Interface.SendMessage(HostHandle, WIN_MSG.WM_TRIGGER_CHANGE, (int)status, 0); timerGenerateImage.Stop(); Trigger.Stop(); } }
public override void Cancel() { WorkStatus = false; Kernel32Interface.SendMessage(HostHandle, WIN_MSG.WM_CAPTURE_WORKSTATUS, 0, 0); Kernel32Interface.SendMessage(HostHandle, WIN_MSG.WM_SHOW_PROGRESS, -2, 0); timerGenerateImage.Stop(); Trigger.Stop(); base.Cancel(); }
public override void Start() { WorkStatus = true; int msgID = GenerateWinMessage("Preparing irradiation and capturing..."); Kernel32Interface.SendMessage(HostHandle, WIN_MSG.WM_SHOW_PROGRESS, msgID, 0); Kernel32Interface.SendMessage(HostHandle, WIN_MSG.WM_CAPTURE_WORKSTATUS, 1, 0); base.Start(); }
protected virtual void Trigger_TriggerChanged(TRIGGER_STATUS status) { if ((TRIGGER_STATUS)status == TRIGGER_STATUS.ON) { Trigger.Stop(); CaptureImageData(); } Kernel32Interface.SendMessage(HostHandle, WIN_MSG.WM_TRIGGER_CHANGE, (int)status, 0); }
public void Apply() { // offset //-------------------------------------------------------------------------------- if (do_offset_) { for (int i = 0; i < height_; i++) { for (int j = 0; j < width_; j++) { img_[i, j] -= offset_img_[i, j]; } } } ////////////////////////////////////////////////////////////////////////// if ((IntPtr)img_buf_ != IntPtr.Zero) { Marshal.FreeHGlobal((IntPtr)img_buf_); Kernel32Interface.CloseHandle((IntPtr)img_buf_); img_buf_ = (ushort *)IntPtr.Zero; } img_buf_ = ArrayToBuffer(img_); ////////////////////////////////////////////////////////////////////////// // gain if (do_gain_) { PKL_Interface.Acquisition_DoOffsetGainCorrection_Ex(img_buf_, img_buf_, offset_map_, gain_map_, gain_med_map_, width_ * height_, gain_seq_num_); } ////////////////////////////////////////////////////////////////////////// // pixel if (do_pixel_) { PKL_Interface.Acquisition_DoPixelCorrection(img_buf_, pixel_corr_list_); } ////////////////////////////////////////////////////////////////////////// ushort *p_idx = img_buf_; for (int i = 0; i < width_; i++) { for (int j = 0; j < height_; j++) { img_[i, j] = *p_idx; p_idx++; } } Marshal.FreeHGlobal((IntPtr)img_buf_); Kernel32Interface.CloseHandle((IntPtr)img_buf_); img_buf_ = (ushort *)IntPtr.Zero; }
public override void Cancel() { if (WorkStatus) { //强制中断采集 int result = CareRayInterface.CR_stop_acq_frame(); if ((int)KZ_ERROR_TYPE.CR_NO_ERR != result) { Console.WriteLine("CR_stop_acq_frame error, reason: {0}\n", CareRayErrors.CrErrStrList(result)); } } WorkStatus = false; Kernel32Interface.PostMessage(this.HostHandle, WIN_MSG.WM_CAPTURE_WORKSTATUS, 0, 0); Kernel32Interface.PostMessage(HostHandle, WIN_MSG.WM_SHOW_PROGRESS, -2, 0); Trigger.Stop(); }
public override void Start() { if (WorkStatus) { Console.WriteLine("Can not acquire image because of acquiring image now...WorkStatus=" + WorkStatus); return; } WorkStatus = true; Kernel32Interface.PostMessage(HostHandle, WIN_MSG.WM_CAPTURE_WORKSTATUS, 1, 0); //跟踪丢帧的变量 ImageTrackID = 0; //重置统计亮场帧数标记; acqBrightImageNumber = 0; try { while (true) { if (BackgroundWorkerCaptureImageData.IsBusy) { Thread.Sleep(1000); } else { BackgroundWorkerCaptureImageData.WorkerSupportsCancellation = true; BackgroundWorkerCaptureImageData.DoWork -= new DoWorkEventHandler(BackgroundWorkerCaptureImageData_DoWork); BackgroundWorkerCaptureImageData.DoWork += new DoWorkEventHandler(BackgroundWorkerCaptureImageData_DoWork); //BackgroundWorkerCaptureImageData.RunWorkerCompleted -= BackgroundWorkerCaptureImageData_RunWorkerCompleted; //BackgroundWorkerCaptureImageData.RunWorkerCompleted += BackgroundWorkerCaptureImageData_RunWorkerCompleted; identificationStr = Guid.NewGuid().ToString(); BackgroundWorkerCaptureImageData.RunWorkerAsync(identificationStr); return; } } } catch (System.Exception ex) { Console.WriteLine("Start():back thread capturing image error:" + ex.Message); } }
public override void CaptureImageData() { base.CaptureImageData(); OpenFileDialog dlg = new OpenFileDialog(); dlg.Filter = "*.*|*.*"; string lastFilePath = CapturePub.readCaptrueValue(XmlField.OpenFilePath); if (Directory.Exists(lastFilePath)) { dlg.InitialDirectory = lastFilePath; } dlg.Multiselect = true; string[] files = null; if (dlg.ShowDialog() == DialogResult.OK) { files = dlg.FileNames; SeqFrameCount = files.Length; } if (files != null && files.Length > 0) { FileInfo fi = new FileInfo(files[0]); CapturePub.saveCaptrueValue(XmlField.OpenFilePath, fi.DirectoryName); int msgID = GenerateWinMessage("Loading files..."); Kernel32Interface.SendMessage(HostHandle, WIN_MSG.WM_SHOW_PROGRESS, msgID, SeqFrameCount); for (int i = 0; i < SeqFrameCount; i++) { ReadFile(files[i]); Kernel32Interface.SendMessage(HostHandle, WIN_MSG.WM_SHOW_PROGRESS, -1, 1); } Kernel32Interface.SendMessage(HostHandle, WIN_MSG.WM_SHOW_PROGRESS, -2, 0); //Kernel32Interface.SendMessage(HostHandle, WIN_MSG.WM_CAPTURE_DATA, (int)CapturePKI.PanelCaptureMode.Sequence,0); } else { files = null; } Files = files; }
public override void CaptureImageData() { int result; #region Step(1):设置采集的帧数 //acqImageNuber = 3; #endregion//End Step(1) #region Step(2):设置工作电压 try { result = CareRayInterface.CR_set_normal_power(); if ((int)KZ_ERROR_TYPE.CR_NO_ERR != result) { Console.WriteLine("CR_set_normal_power error, reason: {0}\n", CareRayErrors.CrErrStrList(result)); Kernel32Interface.PostMessage(HostHandle, WIN_MSG.WM_CAPTURE_WORKSTATUS, 0, 0); Kernel32Interface.PostMessage(HostHandle, WIN_MSG.WM_SHOW_PROGRESS, -2, 0); WorkStatus = false; return; } else { Console.WriteLine("Set panel working voltage successfully."); } } catch (System.Exception ex) { Console.WriteLine("CR_set_normal_power error, reason: {0}\n", ex.Message); Kernel32Interface.PostMessage(HostHandle, WIN_MSG.WM_CAPTURE_WORKSTATUS, 0, 0); Kernel32Interface.PostMessage(HostHandle, WIN_MSG.WM_SHOW_PROGRESS, -2, 0); WorkStatus = false; return; } #endregion//End Step(2) #region Step(3):刷新Panel的参数设置; Console.WriteLine("Step(3):Refresh panel settings..."); RefreshPanelSettings(); #endregion//End Step(3) #region Step(4):采集之前本底丢弃,刷新探测器的lag //CaptureDarkImage_DiscardDarkImage_BeforeCapture(); #endregion//End Step(4) #region Step(5):动态本底校正; //.... #endregion//End Step(5) #region Step(6):是否内触发采集本底 //... #endregion//End Step(6) //设置状态栏进度信息; int msgID2 = GenerateWinMessage("Preparing irradiation..."); Kernel32Interface.PostMessage(HostHandle, WIN_MSG.WM_SHOW_PROGRESS, msgID2, 0); //调用函数开始采集; result = CareRayInterface.CR_start_acq_full_image(); if ((int)KZ_ERROR_TYPE.CR_NO_ERR != result) { Console.WriteLine("Step(7):CR_start_acq_image_full error, reason: " + CareRayErrors.CrErrStrList(result)); Kernel32Interface.PostMessage(HostHandle, WIN_MSG.WM_CAPTURE_WORKSTATUS, 0, 0); Kernel32Interface.PostMessage(HostHandle, WIN_MSG.WM_SHOW_PROGRESS, -2, 0); WorkStatus = false; return; } else { Console.WriteLine("1800I 0.96 start acquisition successfully."); } }
void drocEventCallback(int eventID, ref CareRayInterface.EventData eventData) { Console.WriteLine("Event ID:" + eventID); switch (eventID) { case (int)CareRayInterface.event_id.EVT_DISCONNECT: case (int)CareRayInterface.event_id.EVT_DETECTOR_ERROR: { int result = CareRayInterface.CR_stop_acq_frame(); if ((int)KZ_ERROR_TYPE.CR_NO_ERR != result) { Console.WriteLine("CR_stop_acq_frame error, reason: {0}\n", CareRayErrors.CrErrStrList(result)); } } break; case (int)CareRayInterface.event_id.EVT_IMAGE_ARRIVE: case (int)CareRayInterface.event_id.EVT_VIDEO_FRAME_INDEX_CHANGED: { //外部中断Cancel();立即退出; if (!WorkStatus) { Kernel32Interface.PostMessage(HostHandle, WIN_MSG.WM_CAPTURE_WORKSTATUS, 0, 0); Kernel32Interface.PostMessage(HostHandle, WIN_MSG.WM_SHOW_PROGRESS, -2, 0); WorkStatus = false; return; } //用于判断采集是否结束 acqImageNuber--; //改变采集到的帧数统计; acqBrightImageNumber++; //输出亮场帧数统计信息; Console.WriteLine("Image Number=" + acqBrightImageNumber); //Windows界面输出采集进度; int msgID = GenerateWinMessage("Capturing image number:" + acqBrightImageNumber); Kernel32Interface.PostMessage(HostHandle, WIN_MSG.WM_SHOW_PROGRESS, msgID, 0); #region Step(1):TCP/IP协议网络从Panel缓冲区取出图像; DateTime tm = DateTime.Now; //log int imageSize = eventData.width * eventData.height * eventData.bits / 8; int imageRows = eventData.height; int imageColumns = eventData.width; ushort *imageData = (ushort *)eventData.data; #region 验证是否丢帧 IntPtr checkPtr = (IntPtr)imageData; int imageID = Marshal.ReadInt32(checkPtr, 0); if (imageID != ImageTrackID) { Console.WriteLine("!!!!!!!!!!!!!!!!!!!!!lost frame ID=" + imageID); } ImageTrackID = imageID; ImageTrackID++; #endregion Console.WriteLine("Step(1):(TCP/IP)Transfer image time=" + (DateTime.Now - tm)); //log #endregion #region Step(2)封装数据到对象ImageObject tm = DateTime.Now; RefreshScale(); ImageObject imageObjectBase = new ImageObject(); ushort[,] imagedata = BufferToArray(imageData, RawFileHeadSize, imageRows, imageColumns); imageObjectBase.pixelSize = this.pixelSize; imageObjectBase.centerX = this.imageCenterX; imageObjectBase.centerY = this.imageCenterY; imageObjectBase.ImageData = imagedata; imageObjectBase.createTime = DateTime.Now; Console.WriteLine("Encapsulate image data to ImageROI time=" + (DateTime.Now - tm)); //log #endregion #region Step(3):将采集到的数据ImageROI对象压入到堆栈中供异步处理 //压入堆栈; imgList.Enqueue(imageObjectBase); //发送消息到采集界面;保存数据库; Kernel32Interface.PostMessage(HostHandle, WIN_MSG.WM_CAPTURE_DATA, (int)captureImageMode, acqBrightImageNumber); #endregion //判断采集是否结束 if (acqImageNuber == 0) { Cancel(); return; } } break; default: Console.WriteLine("Rad image transmission complete default"); break; } }
private void timerGenerateImage_Elapsed(object sender, ElapsedEventArgs e) { seqenceNum++; if (captureImageMode == CapturePKI.PanelCaptureMode.Sequence) { Kernel32Interface.SendMessage(HostHandle, WIN_MSG.WM_SHOW_PROGRESS, -1, 1); Bitmap bm = new Bitmap(imageColumns, imageRows); Graphics g = Graphics.FromImage(bm); g.FillRectangle(new SolidBrush(Color.Black), 0, 0, bm.Width, bm.Height); Font font = new Font(FontFamily.GenericSansSerif, 800, FontStyle.Bold); g.DrawString(seqenceNum.ToString(), font, new SolidBrush(Color.White), new PointF(0, 0)); ImageObject image = new ImageObject(); image.pixelSize = pixelSize; image.imageData = BitmapToUShort(bm); image.imageWidth = image.imageData.GetLength(1); image.imageHeight = image.imageData.GetLength(0); image.centerX = imageCenterX; image.centerY = imageCenterY; image.createTime = DateTime.Now; imgList.Add(image); if (seqenceNum == FrameCount) { Kernel32Interface.SendMessage(HostHandle, WIN_MSG.WM_CAPTURE_DATA, (int)captureImageMode, 0); timerGenerateImage.Stop(); WorkStatus = false; Kernel32Interface.SendMessage(HostHandle, WIN_MSG.WM_SHOW_PROGRESS, -2, 0); Kernel32Interface.SendMessage(HostHandle, WIN_MSG.WM_CAPTURE_WORKSTATUS, 0, 0); } } else if (captureImageMode == CapturePKI.PanelCaptureMode.Continuous) { Bitmap bm = new Bitmap(imageColumns, imageRows); Graphics g = Graphics.FromImage(bm); g.FillRectangle(new SolidBrush(Color.Black), 0, 0, bm.Width, bm.Height); Font font = new Font(FontFamily.GenericSansSerif, 800, FontStyle.Bold); g.DrawString(seqenceNum.ToString(), font, new SolidBrush(Color.White), new PointF(0, 0)); ImageObject image = new ImageObject(); image.pixelSize = pixelSize; image.imageData = BitmapToUShort(bm); image.imageWidth = image.imageData.GetLength(1); image.imageHeight = image.imageData.GetLength(0); image.centerX = imageCenterX; image.centerY = imageCenterY; image.createTime = DateTime.Now; imgList.Add(image); Kernel32Interface.SendMessage(HostHandle, WIN_MSG.WM_CAPTURE_DATA, (int)captureImageMode, 0); } //else if (captureImageMode == CapturePKI.PanelCaptureMode.Average) //{ // //PKL_Interface.Acquisition_DefineDestBuffers(hAcqDesc, pAcqBufferAverage, (uint)FrameCount, imageRows, imageColumns); // //PKL_Interface.Acquisition_Acquire_Image(hAcqDesc, (uint)FrameCount, 0, (uint)SeqBufferMode.HIS_SEQ_AVERAGE, pOffsetBuffer, null, null); // //Kernel32Interface.SendMessage(HostHandle, WIN_MSG.WM_SHOW_PROGRESS, msgID, FrameCount); //} else if (captureImageMode == CapturePKI.PanelCaptureMode.DoubleExposure) { //beamON_Num++; //PKL_Interface.Acquisition_DefineDestBuffers(hAcqDesc, pAcqBuffer, (uint)FrameCount, imageRows, imageColumns); //PKL_Interface.Acquisition_Acquire_Image(hAcqDesc, (uint)FrameCount, 0, (uint)SeqBufferMode.HIS_SEQ_ONE_BUFFER, null, null, null); //Kernel32Interface.SendMessage(HostHandle, WIN_MSG.WM_SHOW_PROGRESS, msgID, 0); } }
public virtual void Cancel() { Trigger.Stop(); Kernel32Interface.SendMessage(HostHandle, WIN_MSG.WM_SHOW_PROGRESS, -2, 0); }
protected void Trigger_TriggerStatus(TRIGGER_STATUS status) { Kernel32Interface.SendMessage(HostHandle, WIN_MSG.WM_TRIGGER_STATUS, (int)status, 0); }
protected void Trigger_ProgressBegin(string info, int progressValue) { int msgID = GenerateWinMessage(info); Kernel32Interface.SendMessage(HostHandle, WIN_MSG.WM_SHOW_PROGRESS, msgID, progressValue); }