画像を垂直・水平に反転するのは、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 |