C#/VB.NETで画像処理⑤<画像の一部を拡大する>
こんにちは、SKです。
C#/VB.NETで画像処理シリーズの第5弾。
カメラの画像の一部を拡大します。
OpenCVSharpとは?
カメラ画像表示アプリケーション
動画手順
①拡大ボタンを配置する
フォーム上に、ボタンを1つ追加します。
このボタンを押すと画像の中心部を切り出して拡大し、もう1度押すと元の画像に戻すようにします。
表示テキストは"Zoom"にしておきます。
]
デザイナー上のボタンをダブルクリックし、コードにクリックイベントを自動生成しておきます。
画像拡大用フラグ変数isZoomを追加します。
ボタンクリック時にこのフラグのTrue/Falseを切り替えます。
フラグがTrueの時、②の処理を行います。
②画像の中心を切り出し拡大する
OpenCVのSubMat関数を使い、画像の任意領域を抜き出します。
SubMat関数の引数にはRect型で領域を指定します。今回は、画像の中心部の幅・高さが1/2の領域を切り出しています。
画像の中心部を切り出した後、前回使用したResize関数で元画像に大きさに拡大し、更にCopyTo関数で元画像imgにコピーすればOKです。
private void Process(Mat img) { if (isZoom) { using (Mat roi = img.SubMat(new Rect(img.Width / 4, img.Height / 4, img.Width / 2, img.Height / 2))) { Cv2.Resize(roi, roi, img.Size()); roi.CopyTo(img); } } }
実行します。
起動時
拡大時
最後に、コード全文を載せておきます。
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 bool isZoom = false; private void Process(Mat img) { if (isZoom) { using (Mat roi = img.SubMat(new Rect(img.Width / 4, img.Height / 4, img.Width / 2, img.Height / 2))) { Cv2.Resize(roi, roi, img.Size()); roi.CopyTo(img); } } } private void button1_Click(object sender, EventArgs e) { isZoom = !isZoom; } } }
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 isZoom As Boolean = False Private Sub Process(ByVal img As Mat) If isZoom Then Using roi As Mat = img.SubMat(New Rect(img.Width / 4, img.Height / 4, img.Width / 2, img.Height / 2)) Cv2.Resize(roi, roi, img.Size) roi.CopyTo(img) End Using End If End Sub Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click isZoom = Not isZoom End Sub End Class