画像を垂直・水平に反転する

画像を垂直・水平に反転するのは、CvCppクラスのメソッドではなく CvクラスのFlipメソッドを使います。したがって扱う画像データも Matデータではなく Iplimage または CvMatデータになります。
テストは ボタンを4個準備し それぞれ元の画像・X軸で反転・Y軸で反転・XY軸で反転した画像を表示させました。ちょっとややっこしいのですが 『X軸で反転』は『上下反転』 『Y軸で反転』とは『左右反転』を意味します。なお画像データの反転で扱う画像は、CvMatクラスで行っています。画像データの読み込みは直接 CvMatクラスにも読み込めますが Matクラスとの変換を試すために Matに取り込み Mat→CvMatの変換を行っています。 

 コーディング 
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using OpenCvSharp;
using OpenCvSharp.CPlusPlus;
namespace OpenCvShp
{
  public partial class Form1 : Form
  {
    private CvMat src_img;
    private CvMat dst_img;
    public Form1() {
      InitializeComponent();
    }
    private void timer1_Tick(object sender, EventArgs e) {
      Mat src = new Mat(@”C:OpenCvTestDataai2.jpg”, LoadMode.Color);
      src_img = (CvMat)src;         //Mat to CvMat
      dst_img = src_img.Clone();
      timer1.Enabled = false;
      pictureBox1.Invalidate();
      this.Text = “元画像”;
    }
    private void btnOrigin_Click(object sender, EventArgs e) {
      dst_img = src_img.Clone();
      pictureBox1.Invalidate();
      this.Text = “元画像”;
   }
    private void btnX_Click(object sender, EventArgs e) {
      Cv.Flip(src_img, dst_img, FlipMode.X);
      pictureBox1.Invalidate();
      this.Text = “X軸反転”;
    }
    private void btnY_Click(object sender, EventArgs e) {
      Cv.Flip(src_img, dst_img, FlipMode.Y);
      pictureBox1.Invalidate();
      this.Text = “Y軸反転”;
    }
    private void btnXY_Click(object sender, EventArgs e) {
      Cv.Flip(src_img, dst_img, FlipMode.XY);
      pictureBox1.Invalidate();
      this.Text = “XY軸反転”;
    }
    private void pictureBox1_Paint(object sender, PaintEventArgs e) {
      if (!timer1.Enabled) { //画像データ読み込み済み判断にtimerのEnableを使っている
        Mat dst = new Mat(dst_img);    // CvMat to Mat
        Bitmap bmp = new Bitmap(dst.Cols, dst.Rows);
        bmp = dst.ToBitmap();
        e.Graphics.DrawImage(bmp, 0, 0, bmp.Width, bmp.Height);
        bmp.Dispose();
      }
    }
  }
}

OpenCvSharp.CPlusPlusを使わないで OpenCvSharpだけ使ったサンプルは

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

using OpenCvSharp;

namespace OpenCvShp
{
    public partial class Form1 : Form
    {
        private IplImage src_img;
        private IplImage dst_img;
        public Form1()
        {
            InitializeComponent();
        }
        private void timer1_Tick(object sender, EventArgs e)
        {
            src_img = new IplImage(@"C:OpenCvTestDataai2.jpg", LoadMode.Color);
            dst_img = src_img.Clone();
            timer1.Enabled = false;
            pictureBox1.Invalidate();
            this.Text = “元画像”;
        }
        private void btnOrigin_Click(object sender, EventArgs e)
        {
            dst_img = src_img.Clone();
            pictureBox1.Invalidate();
            this.Text = “元画像”;
        }

        private void btnX_Click(object sender, EventArgs e)
        {
            Cv.Flip(src_img, dst_img, FlipMode.X);
            pictureBox1.Invalidate();
            this.Text = “X軸反転”;
        }
        private void btnY_Click(object sender, EventArgs e)
        {
            Cv.Flip(src_img, dst_img, FlipMode.Y);
            pictureBox1.Invalidate();
            this.Text = “y軸反転”;
        }
        private void btnXY_Click(object sender, EventArgs e)
        {
            Cv.Flip(src_img, dst_img, FlipMode.XY);
            pictureBox1.Invalidate();
            this.Text = “xy軸反転”;
        }

         private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            if (!timer1.Enabled) //画像データ読み込み済み判断にtimerのEnableを使っている
            {
                Bitmap bmp = new Bitmap(dst_img.Width, dst_img.Height);
                bmp = dst_img.ToBitmap();
                e.Graphics.DrawImage(bmp, 0, 0, bmp.Width, bmp.Height);
                bmp.Dispose();
            }
        }
    }
}
 処理結果 
元の画像 X軸で反転した画像
Y軸で反転した画像 XY軸双方で反転した画像

 Windows7 Vs2008 OpenCv2.4 And OpenCvSharp
スポンサーリンク
Rectangle大広告
Rectangle大広告

シェアする

  • このエントリーをはてなブックマークに追加

フォローする