526̲wpf-ocv̲book.indb 1

2023/06/09 16:16

■サンプルファイルのダウンロードについて
本書掲載のサンプルファイルは、下記 URL からダウンロードできます。

https://--------------------------------------● ファイルサイズを小さくするため、NuGet で導入した OpenCvSharp の packages と、

いくつかのバイナリファイルをプロジェクトから削除しています。
● プロジェクトファイルは、そのまま利用できることを保証するものではありません。
● ダウンロードファイルの提供は、ソースコードを入力する手間を省くことを目的としています。

・本書の内容についてのご意見、ご質問は、お名前、ご連絡先を明記のうえ、小社出版部宛文書（郵送または E-mail）でお送りください。
・電話によるお問い合わせはお受けできません。
・本書の解説範囲を越える内容のご質問や、本書の内容と無関係なご質問にはお答えできません。
・匿名のフリーメールアドレスからのお問い合わせには返信しかねます。
本書で取り上げられているシステム名／製品名は、一般に開発各社の登録商標／商品名です。本書では、™ および ® マークは明記していません。本書に掲載されている団体／商品に対して、その商標権を侵害する意図は一切ありません。本書で紹介している URL や各サイトの内容は変更される場合があります。

526̲wpf-ocv̲book.indb 2

2023/06/09 16:16

はじめにOpenCV※1

は、膨大な関数を用意した画像処理ライブラリ集です。一般的な二次元の画像処理、ヒストグラム処理、ポリゴン処理、テンプレートマッチング、オプティカルフロー、および顔認識など多様なアプリケーションを開発できる関数群を用意しています。これらの関数のリファレ
ンス、ならびに大量のサンプルプログラムは、OpenCV のサイトで紹介されています。また、同サイトには、サンプルコードと共に、それに対する丁寧な説明文まで提供されています。
C# と OpenCV を組み合わせると、スマートなユーザーインタフェースと高度な画像処理を両立できるでしょう。残念ながら C# の本家から OpenCV を利用するインタフェースは提供されていません。しかし、サードパーティから C# と OpenCV を融合させるラッパーがいくつか提供されています。本書では、最も一般的に使われていると思われるラッパーを使用し、C# から OpenCVの機能を使う方法を紹介します。
C# と一口で言っても、Windows フォームアプリ、コンソールアプリ、WPF アプリケーションなどがあり、これらは .NET または .NET Framework と組み合わせることができます。ただ、.NET
Framework や Windows フォームアプリはすでに古い技術であり、新規に C# を学習する人にとって、これらを学習する必要性は低いでしょう。このような背景から、本書は WPF アプリケーショ
ンと .NET の組み合わせで OpenCvSharp を使う方法を紹介します。WPF を使いますが、デザイン
パターンに MVVM は採用せず、Windows フォームアプリに慣れた人が学習しやすいコードビハ
インドで記述します。これは、小さなプログラムではそのほうが見通しがよく、MVVM は冗長と考えたためです。
対象読者● C# から OpenCV を利用したい人● OpenCV を WPF で利用したい人● OpenCV とリッチなユーザーインタフェースが同居したプログラムを開発したい人

謝辞
出 版 に あ た り、 開 発 環 境 で あ る Visual Studio を 無 償 で 提 供 し た 米 Microsoft 社、 無 償 のOpenCV を提供した Intel 社、そして OpenCvSharp を提供してくださった Shima 氏、写真を提供していただいた馬場宏氏に深く感謝いたします。また、株式会社カットシステムの石塚勝敏氏にも深く感謝いたします。
2023 年初初夏 新型コロナが収まり日常が戻りつつある都立公園にて 北山洋幸

※1Open Source Computer Vision Libraryiii

526̲wpf-ocv̲book.indb 32023/06/09 16:16

本書の使用にあたって
開発環境、および、実行環境の説明を行います。
● Windows バージョン

