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() { 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; } }