2011-11-10 18 views
6

Hem OpenCv hem StackOverflow için yeni ve Android programlamaya yeni geliyorum, bu yüzden lütfen sorularım aptalca özür dilerim.Android'de OpenCv: dosyadan görüntülerdeki anahtar nokta algılama

Kameranın görüntüsüne daha çok benzeyen hangi görüntü dosyasının olduğunu görmek için, fotoğraf makinesinden alınan bir görüntüyü bazı görüntü dosyalarıyla eşleştirmeye çalışıyorum. Bu yüzden ben onları tanımlamak için dosya görüntüsünün ve SURF ile kamera görüntüsünün (SIFT denedim) anahtar noktalarını almak için DescriptorExtractor.compute kullanıyorum ama ... dosya görüntüsüne uygulanan yöntem her zaman boş bir anahtar noktası listesi döndürür Bunu kamera görüntüsünde kullanırsam, her zaman boş olmayan bir liste alırım (ortalamada yüz puan). Beni en çok şaşırtan şey, kameradan ilk olarak yüklenen ve aynı zamanda dosyadan yüklenen, aynı görüntüyü kullanmanın bile, bu davranışa sahip olduğudur.

Neyi yanlış yaptığımı bulmama yardım eder misiniz? İşte bazı test kodları (sadece dosya bölümü için değil, aynı zamanda kameradan da anahtar noktaları almak için aynı yöntemi kullanıyorum).

public class HelloOpenCvActivity extends Activity { 
    private static final int FILE_REQUEST = 400; 
    /** Called when the activity is first created. */ 

    ImageView img; 
    TextView txt; 
    Bitmap logo; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     img = (ImageView) findViewById(R.id.image); 
     txt = (TextView) findViewById(R.id.kp); 

     img.setOnClickListener(new OnClickListener() { 

      public void onClick(View v) { 
       chooseFile();    
      } 
     }); 
    } 

    private void chooseFile(){ 
     Intent fileIntent = new Intent(Intent.ACTION_GET_CONTENT); 
     fileIntent.addCategory(Intent.CATEGORY_OPENABLE); 
     fileIntent.setType("image/*"); 
     startActivityForResult(Intent.createChooser(fileIntent,"prova"), FILE_REQUEST); 
    } 

    /*Quando ho il risultato della chiamata al file explorer, viene invocata questa callback */ 
    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (requestCode == FILE_REQUEST) { 
      // obtain the filename 
      Uri uri = data.getData(); 
      String filePath = null; 
      if (uri != null) { 
       if (uri.toString().startsWith("file:")) { 
        filePath = uri.getPath(); 
       } else { // uri.startsWith("content:") 
        Cursor c = getContentResolver().query(uri, null, null, null, null); 
        if (c != null && c.moveToFirst()) { 
         int id = c.getColumnIndex(Images.Media.DATA); 
         if (id != -1) { 
          filePath = c.getString(id); 
         } 
        } 
       } 
      } 
      if (filePath != null) { 
       logo = BitmapFactory.decodeFile(filePath); 
       img.setImageBitmap(logo); 
       txt.setText(""+getKp(logo).size()); 
      } 
     } 
    } 

    private List<KeyPoint> getKp(Bitmap bm){ 
     Mat image = Utils.bitmapToMat(bm); 

     List<KeyPoint> kp = new ArrayList<KeyPoint>(); 
     FeatureDetector fd = FeatureDetector.create(FeatureDetector.SURF); 
     fd.detect(image, kp); 


     return kp; 
    } 

} 

Çok teşekkür ederim.

araştırma ve baş ağrısı saat sonra Ale

cevap

12

;-) Ben sorunu bulduk. Fotoğraf makinesinden ve dosyadan alınan görüntüler hem bitmap nesnelerine kaydedilebilir, ancak yapılandırmaları (Bitmap.Config) farklıdır: Kamera görüntüleri için ARGB_8888 ve dosya olanlar için RGB_565. Dosya resimlerindeki bitmap yapılandırmasını Bitmap.copy yöntemiyle ARGB_8888 olarak değiştirmek çözümdür. Bu aynı konu haline çalışır kimseye yardımcı olabilir

private List<KeyPoint> getKp(Bitmap bm){ 
    //scale bitmap (otherwise the program crashes due to memory lack) 
    int MAX_DIM = 300; 
    int w, h;  
    if (bm.getWidth() >= bm.getHeight()){ 
     w = MAX_DIM; 
     h = bm.getHeight()*MAX_DIM/bm.getWidth(); 
    } 
    else{ 
     h = MAX_DIM; 
     w = bm.getWidth()*MAX_DIM/bm.getHeight(); 
    } 
    bm = Bitmap.createScaledBitmap(bm, w, h, false); 

    //change bitmap config <- THAT'S THE POINT! 
    Bitmap img = bm.copy(Bitmap.Config.ARGB_8888, false);   

    Mat image = Utils.bitmapToMat(img); 

    List<KeyPoint> kp = new ArrayList<KeyPoint>(); 
    FeatureDetector fd = FeatureDetector.create(FeatureDetector.SURF); 
    fd.detect(image, kp); 

    return kp; 
} 

Umut. :-)

+0

Gitmek bir çekicilik gibi çalışır! –