Ejemplo n.º 1
0
        //啟動動畫timer
        private void Animation_timer_Tick(object sender, EventArgs e)
        {
            //定義距離每格數的(X,Y)
            int new_x = pictureBoxCenter.Location.X - vx;
            int new_y = pictureBoxCenter.Location.Y - vy;

            pictureBoxCenter.Location = new Point(new_x, new_y);

            //定義每次移動一格,box大小的變化量
            int new_w = pictureBoxCenter.Width - v_size;
            int new_h = pictureBoxCenter.Height - v_size;

            pictureBoxCenter.Size = new Size(new_w, new_h);

            ani_count++;//每移動一格,計數器+1(移動一格timer執行一次)

            //設定影像紅框閃爍,以2的餘數做判斷
            if ((ani_count % 2) == 1)
            {
                Redbox.Visible = true;
            }
            else
            {
                Redbox.Visible = false;
            }

            //若做完動畫後,pictureBoxCenter回復原來大小與位置,等待下一次執行
            if (ani_count > (fps - 1))
            {
                ani_count = 0;

                pictureBoxCenter.Size     = new Size(b_size * scale, b_size * scale);                //計算pictureBoxCenter大小
                pictureBoxCenter.Location = new Point(rx - (b_size * scale), ry - (b_size * scale)); //計算pictureBoxCenter位置
                pictureBoxCenter.Visible  = false;

                Animation_timer.Stop(); //動畫結束

                Camera_timer.Start();   //重新啟動偵測人臉
            }
        }
Ejemplo n.º 2
0
        private void Form1_Load(object sender, EventArgs e)
        {
            //Logo位置處理
            Logo              = Image.FromFile(logo);
            logo_pic.Image    = Logo;
            logo_pic.SizeMode = PictureBoxSizeMode.AutoSize;
            logo_pic.Location = new Point(b_size, (ry - logo_pic.Size.Height) - b_size);

            /* //開始圖片位置處理
             * startPicture = Image.FromFile(startpic);
             * start_pic.Image = startPicture;
             * start_pic.SizeMode = PictureBoxSizeMode.Zoom;
             * start_pic.Location = new Point(b_size + (logo_pic.Size.Width + b_size ), (ry - start_pic.Size.Height) - b_size);
             * startPicture.RotateFlip(RotateFlipType.Rotate270FlipNone); //旋轉圖片*/


            //初始圖片置入處理
            for (int p = 0; p < baseImage.Length; p++)
            {
                photo = Image.FromFile(@"baseImage\" + baseImage[p]); //依照路徑取出原始圖檔
                photo.RotateFlip(RotateFlipType.Rotate270FlipNone);   //旋轉圖片
                photos[p] = photo;                                    //圖片存放陣列
            }

            //倒數圖片置入處理
            for (int q = 0; q < count_time.Length; q++)
            {
                timePhoto = Image.FromFile(@"countImage\" + count_time[q]); //依照路徑取出原始圖檔
                //timePhoto.RotateFlip(RotateFlipType.Rotate270FlipNone); //旋轉圖片
                timePhotos[q] = timePhoto;                                  //圖片存放陣列
            }
            Countbox.Location = new Point(b_size + (logo_pic.Size.Width + b_size * 3), (ry - Countbox.Size.Height) - b_size);
            Countbox.SizeMode = PictureBoxSizeMode.Zoom;

            //計算分割格數
            cnt_x = rx / b_size; //計算X 軸格數
            cnt_y = ry / b_size; //計算Y 軸格數

            //左下圖片設定
            pictureBoxCenter.Visible  = false;                                                   //隱藏pictureBoxCenter
            pictureBoxCenter.Size     = new Size(b_size * scale, b_size * scale);                //計算pictureBoxCenter大小
            pictureBoxCenter.Location = new Point(rx - (b_size * scale), ry - (b_size * scale)); //計算pictureBoxCenter位置

            v_size = (b_size * scale) / (fps + fps / 12);                                        //動畫的size變化量

            camera = new Capture(0);                                                             //取得camera值
            faceNo = 0;                                                                          //定義人臉索引值

            Picture_timer.Stop();                                                                //Picture_timer停止
            Animation_timer.Stop();


            //迴圈新增格數排列
            int sy = ry, sx = 0; //(x,y) = (sx,sy)
            int drt = -1;        //初始判斷換行參數

            for (int i = 0; i < cnt_x; i++)
            {
                for (int j = 0; j < cnt_y; j++)
                {
                    //定義新增格子
                    PictureBox px = new PictureBox(); //重複新增PictureBox
                    px.Width  = b_size;               //設定PictureBox長寬(正方形)
                    px.Height = b_size;

                    //Y 軸由左至右依序遞減新增PictureBox
                    if (drt < 0)
                    {
                        sy = sy + drt * b_size;
                    }

                    px.Location = new Point(sx, sy);//設定新增格數的Location
                    px.Visible  = true;
                    Controls.Add(px);

                    int mIndex = rnd.Next(baseImage.Length); //設定亂數索引值
                    photo    = photos[mIndex];
                    px.Image = photo;                        //初始圖片放入px

                    //尋找哪一個為台灣內的格子
                    //運算台灣底圖的解析度
                    int pb_x = px.Location.X;
                    int pb_y = px.Location.Y;
                    pb_x = pb_x / b_size;
                    pb_y = (pb_y + b_size) / b_size;
                    //taiwan.RotateFlip(RotateFlipType.Rotate270FlipNone);
                    Color tw_color = taiwan.GetPixel(pb_x, pb_y - 1);

                    Color sc = tw_color;

                    //半透明處理
                    matrix = new ColorMatrix(nArray);
                    attributes.SetColorMatrix(matrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
                    Image    srcImage    = photo;
                    Bitmap   resultImage = new Bitmap(srcImage.Width, srcImage.Height);
                    Graphics g           = Graphics.FromImage(resultImage);
                    g.DrawImage(srcImage, new Rectangle(0, 0, srcImage.Width, srcImage.Height), 0, 0, srcImage.Width, srcImage.Height, GraphicsUnit.Pixel, attributes);

                    int rgb_r = sc.R;
                    int rgb_g = sc.G;
                    int rgb_b = sc.B;

                    //判斷底圖為白色就是台灣內的格子,是否顯示為半透明
                    if (rgb_r == 255 && rgb_g == 255 && rgb_b == 255)
                    {
                        px.Image = photo;
                    }
                    else
                    {
                        px.Image = resultImage;
                    }

                    //Y 軸由右至左依序遞減新增PictureBox
                    if (drt > 0)
                    {
                        sy = sy + drt * b_size;
                    }

                    px.SizeMode = PictureBoxSizeMode.Zoom;
                    pic[faceNo] = px;//將faceNO放入picturebox陣列
                    faceNo++;
                }

                //跳行
                sx  = sx + b_size;
                drt = -1 * drt;
            }

            faceNo = 0;//初始定義為0
            string date_path = @"C:\Emgu\emgucv-windows-universal-cuda 2.9.0.1922\opencv\data\haarcascades\haarcascade_frontalface_default.xml";

            haar = new HaarCascade(date_path);//抓取人臉xml路徑
        }