close
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類別
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: }全站熱搜









留言列表
