ChatGPTへ質問し、プログラムを生成します。
arques.hatenablog.com
に追加で質問を行い、コントロールプログラムをWindowsFormへ対応したプログラムへ変更します。
生成するプログラムはC#で記述したOpenCV用のプログラムです。
ChatGPTへ追加質問
ChatGPTでプログラム生成①の質問に続き、以下の追加質問を行います。
WindowForm対応して欲しい
質問で生成されたソースリスト
すると、WindowsFormへ対応したプロジェクトの作成法や、OpenCVsharpの導入法の説明に続き、以下のようなソースコードが示されます。
using System; using System.Windows.Forms; using OpenCvSharp; using OpenCvSharp.Extensions; namespace OpenCvSharp_WinForms { public partial class MainForm : Form { public MainForm() { InitializeComponent(); } private void LoadImageButton_Click(object sender, EventArgs e) { OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Filter = "Image files (*.jpg, *.jpeg, *.png) | *.jpg; *.jpeg; *.png"; if (openFileDialog.ShowDialog() == DialogResult.OK) { string imagePath = openFileDialog.FileName; Mat image = Cv2.ImRead(imagePath, ImreadModes.Color); if (image.Empty()) { MessageBox.Show("画像を読み込めませんでした。"); return; } pictureBox.Image = image.ToBitmap(); } } } }
プロジェクトの生成方法はChatGPTの回答を参照してください。また、NuGetでOpenCVSharpを導入する方法も同様です。
このソースコードでは、ネームスペースやクラス名が、Visual Studio の生成したプロジェクトと一致するとは限りません。そこで、Visual Studio の生成したプロジェクトへ、LoadImageButton_Clickメソッドを埋め込む形で使用します。
まず、DesignビューでFormを開き、PictureBoxコントロールを配置し、LoadImageButtonという名前のボタンを配置します。LoadImageButtonボタンのClickイベントハンドラにLoadImageButton_Clickメソッドを関連付けます。これらは、ChatGPTの回答に従うだけです。フォームの外観を示します。
ボタンを配置した後、名前(Name)をLoadImageButtonへ変更します。ついでにTextもLoadImageButtonへ変更します。このボタンのClickイベントをLoadImageButton_Clickと関連付けます。この辺りはVisual Studio やC#の常識と考えているのか、ChatGPTの回答には含まれていません。質問すると答えてくれるのでしょうが、Visual Studio やC#を利用している人にとっては普通のことなので省略してくれる方がありがたいです。
PictureBoxコントロールを配置したとき、Visual Studio がpictureBox1と名付けましたので、ソースリストはそれに従って書き換えます。
修正したソースリスト
以降に、2箇所だけ変更したソースリストを示します。
using OpenCvSharp; using OpenCvSharp.Extensions; using System.Windows.Forms; namespace WinFormsApp1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); pictureBox1.SizeMode = PictureBoxSizeMode.AutoSize; // 追加 } private void LoadImageButton_Click(object sender, EventArgs e) { OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Filter = "Image files (*.jpg, *.jpeg, *.png) | *.jpg; *.jpeg; *.png"; if (openFileDialog.ShowDialog() == DialogResult.OK) { string imagePath = openFileDialog.FileName; Mat image = Cv2.ImRead(imagePath, ImreadModes.Color); if (image.Empty()) { MessageBox.Show("画像を読み込めませんでした。"); return; } //pictureBox1.Image = image.ToBitmap(); //変更 pictureBox1.Image = BitmapConverter.ToBitmap(image); //変更 } } } }
まず、無くても構いませんが画像全体を表示できるように、コンストラクタへ pictureBox1.SizeMode = PictureBoxSizeMode.AutoSize; を追加しす。次に、MatオブジェクトをpictureBox1のImageプロパティへ代入する際の方法が「.ToBitmap()」でエラーになったため、BitmapConverterオブジェクトのToBitmapメソッドへ変更し、メソッドの引数へMatオブジェクトであるimageを与えます。変更前のソースコードをコメントとして残しました。これだけでプログラムは完成です。