Windows のバージョンへ依存するとは思えませんが、開発・実行を確認したのは Windows
10 Pro（64 ビット）です。ほとんどのプログラムを Windows 10 Home Edition（64 ビット）でも確認していますが、すべてを確実に確認したのは Windows 10 Pro（64 ビット）です。
● Visual Studio のバージョンとエディション

無償の Visual Studio Community 2022 を使用します。
● OpenCvSharp のバージョン

バージョン 4.4.0.20200915 以降を利用します。4.7.0.20230115 などでも確認しましたが、執筆中にバージョン変更があったか厳密な観察は行っていません。なるべくバージョン依存を排除したつもりですが、将来のバージョンで動作することを保証するものではありません。
● URL

文中や参考資料に URL の記載があります。これは執筆時点のものであり、変更される可能性もあります。リンク先が存在しない場合、キーワードなどから自身で検索してください。

用語
用語の使用に関して説明を行います。
● カタカナ語の長音表記「メモリー」や「フォルダー」など、最近は語尾の「ー」を付けるのが一般的になっています
ので、なるべく「ー」を付けるようにします。ただ、開発環境やドキュメントなどに従来の用語を使用している場合も多いため、本書では、語尾の「ー」は統一していません。なるべ
く統一を心掛けましたが、参考資料などでも混在して使用しているため、統一が困難でした。
このため、従来の表現と最近の表現が混在しています。
● クラスとオブジェクト

本来はインスタンス化しているためオブジェクトと表現した方がよい場所でも、クラスと表現する場合があります。これは文脈から読み取ってください。

iv

526̲wpf-ocv̲book.indb 42023/06/09 16:16

● ユーザーインタフェース

ユーザーインタフェースを UI や GUI と省略する場合があります。
● コントロールやクラス

フォームデザイン時などに使用するコントロール、例えば Image などをコントロールやクラス、あるいは単純に Image と表現し、クラス、コントロールを正確に表現していない場合があります。

● フォームとウィンドウフォームとウィンドウは同じものを指します。主に開発時はフォームと呼び、実行時にウィンドウと呼びますが、例外もあります。
● ソースリストとソースコード

基本的に同じものを指しますが、ソースリストと表現する場合ソース全体を、ソースコードと表現する場合、ソースの一部を指す場合が多いです。
● オブジェクト

インスタンスと表現した方が良い場合でも、オブジェクトと表現している場合があります。
両方を、厳密に使い分けていませんので、文脈から判断してください。あるいは、物体を指す場合もあります。
● 関数とメソッド

本来ならメソッドと表現した方が良さそうな場合でも、従来の名残か関数という表現がオリジナルドキュメントで採用されているときがあります。本書も、それにならって関数という表現が残っています。
● 返却値と戻り値メソッドや関数の「戻り値」と「返却値」を統一していません。このため、「返す」という表現と「戻す」という表現が混在します。

v

526̲wpf-ocv̲book.indb 52023/06/09 16:16

526̲wpf-ocv̲book.indb 62023/06/09 16:16

目

次

目次
はじめに...................................................................................................................................... iii

第1章
1.1

はじめてのプログラム ............................................ 1
OpenCvSharp とは................................................................................................... 1
1.1.1

1.2
1.3

ライセンスについて.........................................................................2

はじめてのプログラム............................................................................................... 2コンソールアプリ....................................................................................................... 3
1.3.1

NuGet を用いて OpenCvSharp を導入..............................................5

1.3.2

実行例............................................................................................7

1.3.3

OpenCvSharp4.Extensions や OpenCvSharp4.WpfExtensions の導入...............................................................................................9

1.4

Windows フォームアプリ......................................................................................10
1.4.1

1.5

1.6

第2章

実行例.......................................................................................... 13

WPF アプリケーションで画像ファイル表示.....................................................15
1.5.1

OpenCvSharp を利用しない........................................................... 15

1.5.2

実行例.......................................................................................... 18

1.5.3

OpenCvSharp を利用する.............................................................. 18

1.5.4

OpenCvSharp.WpfExtensions を利用しない................................... 19

OpenCvSharp のクラスやメソッド...................................................................21

