close

image   image    image image image image   image     image

   1: public interface IRotate
   2: {
   3:     void Rotate();
   4:     void PyrmidDown();
   5:     void PyrmidUp();
   6: }

ImgData類別

1. Line 4: 旋轉角度

2. Line 5: 創建img(影像資料)

3. Line 6~10: ImgData創建子,輸入影像路徑,並且讀入imread()

4. Line 11~14: 回傳影像資料(img)

5. Line 16~21: Clone()函式中

     5.1 新增ImgData實體obj

     5.2 利用OpenCV函式(CopyTo)進行影像複製

     5.3 回傳該ImgData實體

   1: public class ImgData : ICloneable
   2:    {
   3:        Mat img = null;
   4:        public int Angle { get; set; }
   5:        public ImgData() { img = new Mat(); }
   6:        public ImgData(string filePath)
   7:        {
   8:            img = new Mat();
   9:            img = CvInvoke.Imread(filePath, ImreadModes.Unchanged);
  10:        }
  11:        public Mat Data
  12:        {
  13:            get { return img; }
  14:        }
  15:  
  16:        public object Clone()
  17:        {
  18:            ImgData obj = new ImgData();
  19:            this.Data.CopyTo(obj.Data);
  20:            return obj;
  21:        }
  22:    }

ImgTemp類別

image

1. Line 4~7: ImgTemp創建子

2. Line 8~11:深複製會呼叫他複製影像資料至 this.imgData  

3. Line 13: Data公開屬性: 回傳影像資料

4. Line 14: Angle公開屬性: 旋轉角度

5. Line 15~22:公開方法: 旋轉

6. Line 23~ 26: 公開方法: PyrmidDown 縮小一半

7. Line 27~ 30: 公開方法: PyrmidUp 放大一半

8: Line 32~37: 深複製,新增ImgTemp實體(以舊有imgData初始化),並複製角度

   1: public class ImgTemp : IRotate, ICloneable
   2:     {
   3:         private ImgData imgData;
   4:         public ImgTemp(string filePath)
   5:         {
   6:             imgData = new ImgData(filePath);
   7:         }
   8:         public ImgTemp(ImgData imgData)
   9:         {
  10:             this.imgData = (ImgData)imgData.Clone();
  11:         }
  12:  
  13:         public Mat Data { get { return imgData.Data; } }
  14:         public int Angle { get { return imgData.Angle; } set { imgData.Angle = value; } }
  15:         public void Rotate()
  16:         {
  17:             PointF srcCenter = new PointF(imgData.Data.Cols / 2, imgData.Data.Rows / 2);
  18:             Mat transMat = new Mat();
  19:             double scale = 1.0;
  20:             CvInvoke.GetRotationMatrix2D(srcCenter, imgData.Angle, scale, transMat);
  21:             CvInvoke.WarpAffine(imgData.Data, imgData.Data, transMat, imgData.Data.Size);
  22:         }
  23:         public void PyrmidDown()
  24:         {
  25:             CvInvoke.PyrDown(imgData.Data, imgData.Data, BorderType.Default);
  26:         }
  27:         public void PyrmidUp()
  28:         {
  29:             CvInvoke.PyrUp(imgData.Data, imgData.Data, BorderType.Default);
  30:         }
  31:  
  32:         public object Clone()
  33:         {
  34:             ImgTemp obj = new ImgTemp(this.imgData);
  35:             obj.Angle = this.Angle;
  36:             return obj;
  37:         }
  38:  
  39:     }

客戶端

   1: public Form1()
   2:        {
   3:            InitializeComponent();
   4:        }
   5:  
   6:        ImgTemp imgTemp;
   7:        const int COPYNUMBER = 20;
   8:        ImgTemp[] imgArray = new ImgTemp[COPYNUMBER];
   9:        private void button1_Click(object sender, EventArgs e)
  10:        {
  11:            using (OpenFileDialog ofd = new OpenFileDialog())
  12:            {
  13:                if(ofd.ShowDialog()== DialogResult.OK)
  14:                {
  15:                    imgTemp = new ImgTemp(ofd.FileName);
  16:                    //
  17:                    //imgTemp.PyrmidDown();
  18:                    if(comboBox2.SelectedIndex>0)
  19:                    {
  20:                        for(int i=0;i< comboBox2.SelectedIndex; i++)
  21:                        imgTemp.PyrmidDown();
  22:                    }
  23:                    imageBox1.Image = imgTemp.Data;
  24:                }
  25:            }
  26:  
  27:        }
  28:  
  29:        private void button2_Click(object sender, EventArgs e)
  30:        {
  31:  
  32:            Stopwatch s = new Stopwatch();
  33:            s.Start();
  34:            int angleStep = 180 / COPYNUMBER;
  35:            //imgTemp.PyrmidDown();
  36:            Parallel.For(0, COPYNUMBER, delegate (int i)
  37:            {
  38:                imgArray[i] = (ImgTemp)imgTemp.Clone();
  39:                if (i > 0)
  40:                {
  41:                    imgArray[i].Angle = (i + 1) * angleStep;
  42:                    
  43:                    imgArray[i].Rotate();
  44:                    //imgArray[i].PyrmidDown();
  45:                }
  46:            });
  47:  
  48:            
  49:            //for(int i=0; i<imgCpyArray.Length; i++)
  50:            //{
  51:            //    imgCpyArray[i] = (ImgSrc)imgSrc.Clone();
  52:            //    if (i > 0)
  53:            //    {
  54:            //        imgCpyArray[i].Angle = (i + 1) * angleStep;
  55:            //        imgCpyArray[i].imgRotate();
  56:            //    }
  57:            //}
  58:            s.Stop();
  59:            this.Text = s.Elapsed.TotalMilliseconds.ToString();
  60:        }
  61:  
  62:        private void Form1_Load(object sender, EventArgs e)
  63:        {
  64:            comboBox2.SelectedIndex = 0;
  65:            for (int i = 0; i < COPYNUMBER; i++)
  66:                comboBox1.Items.Add(i.ToString());
  67:   
  68:        }
  69:  
  70:        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
  71:        {
  72:            int index = comboBox1.SelectedIndex;
  73:            if (index >= 0)
  74:            {
  75:                if (imgArray[index] == null) return;
  76:                if (!imgArray[index].Data.IsEmpty)
  77:                {
  78:                    imageBox1.Image = imgArray[index].Data;
  79:                    int angleStep = 180 / COPYNUMBER;
  80:                    int angle = (comboBox1.SelectedIndex ) * angleStep;
  81:                    label3.Text = string.Format("旋轉角度: {0}", angle);
  82:                }
  83:                else
  84:                {
  85:                    imageBox1.Image = imgTemp.Data; 
  86:                }
  87:            }
  88:        }
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 me1237guy 的頭像
    me1237guy

    天天向上

    me1237guy 發表在 痞客邦 留言(0) 人氣()