public Form1()
 {
     InitializeComponent();
     #region 初始化委托
     onStitchCallBack = new StitchCallBack(doStitchCallBack);
     #endregion
     comboxgetrules();
     Camera = cameraDevice;
     tbSavePath.ForeColor = ColorTranslator.FromHtml("#999999");
     Camera.CameraName    = Settings.Default.cameraname;
     //获取状态初始化
     backgroundWorker = new BackgroundWorker
     {
         WorkerReportsProgress      = true,
         WorkerSupportsCancellation = true
     };
     backgroundWorker.DoWork += new DoWorkEventHandler(getstauts);
     Loghelper.WriteLog("初始化获取箱体按钮状态成功");
     //存照片线程初始化
     newbackgroundWorker = new BackgroundWorker
     {
         WorkerReportsProgress      = true,
         WorkerSupportsCancellation = true
     };
     newbackgroundWorker.DoWork += new DoWorkEventHandler(picevent);
     Loghelper.WriteLog("初始化保存图片线程成功");
     Camera.ScreenEvent += ScreenEvent;
     //button10.Enabled = false;
     button5.Enabled  = false;
     button11.Enabled = false;
     this.pictureBox1.Load(@"qtsj.jpg");
     sdkin();
 }
Example #2
0
        /// <summary>
        /// 拼图主函数
        /// </summary>
        /// <param name="oneSidePcb"></param>
        public static void StitchMain(OneStitchSidePcb oneSidePcb, StitchCallBack stitchCallBack)
        {
            bool       needSave = false;
            double     or_hl    = oneSidePcb.or_hl;
            double     or_hu    = oneSidePcb.or_hu;
            double     or_vl    = oneSidePcb.or_vl;
            double     or_vu    = oneSidePcb.or_vu;
            double     dr_hu    = oneSidePcb.dr_hu;
            double     dr_vu    = oneSidePcb.dr_vu;
            BitmapInfo bitmapInfo;

            lock (oneSidePcb.bitmaps)
            {
                bitmapInfo = oneSidePcb.bitmaps.Dequeue();
                Emgu.CV.Image <Bgr, Byte> currentFrame = new Emgu.CV.Image <Bgr, Byte>(bitmapInfo.bitmap);
                Mat imgOld = new Mat();
                CvInvoke.BitwiseAnd(currentFrame, currentFrame, imgOld);
                int edge = 3;
                Mat img  = new Mat(imgOld, new Rectangle(new Point(edge, edge), new Size(imgOld.Width - edge * 2, imgOld.Height - edge * 2)));

                //Mat smallmat = new Mat();
                //CvInvoke.Resize(img, img, new Size(Convert.ToInt32(img.Cols * 0.5), Convert.ToInt32(img.Rows * 0.5)));
                //AoiAi.hello(smallmat.Ptr);

                //第一行
                if (oneSidePcb.currentRow == 0)
                {
                    if (oneSidePcb.currentCol == 0)
                    {
                        #region 判断s型还是z字形
                        if (oneSidePcb.zTrajectory) //Z形
                        {
                            oneSidePcb.trajectorySide = (int)side.left;
                            int x       = Convert.ToInt32(img.Cols * (oneSidePcb.allCols - 1) * dr_hu);
                            int y       = Convert.ToInt32(img.Rows * (oneSidePcb.allRows - 1) * dr_vu);
                            int dstRows = Convert.ToInt32(img.Rows * (oneSidePcb.allRows + (oneSidePcb.allRows - 1) * (dr_vu * 2 - or_vl)));
                            int dstCols = Convert.ToInt32(img.Cols * (oneSidePcb.allCols + (oneSidePcb.allCols - 1) * (dr_hu * 2 - or_hl)));
                            oneSidePcb.roi = new Rectangle(x, y, img.Cols, img.Rows);
                            oneSidePcb.dst = new Mat(dstRows, dstCols, img.Depth, img.NumberOfChannels); // 第一张图不要0,0 最好留一些像素
                        }
                        else // S型
                        {
                            oneSidePcb.trajectorySide = (int)side.right;

                            int dstRows = Convert.ToInt32(img.Rows * (oneSidePcb.allRows + (oneSidePcb.allRows - 1) * (dr_vu * 2 - or_vl)));
                            int dstCols = Convert.ToInt32(img.Cols * (oneSidePcb.allCols + (oneSidePcb.allCols - 1) * (dr_hu * 2 - or_hl)));
                            int x       = Convert.ToInt32((dstCols - img.Cols) * (1 - dr_hu));
                            int y       = Convert.ToInt32(img.Rows * (oneSidePcb.allRows - 1) * dr_vu);
                            oneSidePcb.roi = new Rectangle(x, y, img.Cols, img.Rows);
                            oneSidePcb.dst = new Mat(dstRows, dstCols, img.Depth, img.NumberOfChannels); // 第一张图不要0,0 最好留一些像素
                        }
                        #endregion
                    }
                    else
                    {
                        stitchv2(oneSidePcb.dst.Ptr, oneSidePcb.roi, img.Ptr, ref oneSidePcb.roi, oneSidePcb.trajectorySide, Convert.ToInt32(img.Cols * or_hl), Convert.ToInt32(img.Cols * or_hu), Convert.ToInt32(img.Rows * dr_vu));
                    }
                    //oneSidePcb.dst.Save(@"C:\Users\Administrator\Desktop\suomi-test-img\" + oneSidePcb.currentRow + "-" + oneSidePcb.currentCol + ".jpg");
                    copy_to(oneSidePcb.dst.Ptr, img.Ptr, oneSidePcb.roi);

                    //oneSidePcb.dst.Save(@"C:\Users\Administrator\Desktop\suomi-test-img\" + oneSidePcb.currentRow + "-" + oneSidePcb.currentCol + ".jpg");

                    oneSidePcb.currentCol++;
                    if (oneSidePcb.currentCol >= oneSidePcb.allCols)
                    {
                        oneSidePcb.currentCol = 0;
                        oneSidePcb.currentRow++;
                        if (oneSidePcb.trajectorySide == (int)side.left)
                        {
                            oneSidePcb.trajectorySide = (int)side.right;
                        }
                        else if (oneSidePcb.trajectorySide == (int)side.right)
                        {
                            oneSidePcb.trajectorySide = (int)side.left;
                        }
                    }
                    //oneSidePcb.dst.Save(@"C:\Users\Administrator\Desktop\suomi-test-img\row1.jpg");
                }
                else // 其他行
                {
                    if (Convert.ToBoolean(oneSidePcb.currentRow % 2)) //偶行
                    {
                        if (oneSidePcb.currentCol == 0)
                        {
                            stitchv2(oneSidePcb.dst.Ptr, oneSidePcb.roi, img.Ptr, ref oneSidePcb.roi, (int)side.up, Convert.ToInt32(img.Cols * or_vl), Convert.ToInt32(img.Cols * or_vu), Convert.ToInt32(img.Rows * dr_hu));
                            //oneSidePcb.roi = oneSidePcb.roi0;
                        }
                        else
                        {
                            stitchv2(oneSidePcb.dst.Ptr, oneSidePcb.roi, img.Ptr, ref oneSidePcb.roi, oneSidePcb.trajectorySide, Convert.ToInt32(img.Cols * or_hl), Convert.ToInt32(img.Cols * or_hu), Convert.ToInt32(img.Rows * dr_vu), (int)side.up, Convert.ToInt32(img.Rows * or_vl), Convert.ToInt32(img.Rows * or_vu), Convert.ToInt32(img.Cols * dr_hu));
                        }
                    }
                    else
                    {
                        if (oneSidePcb.currentCol == 0)
                        {
                            stitchv2(oneSidePcb.dst.Ptr, oneSidePcb.roi, img.Ptr, ref oneSidePcb.roi, (int)side.up, Convert.ToInt32(img.Cols * or_vl), Convert.ToInt32(img.Cols * or_vu), Convert.ToInt32(img.Rows * dr_hu));
                            //oneSidePcb.roi = oneSidePcb.roi0;
                        }
                        else
                        {
                            stitchv2(oneSidePcb.dst.Ptr, oneSidePcb.roi, img.Ptr, ref oneSidePcb.roi, oneSidePcb.trajectorySide, Convert.ToInt32(img.Cols * or_hl), Convert.ToInt32(img.Cols * or_hu), Convert.ToInt32(img.Rows * dr_vu), (int)side.up, Convert.ToInt32(img.Rows * or_vl), Convert.ToInt32(img.Rows * or_vu), Convert.ToInt32(img.Cols * dr_hu));
                        }
                    }
                    //oneSidePcb.dst.Save(@"C:\Users\Administrator\Desktop\suomi-test-img\" + oneSidePcb.currentRow + "-" + oneSidePcb.currentCol + ".jpg");
                    copy_to(oneSidePcb.dst.Ptr, img.Ptr, oneSidePcb.roi);
                    //oneSidePcb.dst.Save(@"C:\Users\Administrator\Desktop\suomi-test-img\" + oneSidePcb.currentRow + "-" + oneSidePcb.currentCol + ".jpg");
                    oneSidePcb.currentCol++;
                    if (oneSidePcb.currentRow >= oneSidePcb.allRows - 1 && oneSidePcb.currentCol >= oneSidePcb.allCols)
                    {
                        needSave = true;
                    }
                    else if (oneSidePcb.currentCol >= oneSidePcb.allCols)
                    {
                        oneSidePcb.currentCol = 0;
                        oneSidePcb.currentRow++;
                        if (oneSidePcb.trajectorySide == (int)side.left)
                        {
                            oneSidePcb.trajectorySide = (int)side.right;
                        }
                        else if (oneSidePcb.trajectorySide == (int)side.right)
                        {
                            oneSidePcb.trajectorySide = (int)side.left;
                        }
                    }
                }
                #region 实时更新采集框

                stitchCallBack(false, oneSidePcb, bitmapInfo, new RectangleF((float)(oneSidePcb.roi.Location.X * 0.25),
                                                                             (float)(oneSidePcb.roi.Location.Y * 0.25),
                                                                             (float)(oneSidePcb.roi.Size.Width * 0.25),
                                                                             (float)(oneSidePcb.roi.Size.Height * 0.25)));
                #endregion

                #region 释放资源
                img.Dispose();
                currentFrame.Dispose();
                //bitmap.Dispose();
                #endregion

                if (needSave) // 加这里主要是为了优化workingForm.imgBoxWorking最后一个框的显示问题
                {
                    stitchCallBack(true, oneSidePcb, bitmapInfo, new RectangleF());
                    Mat smallmat = new Mat();
                    CvInvoke.Resize(oneSidePcb.dst, smallmat, new Size(Convert.ToInt32(oneSidePcb.dst.Cols * oneSidePcb.scale), Convert.ToInt32(oneSidePcb.dst.Rows * oneSidePcb.scale)));
                    if (oneSidePcb.zTrajectory)
                    {
                        string saveFile = Path.Combine(oneSidePcb.savePath, "front.jpg");
                        smallmat.Save(saveFile);
                        saveFile = Path.Combine(oneSidePcb.savePath, "back.jpg");
                        smallmat.Save(saveFile);
                    }
                    else
                    {
                        string saveFile = Path.Combine(oneSidePcb.savePath, "back.jpg");
                        smallmat.Save(saveFile);
                    }
                    smallmat.Dispose();
                    oneSidePcb.dst.Dispose();
                }
            }
        }