色や輝度の処理.................................................... 23

2.1

画像の反転..................................................................................................................23

2.2

サブメニュー..............................................................................................................28

2.3

ハンドラー共通化.....................................................................................................31

2.4

辞書とデリゲート.....................................................................................................34

2.5

Null 許容の警告と解決............................................................................................36

2.6

OpenCvSharp のクラスやメソッド...................................................................39vii

526̲wpf-ocv̲book.indb 72023/06/09 16:16

第3章

グラフィックス.................................................... 45

3.1

グラフィックス（1）................................................................................................45

3.2

グラフィックス（2）................................................................................................51

3.3

OpenCvSharp のクラスやメソッド...................................................................56

第4章
4.1

4.2

フィルター処理.................................................... 61
CCv クラス................................................................................................................61
4.1.1

CCv クラスの private メソッド....................................................... 62

4.1.2

CCv クラスの public/protected メソッド......................................... 63

4.1.3

プロジェクトへクラスを追加.......................................................... 67

フィルター..................................................................................................................69
4.2.1

ドラッグ & ドロップ...................................................................... 80

4.3フィルター（2 画面対応）.......................................................................................81

4.4

ヒストグラムの表示.................................................................................................84

4.5

OpenCvSharp のクラスやメソッド...................................................................89

第5章

アフィン変換 ....................................................... 99

5.1

フリップ......................................................................................................................99

5.2

リサイズ................................................................................................................... 103

5.3

回転........................................................................................................................... 105

5.4

透視投影................................................................................................................... 108

5.5

OpenCvSharp のクラスやメソッド................................................................ 113

第6章

オブジェクト ......................................................117

6.1

コーナー検出........................................................................................................... 117

6.2

矩形の検出............................................................................................................... 120
6.2.1

三角形のみを検出........................................................................ 132

6.3

透視投影................................................................................................................... 133

6.4

ノイズの除去と細線化.......................................................................................... 147

6.5

OpenCvSharp のクラスやメソッド................................................................ 150

viii

526̲wpf-ocv̲book.indb 82023/06/09 16:16

目 次

第7章

マウスでオブジェクト操作 .................................. 155

7.1

透視投影................................................................................................................... 155

7.2

オブジェクト除去.................................................................................................. 167

7.3

オブジェクトのサイズを変更............................................................................. 178

7.4

オブジェクトのサイズを変更・ガウス関数.................................................... 187

7.5

OpenCvSharp のクラスやメソッド................................................................ 195

第8章

オブジェクトの検出とサイズ変更......................... 197

8.1

オブジェクト検出.................................................................................................. 197

8.2

自動でオブジェクトを検出し拡大縮小............................................................. 207

8.3

自動でオブジェクトを検出し拡大・ガウス関数............................................ 213

8.4

テンプレートマッチング...................................................................................... 215

8.5

OpenCvSharp のクラスやメソッド................................................................ 219

第9章

特徴点 .............................................................. 223

9.1

特徴点検出............................................................................................................... 223

9.2

特徴点のマッチング.............................................................................................. 228

9.3

特徴点のマッチング・双方向............................................................................. 234

9.4

パノラマ................................................................................................................... 236

9.5

OpenCvSharp のクラスやメソッド................................................................ 239

第 10 章

画像合成 ......................................................... 243

10.1

画像合成................................................................................................................... 243

10.2

マスクで画像合成.................................................................................................. 249

10.3

ROI で画像合成...................................................................................................... 252

10.4

重みを付けて画像合成.......................................................................................... 254

10.5

OpenCvSharp のクラスやメソッド................................................................ 256ix

526̲wpf-ocv̲book.indb 92023/06/09 16:16

第 11 章フーリエ変換 ................................................... 259

11.1

離散フーリエ変換.................................................................................................. 259

11.2

離散フーリエ変換・Grid 表示............................................................................ 267

11.3

逆変換....................................................................................................................... 271

11.4

逆変換・Grid 表示................................................................................................. 276

11.5

11.4.1

