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