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;
            }
        }
Example #3
0
 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();
     }
 }
Example #4
0
 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();
 }
Example #5
0
        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();
        }
Example #6
0
 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;
        }
Example #8
0
        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();
        }
Example #9
0
        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;
        }
Example #11
0
        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.");
            }
        }
Example #12
0
        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;
            }
        }
Example #13
0
        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);
            }
        }
Example #14
0
 public virtual void Cancel()
 {
     Trigger.Stop();
     Kernel32Interface.SendMessage(HostHandle, WIN_MSG.WM_SHOW_PROGRESS, -2, 0);
 }
Example #15
0
 protected void Trigger_TriggerStatus(TRIGGER_STATUS status)
 {
     Kernel32Interface.SendMessage(HostHandle, WIN_MSG.WM_TRIGGER_STATUS, (int)status, 0);
 }
Example #16
0
        protected void Trigger_ProgressBegin(string info, int progressValue)
        {
            int msgID = GenerateWinMessage(info);

            Kernel32Interface.SendMessage(HostHandle, WIN_MSG.WM_SHOW_PROGRESS, msgID, progressValue);
        }