質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

1842閲覧

unity スクリプト間の値受け渡し C#

1236

総合スコア19

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2021/01/20 07:16

編集2021/01/20 07:20

前提・実現したいこと

https://qiita.com/nkojima/items/1fb901c13f9707808bc0

unityで上記サイトの『2つの画像の差分を得る』のプログラムを実行しています。

現在2つの画像の全ピクセルに対して画素値を比較し、異なれば赤の画素値に置き換えることで差分を可視化しています。

今回やりたいことは、何ピクセル異なっているかを出力させることです。

発生している問題・エラーメッセージ

ImageComparator.cs 内で差分のあるピクセル数分 DIFF に加算していき、Programs.cs に受け渡して出力したいのですがうまくいきません。

public int DIFF にしても、Compare の外で宣言してもできませんでした。

Assets/script/Program.cs(16,52): error CS1061: 'ImageComparator' does not contain a definition for 'DIFF' and no accessible extension method 'DIFF' accepting a first argument of type 'ImageComparator' could be found (are you missing a using directive or an assembly reference?)

該当のソースコード

ImageComparator.cs

C#

1using System; 2using System.Collections.Generic; 3using System.Drawing; 4using System.Drawing.Imaging; 5using System.Text; 6 7namespace CSharpStudy.Image 8{ 9 /// <summary> 10 /// 「画像比較機」クラス。 11 /// </summary> 12 public class ImageComparator 13 { 14 /// <summary> 15 /// 1ピクセルずつ画像を比較して、差分の画像を返す。 16 /// </summary> 17 /// <param name="bmp1Path">比較する画像1のファイルパス。</param> 18 /// <param name="bmp2Path">比較する画像2のファイルパス。</param> 19 /// <param name="path">差分画像の保存先となるファイルパス。</param> 20 /// <returns>2つの画像が同じであればtrue、そうでなければfalseを返す。</returns> 21 public static bool Compare(string bmp1Path, string bmp2Path, string path = @".\diff_image.png") 22 { 23 bool isSame = true; 24 25 // 画像を比較する際に「大きい方の画像」のサイズに合わせて比較する。 26 Bitmap bmp1 = new Bitmap(bmp1Path); 27 Bitmap bmp2 = new Bitmap(bmp2Path); 28 int width = Math.Max(bmp1.Width, bmp2.Width); 29 int height = Math.Max(bmp1.Height, bmp2.Height); 30 31 int DIFF = 0; // 何ピクセル異なるか 32 33 Bitmap diffBmp = new Bitmap(width, height); // 返却する差分の画像。 34 Color diffColor = Color.Red; // 画像の差分に付ける色。 35 36 // 全ピクセルを総当りで比較し、違う部分があればfalseを返す。 37 for (int i = 0; i < width; i++) 38 { 39 for (int j = 0; j < height; j++) 40 { 41 try 42 { 43 Color color1 = bmp1.GetPixel(i, j); 44 if (color1 == bmp2.GetPixel(i, j)) 45 { 46 diffBmp.SetPixel(i, j, color1); 47 } 48 else 49 { 50 DIFF += 1; 51 diffBmp.SetPixel(i, j, diffColor); 52 isSame = false; 53 } 54 } 55 catch 56 { 57 // 画像のサイズが違う時は、ピクセルを取得できずにエラーとなるが、ここでは「差分」として扱う。 58 diffBmp.SetPixel(i, j, diffColor); 59 isSame = false; 60 } 61 } 62 } 63 diffBmp.Save(path, ImageFormat.Png); 64 return isSame; 65 } 66 } 67}

Programs.cs

using System.IO; using CSharpStudy.Image; using UnityEngine; namespace CSharpStudy { class Program : MonoBehaviour { void Start() { // Assets/Images/CameraScreenShot.png を使う string BITMAP1_PATH = Path.Combine(Application.dataPath, "images", "CameraScreenShot.png"); // Assets/Images/CameraScreenShot2.png を使う string BITMAP2_PATH = Path.Combine(Application.dataPath, "images", "CameraScreenShot2.png"); // 差分画像を Assets/imagesフォルダ に diff.png という名前で保存 string DIFF_IMG_PATH = Path.Combine(Application.dataPath, "images", "diff.png"); int DIFF; DIFF = GetComponent<ImageComparator>().DIFF; bool isSame = ImageComparator.Compare(BITMAP1_PATH, BITMAP2_PATH); if (isSame) { Debug.Log("2つの画像は同じです。"); } else { Debug.Log("2つの画像は異なります。"); Debug.Log(DIFF); Debug.Log("次の差分ファイルを確認してください。:" + DIFF_IMG_PATH); } Debug.Log(DIFF); } } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

解決しました。

ImageComparator.cs

using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; using System.Text; namespace CSharpStudy.Image { /// <summary> /// 「画像比較機」クラス。 /// </summary> public class ImageComparator { /// <summary> /// 1ピクセルずつ画像を比較して、差分の画像を返す。 /// </summary> /// <param name="bmp1Path">比較する画像1のファイルパス。</param> /// <param name="bmp2Path">比較する画像2のファイルパス。</param> /// <param name="path">差分画像の保存先となるファイルパス。</param> /// <returns>2つの画像が同じであればtrue、そうでなければfalseを返す。</returns> public static int Compare(string bmp1Path, string bmp2Path, string path = @".\diff_image.png") { // 画像を比較する際に「大きい方の画像」のサイズに合わせて比較する。 Bitmap bmp1 = new Bitmap(bmp1Path); Bitmap bmp2 = new Bitmap(bmp2Path); int width = Math.Max(bmp1.Width, bmp2.Width); int height = Math.Max(bmp1.Height, bmp2.Height); int DIFF = 0; // 何ピクセル異なるか Bitmap diffBmp = new Bitmap(width, height); // 返却する差分の画像。 Color diffColor = Color.Red; // 画像の差分に付ける色。 // 全ピクセルを総当りで比較し、違う部分があればfalseを返す。 for (int i = 0; i < width; i++) { for (int j = 0; j < height; j++) { try { Color color1 = bmp1.GetPixel(i, j); if (color1 == bmp2.GetPixel(i, j)) { diffBmp.SetPixel(i, j, color1); } else { DIFF += 1; diffBmp.SetPixel(i, j, diffColor); } } catch { // 画像のサイズが違う時は、ピクセルを取得できずにエラーとなるが、ここでは「差分」として扱う。 diffBmp.SetPixel(i, j, diffColor); } } } diffBmp.Save(path, ImageFormat.Png); return DIFF; } } }

Programs.cs

using System.IO; using CSharpStudy.Image; using UnityEngine; namespace CSharpStudy { class Program : MonoBehaviour { void Start() { // Assets/Images/CameraScreenShot.png を使う string BITMAP1_PATH = Path.Combine(Application.dataPath, "images", "CameraScreenShot.png"); // Assets/Images/CameraScreenShot2.png を使う string BITMAP2_PATH = Path.Combine(Application.dataPath, "images", "CameraScreenShot2.png"); // 差分画像を Assets/imagesフォルダ に diff.png という名前で保存 string DIFF_IMG_PATH = Path.Combine(Application.dataPath, "images", "diff.png"); int Diff = ImageComparator.Compare(BITMAP1_PATH, BITMAP2_PATH, DIFF_IMG_PATH); Debug.Log(Diff); } } }

投稿2021/01/20 07:54

1236

総合スコア19

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問