C#/VB.NETで画像処理⑥<画像を回転する>
こんにちは、SKです。
C#/VB.NETで画像処理シリーズの第6弾。
カメラの画像を回転します。
OpenCVSharpとは?
カメラ画像表示アプリケーション
(前回)画像の一部を拡大する
動画手順
①回転ボタンを配置する
前回同様、フォーム上にボタンを配置します。
このボタンを押すと、カメラ画像を30度ずつ回転させるようにします。
表示テキストは"Rotate"に。
回転角度のint型変数angleを追加します。
ボタンクリック時に、angleを30ずつ増加させるようにします。
②画像を回転する
画像を回転するには、OpenCVのGetRotationMatrix2D関数で回転行列を求め、WarpAffine関数で回転することができます。
GetRotationMatrix2D関数
http://opencv.jp/opencv-2svn/cpp/geometric_image_transformations.html#cv-getrotationmatrix2d
・第1引数:回転中心座標
・第2引数:回転角度(反時計回り)
・第3引数:スケール
WarpAffine関数
http://opencv.jp/opencv-2.1/cpp/geometric_image_transformations.html#cv-warpaffine
・第1引数:入力画像
・第2引数:出力画像
・第3引数:回転行列
・第4引数:出力画像サイズ
private void Process(Mat img) { using (Mat trans = Cv2.GetRotationMatrix2D(new Point2f(img.Width / 2, img.Height / 2), angle, 1)) { Cv2.WarpAffine(img, img, trans, img.Size()); } }
実行します。
起動時
Rotate押下時
Rotateを押す度に、画像が反時計回りに30度ずつ回転します。
最後に、コード全文を載せておきます。
C#
using System; using System.Threading.Tasks; using System.Windows.Forms; using OpenCvSharp; using OpenCvSharp.Extensions; namespace WindowsFormsApp1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { Task.Run(() => { using (VideoCapture v = new VideoCapture(0)) using (Mat img = new Mat()) { while (true) { v.Read(img); Process(img); pictureBox1.Image = BitmapConverter.ToBitmap(img); } } }); } private int angle = 0; private void Process(Mat img) { using (Mat trans = Cv2.GetRotationMatrix2D(new Point2f(img.Width / 2, img.Height / 2), angle, 1)) { Cv2.WarpAffine(img, img, trans, img.Size()); } } private void button1_Click(object sender, EventArgs e) { angle += 30; } } }
Imports OpenCvSharp Imports OpenCvSharp.Extensions Public Class Form1 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Task.Run(Sub() Using v As New VideoCapture(0) Using img As New Mat Do v.Read(img) Process(img) PictureBox1.Image = img.ToBitmap Loop End Using End Using End Sub) End Sub Private angle As Integer = 0 Private Sub Process(ByVal img As Mat) Using trans As Mat = Cv2.GetRotationMatrix2D(New Point2f(img.Width / 2, img.Height / 2), angle, 1) Cv2.WarpAffine(img, img, trans, img.Size) End Using End Sub Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click angle += 30 End Sub End Class