ChatGPTでプログラム生成します。生成するプログラムは、C#のWPFで、画像のオブジェクトを検出するプログラムです。
ChatGPTへ質問
以下の質問をChatGPTへ行います。
OpenCVsharpを使い、wpf形式でオブジェクト検出を行いたい。
画像の表示はバインディングし、ファイル処理はメニューを用意して
プロジェクトの生成とOpenCVsharpのインストール
ChatGPTでプログラム生成④と同じです。NuGetで導入するのは、
OpenCvSharp4.WpfExtensions
OpenCvSharp4.Windows
ChatGPTが生成したソースコード
以降に、ChatGPTが生成したソースコードを示します。Visual Studio が生成したMainWindow.xamlとMainWindow.xaml.csへ上書きします。一部変更していますが、それについては後述します。
MainWindow.xaml
<Window x:Class="ObjectDetectionWPF.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Object Detection" Height="450" Width="800"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <Menu Grid.Row="0"> <MenuItem Header="File"> <MenuItem Header="Open" Click="Open_Click"/> </MenuItem> </Menu> <Image Grid.Row="1" x:Name="imageControl" Stretch="Uniform"/> </Grid> </Window>
xamlはChatGPTが生成したコードを、そのまま利用します。
MainWindow.xaml.cs
using System; using System.Windows; using Microsoft.Win32; using OpenCvSharp; using OpenCvSharp.WpfExtensions; namespace ObjectDetectionWPF { //public partial class MainWindow : Window public partial class MainWindow : System.Windows.Window { public MainWindow() { InitializeComponent(); } private void Open_Click(object sender, RoutedEventArgs e) { OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Filter = "Image files (*.jpg;*.jpeg;*.png)|*.jpg;*.jpeg;*.png|All files (*.*)|*.*"; if (openFileDialog.ShowDialog() == true) { string filename = openFileDialog.FileName; Mat image = Cv2.ImRead(filename); if (image.Empty()) { MessageBox.Show("Failed to open image file."); return; } // ここにオブジェクト検出のコードを追加します //例えば、顔検出を行う場合: var faceCascade = new CascadeClassifier("c:\\temp\\haarcascade_frontalface_default.xml"); var faces = faceCascade.DetectMultiScale(image); foreach (var face in faces) { Cv2.Rectangle(image, face, Scalar.Red, 2); } // 画像を表示 imageControl.Source = image.ToBitmapSource(); } } } }
MainWindow.xaml.csは1行を修正し、オブジェクト検出のコードのコメントアウトを外します。そして、オブジェクト検出のファイルをOpenCVから指定の場所へ移動します。
まず、
public partial class MainWindow : Window
このコードに対し、Visual Studio がエラーメッセージを出力します。カーソルをWindowの位置へ移動すると、修正の案内が表示されますので、以下のように修正します。public partial class MainWindow : System.Windows.Window
この修正はChatGPTへnamespaceが曖昧だよと指摘すると、ChatGPTがnamespaceを明示したソースコードを示す場合もあります。次にコメントアウトされていた、
// ここにオブジェクト検出のコードを追加します // 例えば、顔検出を行う場合: // var faceCascade = new CascadeClassifier("haarcascade_frontalface_default.xml"); // var faces = faceCascade.DetectMultiScale(image); // foreach (var face in faces) // { // Cv2.Rectangle(image, face, Scalar.Red, 2); // }
を、ソースリストに示したように変更します。基本的にコメントアウトするだけですが、オブジェクト検出ファイルを保存した path に合わせて書き換えてください。この例では、haarcascade_frontalface_default.xmlをC:\temp\へ格納したためMainWindow.xaml.csで示したように変更します。haarcascade_frontalface_default.xmlはOpenCVが用意している検出ファイルです。
github.com
などから取得すると良いでしょう。
これだけでプログラムは完成です。
ビルド&実行
このプログラムをビルド&実行し、メニューから対象画像を選びます。
メニューから対象画像を選びます。
オブジェクトが検出されます。対象画像を替えて実行した例も示します。
検出器を変更して、他のオブジェクトを検出する、あるいは検出器自体を読み込むように拡張するなど多くの応用が考えられます。ChatGPTが、このようなソースコードを生成してくれますので拡張は簡単です。
すごいなChatGPT!(ChatGPT 3.5を利用しました。)