Grid に枠を表示.......................................................................... 281

11.4.2

縦に表示..................................................................................... 282

11.4.3

縦横に表示.................................................................................. 283

逆変換・StackPanel 版....................................................................................... 285
11.5.1

逆変換・StackPanel 版で横表示.................................................... 286

11.6

逆変換・WrapPanel 版....................................................................................... 287

11.7

OpenCvSharp のクラスやメソッド................................................................ 290

第 12 章画像比較 ......................................................... 297

12.1

似た画像を探す...................................................................................................... 297

12.2

似た画像を探す・リサイズ版............................................................................. 311

12.3

似た画像を探す・加重比較.................................................................................. 313

12.4

ヒストグラムで比較.............................................................................................. 315

12.5

OpenCvSharp のクラスやメソッド................................................................ 322

第 13 章13.1

13.2

応用 ............................................................... 325
閾値（1）.................................................................................................................. 325
13.1.1

フォーム..................................................................................... 325

13.1.2Threshold 値をバインディング..................................................... 331

13.1.3

ファイル名をバインディング........................................................ 334

閾値（2）.................................................................................................................. 338
13.2.1

13.3

適応閾値................................................................................................................... 342
13.3.1

13.4

フォーム..................................................................................... 338
フォーム..................................................................................... 342

DFT2 画面............................................................................................................... 348
13.4.1

フォーム..................................................................................... 348

x526̲wpf-ocv̲book.indb 102023/06/09 16:16

目 次

13.5

自動でオブジェクトを検出し拡大縮小・UI 改善版....................................... 352
13.5.1

13.6

Grid 版....................................................................................... 360

GridSplitter を配置.............................................................................................. 365
13.6.1

フォーム..................................................................................... 365

13.7

画像をバインド...................................................................................................... 368

13.8

OpenCvSharp のクラスやメソッド................................................................ 374

付 録Visual Studio のインストール............................ 375

参考文献、参考サイト、参考資料................................................................................... 381
索  引....................................................................................................................................... 383

xi

526̲wpf-ocv̲book.indb 11

2023/06/09 16:16

526̲wpf-ocv̲book.indb 122023/06/09 16:16

第

1章

はじめての
プログラム
第1章

1

はじめてのプログラム

C# から OpenCV を使用する基本を説明します。はじめてなので、プロジェクトへ OpenCvSharpを導入する方法も解説します。本書のプログラムは WPF で開発しますが、本章では、コンソール
アプリと Windows フォームアプリの例も紹介します。

1.1

OpenCvSharp とはOpenCvSharp は、shimat 氏が開発した C# 用の OpenCV ラッパーです。筆者が調べた限り、C#から OpenCV を利用するときに最も使用され、機能も充実しているラッパーです。導入も簡単ですので、プログラミング初心者に限らず経験者にもおすすめです。

本ラッパーは、OpenCV で画像保持に使われる Mat クラスと .NET の BitmapSource 間で相互に変換する機能を用意しています。このため、OpenCV で処理した結果を容易に C# のコントロール

へ表示することが可能です。また、本書では執筆時の最新バージョンを使用しますが、OpenCVの各バージョンに対応した NuGet パッケージも用意されています。OpenCvSharp は開発が続いているため、より早く最新の OpenCV を使用できます。この点も OpenCvSharp を推奨する重要な要素です。

1526̲wpf-ocv̲book.indb 1

2023/06/09 16:16

1

はじめてのプログラム

画像保持
Windows フォームアプリを利用する場合、OpenCvSharp がサポートする Mat

を Bitmap へ変換する機能を利用します。しかし、WPF アプリケーションでは、
BitmapSource を利用しますので、画像の保持は Windows フォームアプリと WPF

アプリケーションで若干異なります。詳細については、本文で解説します。

1.1.1 ライセンスについてOpenCvSharp は LGPL ライセンスを採用しています。OpenCV 自体は BSD ライセンスです。ほ
かにも OpenCV などで使用されるライブラリ、たとえば TBB や ffmpeg などは個別にライセンスが存在します。
商用利用する場合や、本体のソースコードを配布したり、あるいは改変して使用する場合は、ライセンスに違反しないように十分配慮してください。

