SKProgramLab

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

C#/VB.NETで画像処理④<画像にモザイクをかける>

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

C#/VB.NETで画像処理シリーズの第4弾。
カメラの画像にモザイク処理をかけていきます。

OpenCVSharpとは?

skprogramlab.hatenablog.com

(前回)カメラ画像をぼかす

skprogramlab.hatenablog.com

動画手順

youtu.be

①モザイク処理をかける

画像にモザイクをかけるには、一度画像を縮小し画素情報を減らし、そして元のサイズに戻すだけです。
OpenCV"Resize"関数を使い、簡単に画像の拡大/縮小ができます。

Resize関数

http://opencv.jp/opencv-2svn/cpp/geometric_image_transformations.html#cv-resize
・第1引数:入力画像(Mat)
・第2引数:出力画像(Mat)
・第3引数:変換サイズ

前回同様、Process関数に処理を記述していきます。
ここでは、画像サイズを1/10に縮小した後、元のサイズに戻します。

private void Process(Mat img)
{
    int w = img.Width;
    int h = img.Height;
    Cv2.Resize(img, img, new Size(w / 10, h / 10));
    Cv2.Resize(img, img, new Size(w, h));
}

f:id:SKProgramLab:20200403221742p:plain
実行します。
f:id:SKProgramLab:20200403221829p:plain
画像全体にモザイクがかかりました。

↓前回のGaussianBlurと似ているようで違う処理なのが分かりますでしょうか? f:id:SKProgramLab:20200403222041p: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 void Process(Mat img)
        {
            int w = img.Width;
            int h = img.Height;
            Cv2.Resize(img, img, new Size(w / 10, h / 10));
            Cv2.Resize(img, img, new Size(w, h));
        }

    }
}


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 Sub Process(ByVal img As Mat)
        Dim w As Integer = img.Width
        Dim h As Integer = img.Height
        Cv2.Resize(img, img, New Size(w / 10, h / 10))
        Cv2.Resize(img, img, New Size(w, h))
    End Sub

End Class