ChatGPTでプログラム生成⑥

ChatGPTでプログラム生成します。生成するプログラムは、C#WPFで、画像のオブジェクトを検出するプログラムです。

ChatGPTへ質問

以下の質問をChatGPTへ行います。

OpenCVsharpを使い、wpf形式でオブジェクト検出を行いたい。
画像の表示はバインディングし、ファイル処理はメニューを用意して

なお、ChatGPTの回答は毎回異なりますので、その都度、自身で質問を調整する必要があります。ChatGPTが生成したソースコードコンパイル時にエラーになる場合や、実行時に例外が発生したり、画像表示がうまく行かない場合もあります。このため、万能ではなくC#OpenCVの基礎知識がないと難しいと感じます。代わりに、C#OpenCVの初級者が画像処理を行いたいときにchatGPTは強力な助っ人なるでしょう。現在のChatGPTで、これだけの完成度ですので、しばらくしたら簡単なコードを記述するようにエンジニアの出番は無さそうに感じますし、中級以上のエンジニアであっても生産性の低いエンジニアは淘汰されてしまうのではないかと思います。

プロジェクトの生成とOpenCVsharpのインストール

ChatGPTでプログラム生成④と同じです。NuGetで導入するのは、

OpenCvSharp4.WpfExtensions
OpenCvSharp4.Windows

の2つです。

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.xmlC:\temp\へ格納したためMainWindow.xaml.csで示したように変更します。haarcascade_frontalface_default.xmlOpenCVが用意している検出ファイルです。
github.com
などから取得すると良いでしょう。

これだけでプログラムは完成です。

ビルド&実行

このプログラムをビルド&実行し、メニューから対象画像を選びます。

メニューから対象画像を選びます。

オブジェクトが検出されます。対象画像を替えて実行した例も示します。

検出器を変更して、他のオブジェクトを検出する、あるいは検出器自体を読み込むように拡張するなど多くの応用が考えられます。ChatGPTが、このようなソースコードを生成してくれますので拡張は簡単です。

すごいなChatGPT!(ChatGPT 3.5を利用しました。)