Visual BasicでOpenCVを使う入門を紹介します。WPF アプリケーションの例を紹介します。
WPF アプリケーション
WPF アプリケーションで画像を表示するプログラムを紹介します。
- Visual Studio 2022 Community を起動し、[新規作成]→[プロジェクト]を選びます。
- 新しいプロジェクトの作成」画面が現れますので「WPF アプリケーション」を選びます。
- 「新しいプロジェクトを構成します」画面が現れますので「プロジェクト名」や「場所」などを指定します。
- これでプロジェクトが作成されます。このプロジェクトには、自動で生成されたフォームとソースファイルが含まれます。
- MainWindow.xaml と MainWindow.xaml.cs を変更します。
以降に、変更したMainWindow.xaml と MainWindow.xaml.cs のソースリストを示します。
まず、xamlのソースリストを示します。
<Window x:Class="MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:WpfApp" mc:Ignorable="d" Title="MainWindow" Height="450" Width="800"> <Grid> <DockPanel LastChildFill="True"> <Menu DockPanel.Dock="Top" VerticalAlignment="Top"> <MenuItem Header="ファイル(_F)"> <MenuItem Header="開く(_O)" Click="MenuItem_Open_Click"/> <MenuItem Header="閉じる(_C)" Click="MenuItem_Close_Click"/> </MenuItem> </Menu> <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"> <Image Name ="Image" HorizontalAlignment="Left" VerticalAlignment="Top" Stretch="None"/> </ScrollViewer> </DockPanel> </Grid> </Window>
全体にDockPanel を配置し、その上部にMenu を置き、下部にScrollViewerを配置します。DockPanel のLastChildFill プロパティを"True" に設定したため、DockPanel の残りの部分をScrollViewer が覆います。ScrollViewer にImage を配置し、これに画像を表示します。ScrollViewer のHorizontalScrollBarVisibility とVerticalScrollBarVisibility プロパティに"Auto" を指定したため、Image がScrollViewer より大きくなると、自動でスクロールバーが現れます。
Imports Microsoft.Win32 Imports OpenCvSharp Imports OpenCvSharp.WpfExtensions Class MainWindow Private Sub MenuItem_Open_Click(sender As Object, e As RoutedEventArgs) Dim dialog = New OpenFileDialog With { .Filter = "全てのファイル (*.*)|*.*" } If dialog.ShowDialog() = True Then Dim iMat As Mat = New Mat(dialog.FileName) Image.Source = BitmapSourceConverter.ToBitmapSource(iMat) SizeToContent = SizeToContent.WidthAndHeight End If End Sub Private Sub MenuItem_Close_Click(sender As Object, e As RoutedEventArgs) Close() End Sub End Class
OpenCvSharp と OpenCvSharp.WpfExtensions を利用しますのでImportsステートメントを追加します。
OpenFileDialogを利用しダイアログを表示させ、画像の読み込みはMatのコンストラクタに任せます。表示を行う際にMatオブジェクトからBitmapSourceConverter.ToBitmapSourceメソッドでBitmapSourceに変換します。これをImageオブジェクトのSourceプロパティに設定します。
この、
Image.Source = BitmapSourceConverter.ToBitmapSource(iMat)
は、
Image.Source = iMat.ToBitmapSource
と記述することもできます。
紹介したプログラムはWPF アプリケーションですが、MVVM やバインドなどは使用しません。MVVM やMVC などを用いない方が、これまでWindows フォームアプリなどを利用していた人は分かりやすいでしょうし、説明が簡単になります。MVVM などは、大規模なアプリケーション開発には向きますが、小規模なプログラムでは却ってプログラムが分かりにくくなります。本ブログはOpenCV を.NET のVisual Basicから利用することの解説を主目的としています。なるべくOpenCV の機能が分かりやすくなる方法を採用します。MVVM に慣れた人であれば、このようなプログラムをMVVM へ書き換えるのは簡単でしょう。
実行
[開く]メニュー項目を選択して「開く」ダイアログが表示し、ファイルを選ぶと画像がウィンドウに表示されます。
ウィンドウサイズを画像より小さくするとスクロールバーが現れます。
コラム:BitmapとBitmapSource
「Windows フォームアプリ」ではBitmapを利用しますが、「WPF アプリケーション」ではBitmapSourceを使用する機会が多いです。MatオブジェクトをBitmapオブジェクト、もしくはBitmapSourceオブジェクトへ変換するには、以下のメソッドを利用します。
OpenCvSharp.Extensions | → | BitmapConverter.ToBitmap(Mat)あるいは、Mat.ToBitmap |
OpenCvSharp.WpfExtensions | → | BitmapSourceConverter.ToBitmapSource(Mat)あるいはMat.ToBitmapSource |
他の方法もありますが、それほど重要ではありませんので、ここでは割愛します。