SKProgramLab

Let's Enjoy Programming! ~画像処理/IoT/機械学習など~

C#/VB.NETで画像処理⑤<画像の一部を拡大する>

こんにちは、SKです。
f:id:SKProgramLab:20200310203357p:plain:w100

C#/VB.NETで画像処理シリーズの第5弾。
カメラの画像の一部を拡大します。

OpenCVSharpとは?

skprogramlab.hatenablog.com

カメラ画像表示アプリケーション

skprogramlab.hatenablog.com

動画手順

youtu.be

①拡大ボタンを配置する

フォーム上に、ボタンを1つ追加します。
このボタンを押すと画像の中心部を切り出して拡大し、もう1度押すと元の画像に戻すようにします。
表示テキストは"Zoom"にしておきます。 f:id:SKProgramLab:20200404140317p:plain]

デザイナー上のボタンをダブルクリックし、コードにクリックイベントを自動生成しておきます。
f:id:SKProgramLab:20200404140541p:plain

画像拡大用フラグ変数isZoomを追加します。
ボタンクリック時にこのフラグのTrue/Falseを切り替えます。
f:id:SKProgramLab:20200404141035p:plain
フラグがTrueの時、②の処理を行います。

②画像の中心を切り出し拡大する

OpenCVSubMat関数を使い、画像の任意領域を抜き出します。
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);
        }
    }
}

f:id:SKProgramLab:20200404141618p:plain

実行します。
起動時
f:id:SKProgramLab:20200404141811p:plain
拡大時
f:id:SKProgramLab:20200404141855p:plain

最後に、コード全文を載せておきます。
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;
        }
    }
}


VB.NET

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