ChatGPTでプログラム生成④

ChatGPTへ新規の質問をいくつか投げてみましょう。
ここでは、C#とOpenCVSharpを利用し、簡単なフィルター処理のプログラムをChatGPTへ生成させます。

ChatGPTへ質問

以下の質問を新規チャットで一回で入力します。

OpenCVSharpを使ってフィルター処理を行いたい。
wpfを使い画像はバインドしたい
ファイル処理とフィルター処理はメニューを追加してください。

すると、ソースリストが示されます。

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

これまでに説明した方法でVisual Studio を使用し、プロジェクトを作成します。NuGetでOpenCVSharpを導入するのも同じです。分からない場合はChatGPTへ質問すると教えてくれます。不明な点はChatGPTへ質問してください。NuGetで導入するのは、

OpenCvSharp4.WpfExtensions
OpenCvSharp4.Windows

の2つです。

ChatGPTが生成したソースコード

以降に、ChatGPTが生成したソースコードを示します。Visual Studio が生成したMainWindow.xamlとMainWindow.xaml.csへ上書きします。

MainWindow.xaml

<Window x:Class="OpenCVSharpFilterDemo.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:OpenCVSharpFilterDemo"
        mc:Ignorable="d"
        Title="OpenCVSharp Filter Demo" Height="450" Width="800">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

        <Menu Grid.Row="0">
            <MenuItem Header="_File">
                <MenuItem Header="_Open Image" Click="OpenImage_Click"/>
            </MenuItem>
            <MenuItem Header="_Filter">
                <MenuItem Header="_Apply Filter" Click="ApplyFilter_Click"/>
            </MenuItem>
        </Menu>

        <Image x:Name="imgPreview" Grid.Row="1" Stretch="Uniform"/>
    </Grid>
</Window>

MainWindow.xaml.cs

using System;
using System.Windows;
using Microsoft.Win32;
using OpenCvSharp;
using OpenCvSharp.WpfExtensions;

namespace OpenCVSharpFilterDemo
{
    //public partial class MainWindow : Window
    public partial class MainWindow : System.Windows.Window
    {
        private Mat originalImage;

        public MainWindow()
        {
            InitializeComponent();
        }

        private void OpenImage_Click(object sender, RoutedEventArgs e)
        {
            OpenFileDialog openFileDialog = new OpenFileDialog();
            openFileDialog.Filter = "Image files (*.png;*.jpeg;*.jpg;*.bmp)|*.png;*.jpeg;*.jpg;*.bmp|All files (*.*)|*.*";

            if (openFileDialog.ShowDialog() == true)
            {
                originalImage = new Mat(openFileDialog.FileName);
                imgPreview.Source = originalImage.ToBitmapSource();
            }
        }

        private void ApplyFilter_Click(object sender, RoutedEventArgs e)
        {
            if (originalImage == null)
            {
                MessageBox.Show("Please open an image first.", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
                return;
            }

            // Apply filter (example: Gaussian Blur)
            Mat filteredImage = new Mat();
            //Cv2.GaussianBlur(originalImage, filteredImage, new Size(5, 5), 0);
            Cv2.GaussianBlur(originalImage, filteredImage, new OpenCvSharp.Size(5, 5), 0);

            imgPreview.Source = filteredImage.ToBitmapSource();
        }
    }
}

MainWindow.xaml.csのコードは2行を修正します。ChatGPTが生成した以下の2行はnamespaceが曖昧です。

public partial class MainWindow : Window
Cv2.GaussianBlur(originalImage, blurredImage, new Size(5, 5), 0);

このコードに対し、Visual Studio がエラーメッセージを出力します。カーソルをWindowとSizeへ移動すると、修正の案内が表示されますので、以下のように修正します。単に名前空間が被っているだけです。なので、どちらであるかを明示的に示します。修正箇所は、元のコードをコメントとして残しています。

public partial class MainWindow : System.Windows.Window
Cv2.GaussianBlur(originalImage, blurredImage, new OpenCvSharp.Size(5, 5), 0);

この修正はChatGPTへnamespaceが曖昧だよと指摘すると、namespaceを明示したソースコードをChatGPTが示す場合もあります。ただ、一般的な解決法やほかのコードに対するコードを表示する場合もあります。

たった2箇所のnamespaceを追加しただけで、OpenCVSharpを使いフィルター処理を行うwpfプログラムが完成します。

ビルド&実行

このプログラムをビルド&実行し、画像を読み込みます。すると、画像が表示されます。

次にメニューからフィルター処理を選びます。

xamlでStretch="Uniform"を指定していますので、ウィンドウの大きさを変えると、画像のサイズも変わります。
あっという間にOpenCVを利用し、フィルター処理に対応したwpfプログラムができあがります。いろいろなフィルター処理を試したければ、このChatGPTが生成したソースコードを変更するだけです。

ChatGPTは凄いなぁ!!! ChatGPT 3.5を利用しました。