1.2

はじめてのプログラム

本章では、最も単純と思われる C# から OpenCV を利用するプログラムを紹介します。1.3 節ではコンソールアプリの例、1.4 節では Windows フォームアプリの例、1.5 節では WPF アプリケー
ションの例を紹介します。なお、プロジェクトへ NuGet で OpenCvSharp を導入する方法も説明します。

2526̲wpf-ocv̲book.indb 2

2023/06/09 16:16

1.3

1.3

コンソールアプリ

コンソールアプリ

1
2

まず、新しいコンソールプロジェクトを作成します。

3（1）Visual Studio 2022 Community を起動し、［ファイル］→［新規作成］→［プロジェクト］を
選びます。

4
5
6
図1.1●［ファイル］→［新規作成］→［プロジェクト］を選ぶ

7

起動時に Visual Studio 2022 の画面が現れますので「新しいプロジェクトの作成」を選び、プロジェクトを新規に作成しても構いません。

8（2）「新しいプロジェクトの作成」画面が現れますので「コンソール アプリ」を選びます。
「コンソー

9

ル アプリ (.NET Framework)」を選んでも構いませんが、.NET Framework は開発が止まりますので、なるべくなら「コンソール アプリ」を選びます。

10
11
12
13

付録

図1.2●「新しいプロジェクトの作成」画面

3526̲wpf-ocv̲book.indb 32023/06/09 16:16

1

はじめてのプログラム（3）「新しいプロジェクトを構成します」画面が現れますので「プロジェクト名」や「場所」などを指定します。

図1.3●「新しいプロジェクトを構成します」画面（4）これでプロジェクトが作成されます。このプロジェクトには、自動で生成されたソースファイル（Program.cs）が含まれます。

図1.4●プロジェクト完成

4526̲wpf-ocv̲book.indb 42023/06/09 16:16

1.3コンソールアプリ

リスト1.1●自動で生成されたProgram.cs

1// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");2（5）このプログラムをビルドして実行すると、「Hello World!」が表示されます。

3（6）このソースファイルを書き換え、OpenCV へ対応させたものを示します。まだ OpenCvSharp4を導入していないため、関連するソースコードの部分でエラーが発生し、画面に赤い波線の下線5で示されます。

6
7
8
9
10
11
12
13

図1.5●ソースファイルを書き換えた状態

1.3.1 NuGet を用いて OpenCvSharp を導入
OpenCvSharp の導入は NuGet を用いると簡単です。NuGet 上に公開されている OpenCvSharp
はいくつかのバージョンやプラットフォーム用が存在しますので、間違ったものを導入しないよ
うに慎重に選択しましょう。
付録

5526̲wpf-ocv̲book.indb 52023/06/09 16:16

1

はじめてのプログラム（1）ソリューションエクスプローラーのプロジェクトの上で、マウスの右ボタンを押し、［NuGetパッケージの管理］を選択します。

図1.6●［NuGetパッケージの管理］を選択（2）「NuGet パッケージマネージャー」が現れますので、「参照」を選びます。

図1.7●「参照」を選ぶ（3）このままパッケージを探しても良いのですが、数が多いので検索欄に「opencvsharp」あるい
は「opencvsharp4」（バージョン 4.x の場合）と入力し、OpenCvSharp 関連のパッケージを表示させます。

図1.8●検索（4）今回は OpenCV のバージョン 4.x を利用したいため、OpenCvSharp4.Windows を選び［インストール］をクリックします。細かなバージョンや公開日、ライセンス情報などが表示されます
ので、詳細は画面で確認してください。

6526̲wpf-ocv̲book.indb 62023/06/09 16:16

1.3コンソールアプリ12345
図1.9●OpenCvSharp4.Windowsをインストール

6［インストール］をクリックしたときに確認のダイアログが現れることもありますので、適宜応答してください。

