Przetwarzanie ramek kamery Android z wielowątkowością
Używam OpenCV, Vuforia i Tesseract (tess-two) do mojej aplikacji. Mój system działa tak:
Vuforia wykrywa cel i wysyła pełną klatkę do OpenCV (JNI)OpenCV pobiera ramkę i przetwarza obraz, aby był czytelny dla Tesseract (JNI)Tesseract (tess-two) pobiera tablice bajtów z opencv i przetwarza OCR na obrazie (tablica bajtów)Mój problem zaczyna się od trzeciej części. Ponieważ moim celem jest wykonanie ocr w ramkach kamer w czasie rzeczywistym, staram się używać wielowątkowości, aby interfejs użytkownika był gładki i nie powodował spowolnienia obrazu z kamery na żywo.
Postanowiłem użyć AsyncTask do tego typu:
public void getFromNative(final byte[] imagedata, final int width,final int height,final byte [] typeData, final int typeWidth,final int typeHeight) {
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
ocr(imagedata, width, height,typeData,typeWidth,typeHeight);
return null;
}
}.execute();
}
Sprawia, że strumień kamery na żywo jest płynniejszy niż normalnie, w trybie pojedynczego wątku. Ale problem polega na tym, że uruchomienie tak wielu AsyncTask z powodu ramek kamery na żywo, nawet gdy odwracam kamerę od celu, nadal wykonuje OCR na wcześniej utworzonym AsycnTask i zwraca wyniki dla nich jeden po drugim. Oprócz AsyncTask próbowałem IntenService, ale wynik był taki sam.
Chcę zapytać, czy istnieje sposób na rozwiązanie tego problemu i usprawnienie procesu.
Dzięki