[英]Android Camera Frame processing with MultiThreading
我正在為我的應用程序使用OpenCV,Vuforia和Tesseract(tess-two)。 我的系統是這樣的:
我的問題從第三部分開始。 由於我的目標是在實時攝像機幀上進行ocr,因此我試圖使用多線程來使UI平滑,而不是使實時攝像機的視覺變慢。
我決定像這樣使用AsyncTask:
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();
}
與普通的單線程方式相比,它使實時攝像頭流更流暢。 但是問題在於,由於它具有實時攝影機幀,因此啟動了許多AsyncTask,即使我將攝影機從目標位置移開,它也會繼續對先前創建的AsycnTask進行OCR,並逐一返回結果。 除了AsyncTask,我嘗試了IntenService,但結果是相同的。
我想問一下是否有辦法解決這個問題並使過程更有效。
謝謝
我建議您不要嘗試識別相機peview提取的每一幀。 我們使用了類似於以下onPreviewFrame-method:
public final void onPreviewFrame(final byte[] data, final Camera camera) {
this.data = data;
now = Calendar.getInstance().getTimeInMillis();
if (now - lastRecognitionTime > TIME_BETWEEN_RECOGNITION_STARTS_IN_MILLIS) {
lastRecognitionTime = now;
startRecognition(); // here you can start your async task
}
}
這意味着識別過程僅每隔幾個預覽幀開始一次,具體取決於您配置TIME_BETWEEN_RECOGNITION_STARTS_IN_MILLIS的方式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.