2017年10月15日日曜日

timerを使って画像を回転させてみる

続いて、timer1を張り付けて、defaultの100msec毎に回転角を変えて、アニメーションさせてみます。
カクカクしながらもアニメーションしてくれます(100msecなのでこんなもんでしょうか)

 using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using OpenCvSharp;
using OpenCvSharp.CPlusPlus;
using OpenCvSharp.Extensions;


namespace _06_affineRot
{
    public partial class Form1 : Form
    {
        private double angle = 0.0;
        private Mat procImage = new Mat();      // 縮小した表示用の画像(回転前)

        public Form1()
        {
            InitializeComponent();
        }

        private void button_disp_Click(object sender, EventArgs e)
        {
            Mat matImage = new Mat(@"C:\Users\hoge\hogehoge.jpg");
            procImage = new Mat();

            // とりあえずリサイズしてみた (picuterBosのサイズにあわせています)
            Cv2.Resize(matImage, procImage, new CvSize(320,240));

            // 表示用bitmap変換
            Image dispImage = BitmapConverter.ToBitmap(procImage);
            pictureBox1.Image = dispImage;

            timer1.Start();
        }


        private void timer1_Tick(object sender, EventArgs e)
        {
            angle = (angle + 1.0) % 360.0;
            Mat angledImage = AffineRotate(procImage, angle);

            Image dispImage = BitmapConverter.ToBitmap(angledImage);
            pictureBox1.Image = dispImage;
        }

        // affin変換で回転させてみる
        private Mat AffineRotate(Mat srcImage, double angle)
        {
            Mat retImage = new Mat();
            double scale = 1.0;

            Point2f center = new Point2f(srcImage.Width / 2, srcImage.Height / 2);
            Mat affineMatrix = Cv2.GetRotationMatrix2D(center, angle, scale);
            Cv2.WarpAffine(srcImage, retImage, affineMatrix, srcImage.Size());

            return retImage;
        }
    }
}

0 件のコメント:

コメントを投稿