前提・実現したいこと
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); } } }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。