7（5）しばらくするとインストールが完了します。正常にインストールが完了すると、ソースコー

8ドの下部に表示されていた赤い線が消え、OpenCvSharp のパッケージが導入されたのがわかりま
す。

9
10
11
12
13
図1.10●インストール完了

1.3.2 実行例
ここまで完了すると、以降は一般的な C# のプログラムと同様です。ビルドして実行した例を示します。プログラムが起動すると、画像が表示されます。
付録

7526̲wpf-ocv̲book.indb 72023/06/09 16:16

1

はじめてのプログラム

図1.11●実行例

プログラムを終了させたい場合、画像表示ウィンドウにフォーカスを移動してから何かキーを押してください。コンソールウィンドウにフォーカスを置いたままでは、プログラムへキーコー
ドが渡りませんのでプログラムは終了しません。
最終のソースリストを次に示します。
リスト1.2●最終のProgram.cs
namespace ConsoleApp1{

class Program{

static void Main(string[] args){

Console.WriteLine("Hello World!");int rows = 200, cols = 300;

OpenCvSharp.Mat img = new OpenCvSharp.Mat(rows, cols,

OpenCvSharp.MatType.CV_8UC3, OpenCvSharp.Scalar.Cyan);

img.Line(new OpenCvSharp.Point(10, 10),

new OpenCvSharp.Point(cols - 10, rows - 10),OpenCvSharp.Scalar.Blue);// pt1// pt2// color

var wname = "begin";

OpenCvSharp.Cv2.NamedWindow(wname, OpenCvSharp.WindowFlags.AutoSize);
OpenCvSharp.Cv2.ImShow(wname, img);

}

}

}

OpenCvSharp.Cv2.WaitKey();8526̲wpf-ocv̲book.indb 82023/06/09 16:16

1.3コンソールアプリ

OpenCvSharp に対する using を追加していないため、OpenCvSharp を利用した部分へは、必ず「OpenCvSharp.」を付加します。

1

実行結果から分かるように、Mat 生成時に横幅 300 ピクセル、高さ 200 ピクセルで、色がシアンのものを作成します。その後、Line で斜めに青色の線を引きます。

23

1.3.3 OpenCvSharp4.Extensions や OpenCvSharp4.
WpfExtensions の導入

4

このプログラムでは不要でしたが、ここからさらに拡張したり、あるいは WPF アプリケーショ

5ンや Windows フォームアプリを開発する際に、「OpenCvSharp4.Extensions」や「OpenCvSharp4.
WpfExtensions」 が 必 要 に な る 場 合 が あ り ま す。 そ の よ う な 場 合 は、 先 の「OpenCvSharp4.

6

Windows」をインストールしたときと同じように、NuGet を利用してインストールしてください。
以降に、インストールの様子を示します。

7
8
9
10
11

図1.12●OpenCvSharp4.Extensionsをインストール

12
13

付録

図1.13●OpenCvSharp4.WpfExtensionsをインストール

9526̲wpf-ocv̲book.indb 92023/06/09 16:16

1

はじめてのプログラム

このままでは、C++ で開発したプログラムと大して変わりありません。そこで、1.4 節でWindows フォームアプリの例を、1.5 節で WPF アプリケーションの例を紹介します。基本的に本書は、「WPF アプリケーション」プロジェクトで OpenCvSharp を利用します。

1.4

Windows フォームアプリ

ここでは、Windows フォームアプリで OpenCvSharp を使用する例を紹介します。
（1）Visual Studio 2022 Community を起動し、［新規作成］→［プロジェクト］を選びます。
（2）「新しいプロジェクトの作成」画面が現れますので「Windows フォームアプリ」を選びます。
（3）「新しいプロジェクトを構成します」画面が現れますので「プロジェクト名」や「場所」などを指定します。
（4）これでプロジェクトが作成されます。このプロジェクトには、自動で生成されたフォームとソースファイルが含まれます。

図1.14●プロジェクト完成

10526̲wpf-ocv̲book.indb 102023/06/09 16:16