2015-08-25 6 views
0

Я работаю над андроидным приложением, которое работает над обработкой изображений с использованием определенных алгоритмов MSE и SSI для сравнения структуры изображений.все файлы изображений из папки для обработки

У меня есть рабочий код, который позволяет мне выбрать два изображения из выбранной папки и выполнить необходимые операции над ними, однако следующий шаг - позволить пользователю выбрать папку, которая автоматически считывает все изображения и выполняет требуемые операции и сохранить изображения, которые, как считается, похожи.

У меня есть следующий код, но в тот момент, когда он работает с изображениями, и в конечном итоге это приведет к ошибке таймаута.

Есть ли что-то, что я делаю неправильно, или что я должен измениться, чтобы это работало плавно. В папке содержится 172 изображения, которые необходимо обработать.

public void addItemsOnSpinner() { 
    spinner1 = (Spinner) findViewById(R.id.spinner); 
    List<String> list = new ArrayList<String>(); 
    list.add("New images"); 
    list.add("All downloads"); 
    list.add("Bluetooth"); 
    list.add("Camera shots"); 
    ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this, 
      android.R.layout.simple_spinner_item, list); 
    dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    spinner1.setAdapter(dataAdapter); 
    selection = String.valueOf(spinner1.getSelectedItem()); 
} 

@Override 
public void onClick(View v) { 
    int n =0; 
    if (v == submit) { 
     for (int i = 1; i <= 172; i++) { 
      for (int j = 1; j <= 172; j++) { 
       absoluteFilePath = folder + "/" + selection + "/image" + i + ".bmp"; 
       bMap1 = BitmapFactory.decodeFile(absoluteFilePath); 
       absoluteFilePath2 = folder + "/" + selection + "/image" + j + ".bmp"; 
       bMap2 = BitmapFactory.decodeFile(absoluteFilePath2); 
       Toast.makeText(LoadFile.this, "Comparing Image" + i + " against Image" + j, 
         Toast.LENGTH_SHORT).show(); 
       //loop through each image compare image by image 
       calculateMSE(bMap1, bMap2, 256, 256); 
       calculateSSI(bMap1, bMap2, 4); 
       //calculateSSI(bMap1, bMap2, 8); 
       //calculateSSI(bMap1, bMap2, 16); 
       //calculateSSI(bMap1, bMap2, 32); 
       //if images are similar save file paths to array 
       if(calculateMSE(bMap1, bMap2, 256, 256) <= 0.4 && calculateSSI(bMap1, bMap2, 4) >= 0.6){ 
        ImageView image1 = (ImageView) findViewById(R.id.imgView); 
        image1.setImageBitmap(bMap1); 
        ImageView image2 = (ImageView) findViewById(R.id.imgView2); 
        image2.setImageBitmap(bMap2); 

        //saving file path to array 
        bitmapArray1 [n] = bMap1; 
        bitmapArray2 [n] = bMap2; 
        n++; 
       } 
+0

Try с меньшим количеством изображений. Если это работает, очень возможно, что у вас заканчивается память –

+0

Просьба предоставить LogCat вывод ошибки. – Fildor

+0

', который позволяет мне выбрать два изображения из выбранной папки. Если вам нужны образы два на два, то как вы можете выбрать их из списка каталогов? «в минуту он работает через изображения» ??? Пожалуйста, объясните, что вы имеете в виду. ', и это будет в конечном итоге через ошибку времени.'. Пожалуйста, лучше объясните, что произойдет. – greenapps

ответ

0

Возможно, вы много работаете над потоком пользовательского интерфейса для вычислений. Запустите программу AsyncTask, чтобы запустить фоновый поток. Обновите пользовательский интерфейс для обновления и завершения.

Типичное применение:

// in your onclick method. in function if(v == submit) 
new AsyncTask(n, bitmapArray1, bitmapArray2).execute(); 

// in AsyncTask class 
public AsyncTask extends AsyncTask< Boolean, Boolean, Void) 
{ 

int n; 
Bitmap[] bitmapArray1, bitmapArray2; 

public AsyncTask (int n, Bitmap[] bitmapArray1, Bitmap[] bitmapArray2) 
{ 
    this.n = n; 
    this.bitmapArray1 = bitmapArray1; 
    this.bitmapArray2 = bitmapArray2; 
} 

@Override 
protected void onPreExecute() 
{} 

@Override 
protected void onPostExecute(Boolean bool) 
{ 
    if (bool) 
    { 
    ImageView image1 = (ImageView) findViewById(R.id.imgView); 
       image1.setImageBitmap(bMap1); 
       ImageView image2 = (ImageView) findViewById(R.id.imgView2); 
       image2.setImageBitmap(bMap2); 

       //saving file path to array 
       bitmapArray1 [n] = bMap1; 
       bitmapArray2 [n] = bMap2; 
    } 
} 

@Override 
protected void onProgressUpdate(Bitmap result) 
{ 
    // update UI here. 
    // best UI update is the progressbar. 
    Toast.makeText(LoadFile.this, "Comparing Image" + i + " against Image" + j,Toast.LENGTH_SHORT).show(); 
} 

@Override 
protected Boolean doInBackground(Void... params) 
{ 
    for (int i = 1; i <= 172; i++) { 
     for (int j = 1; j <= 172; j++) { 
      absoluteFilePath = folder + "/" + selection + "/image" + i + ".bmp"; 
      bMap1 = BitmapFactory.decodeFile(absoluteFilePath); 
      absoluteFilePath2 = folder + "/" + selection + "/image" + j + ".bmp"; 
      bMap2 = BitmapFactory.decodeFile(absoluteFilePath2); 

      //loop through each image compare image by image 
      calculateMSE(bMap1, bMap2, 256, 256); 
      calculateSSI(bMap1, bMap2, 4); 
      //calculateSSI(bMap1, bMap2, 8); 
      //calculateSSI(bMap1, bMap2, 16); 
      //calculateSSI(bMap1, bMap2, 32); 
      //if images are similar save file paths to array 
      if(calculateMSE(bMap1, bMap2, 256, 256) <= 0.4 && calculateSSI(bMap1, bMap2, 4) >= 0.6){ 
       n++; 
       return true; 
      } else 
       return false; 
      } 
     } 
    } 
     return null; 
} 
} 
Смежные вопросы