2009-12-07 4 views
0

iPhone에서 Unity3d에서 2 비트 맵을 비교하여 2 (전혀 다른 0과 완전히 동일 함) 간의 상관 관계를 얻는 가장 좋은 방법은 무엇입니까? 설명서에서 Boo 또는 UnityScript를 사용하면 응용 프로그램의 크기가 증가한다고 C#을 사용하고 있습니다.iPhone에서 비트 맵 비교 방법

내가 필요한 것은 지문 식별 방법과 유사하지만 정확하지는 않습니다. 이것은 iPhone 성능에서 실행되기위한 것이므로 여기에서 큰 문제입니다.

예 이미지 : 그들은 비슷하지만 색상에 차이가 있기 때문에 나는이 약 0.5의 상관 계수를 가지고 기대하는 사람들을 위해

alt text http://img25.imageshack.us/img25/303/294906.jpg alt text http://img138.imageshack.us/img138/842/40248741fireworkexplosi.jpg

. 여러 비교 차원이 있지만 기본적인 것은 색과 모양입니다.

도움이 될 것입니다.

+0

방금 ​​찾고 있습니다 또는 하나의 이미지가 다른 이미지와 관련되어 움직여도 유사성을 인식 할 수있는 더 정교한 것을 원하십니까? 그들은 어떤 종류의 이미지입니까? –

+0

나는 유사성을 인식 할 수있는보다 정교한 것을 필요로한다. 이미지는 추상적 인 색상 패턴입니다. 감사. –

+0

어떤 해결책이 귀하의 이미지가 어떤 것인지, "유사한"것으로 간주되는 것의 세부 사항에 특정적일 것입니다 ... 아마도 몇 가지 예제 이미지를 게시 할 수 있습니까? –

답변

0

Google 검색 결과에 (내 질문에) 답변하려면 this을 찾았습니다. 기본 아이디어는 오프셋/회전, 지배적 인 색 검색 등으로 이미지를 테스트하는 것입니다. 지금까지 이것이 내가 찾을 수있는 최상의 정보이므로, 한번 시도해 보도록하겠습니다.

이 코드는 다음과가 보이는 제안 : "픽셀의 어떤 부분이 두 이미지에서 동일"

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Drawing; 
using System.Drawing.Imaging; 
using System.IO; 

namespace BitmapSimilarity 
{ 
    public interface IBitmapCompare 
    { 
     double GetSimilarity(Bitmap a, Bitmap b); 
    } 

    class BitmapCompare: IBitmapCompare 
    { 
     public struct RGBdata 
     { 
      public int r; 
      public int g; 
      public int b; 

      public int GetLargest() 
      { 
       if(r>b) 
       { 
        if(r>g) 
        { 
         return 1; 
        } 
        else 
        { 
         return 2; 
        } 
       } 
       else 
       { 
        return 3; 
       } 
      } 
     } 

     private RGBdata ProcessBitmap(Bitmap a) 
     { 
      BitmapData bmpData = a.LockBits(new Rectangle(0,0,a.Width,a.Height),ImageLockMode.ReadOnly,PixelFormat.Format24bppRgb); 
      IntPtr ptr = bmpData.Scan0; 
      RGBdata data = new RGBdata(); 

      unsafe 
      { 
       byte* p = (byte*)(void*)ptr; 
       int offset = bmpData.Stride - a.Width * 3; 
       int width = a.Width * 3; 

       for (int y = 0; y < a.Height; ++y) 
       { 
        for (int x = 0; x < width; ++x) 
        { 
         data.r += p[0];    //gets red values 
         data.g += p[1];    //gets green values 
         data.b += p[2];    //gets blue values 
         ++p; 
        } 
        p += offset; 
       } 
      } 
      a.UnlockBits(bmpData); 
      return data; 
     } 

     public double GetSimilarity(Bitmap a, Bitmap b) 
     { 
      RGBdata dataA = ProcessBitmap(a); 
      RGBdata dataB = ProcessBitmap(b); 
      double result = 0; 
      int averageA = 0; 
      int averageB = 0; 
      int maxA = 0; 
      int maxB = 0; 

      maxA = ((a.Width * 3) * a.Height); 
      maxB = ((b.Width * 3) * b.Height); 

      switch (dataA.GetLargest())   //Find dominant color to compare 
      { 
       case 1: 
        { 
         averageA = Math.Abs(dataA.r/maxA); 
         averageB = Math.Abs(dataB.r/maxB); 
         result = (averageA - averageB)/2; 
         break; 
        } 
       case 2: 
        { 
         averageA = Math.Abs(dataA.g/maxA); 
         averageB = Math.Abs(dataB.g/maxB); 
         result = (averageA - averageB)/2; 
         break; 
        } 
       case 3: 
        { 
         averageA = Math.Abs(dataA.b/maxA); 
         averageB = Math.Abs(dataB.b/maxB); 
         result = (averageA - averageB)/2; 
         break; 
        } 
      } 

      result = Math.Abs((result + 100)/100); 

      if (result > 1.0) 
      { 
       result -= 1.0; 
      } 

      return result; 
     } 
    } 

    class Program 
    { 
     static BitmapCompare SimpleCompare; 
     static Bitmap searchImage; 

     static private void Line() 
     { 
      for (int x = 0; x < Console.BufferWidth; x++) 
      { 
       Console.Write("*"); 
      } 
     } 

     static void CheckDirectory(string directory,double percentage,Bitmap sImage) 
     { 
      DirectoryInfo dir = new DirectoryInfo(directory); 
      FileInfo[] files = null; 
      try 
      { 
       files = dir.GetFiles("*.jpg"); 
      } 
      catch (DirectoryNotFoundException) 
      { 
       Console.WriteLine("Bad directory specified"); 
       return; 
      } 

      double sim = 0; 

      foreach (FileInfo f in files) 
      { 
       sim = Math.Round(SimpleCompare.GetSimilarity(sImage, new Bitmap(f.FullName)),3); 
       if (sim >= percentage) 
       { 
        Console.WriteLine(f.Name); 
        Console.WriteLine("Match of: {0}", sim); 
        Line(); 
       } 
      } 
     } 

     static void Main(string[] args) 
     { 
      SimpleCompare = new BitmapCompare(); 
      Console.Write("Enter path to search image: "); 
      try 
      { 
       searchImage = new Bitmap(Console.ReadLine()); 
      } 
      catch (ArgumentException) 
      { 
       Console.WriteLine("Bad file"); 
       return; 
      } 

      Console.Write("Enter directory to scan: "); 
      string dir = Console.ReadLine(); 
      Line(); 
      CheckDirectory(dir, 0.95 , searchImage);  //Display only images that match by 95% 
     } 
    } 
} 
+0

이 예제는 때로는 잘못된 결과를 제공합니다. – fyasar