【发布时间】:2021-10-09 11:22:04
【问题描述】:
我正在开发一个应用程序,我想在其中实时识别文本。
一开始我使用的是 onTapListener,所以每当用户在屏幕上点击时,都会捕获当前帧,然后调用文本识别。
现在我想完全实时地执行此操作,这样用户就不会点击屏幕来捕获当前帧。但是每一帧都将被捕获,直到一个捕获的当前帧的文本被识别为止。
出于这个原因,我创建了一个全局布尔字段名locked,它初始化为false,我将它用作“储物柜”,稍后您会看到。
private boolean locked = false;
在方法onUpdateFrame(FrameTime frameTime)中,我使用了上面的全局变量locked。当第一个特征点被跟踪时,我“锁定”了更新。所以只有当前线程会捕获当前帧。如果识别出的数据为空,我会设置locked = true,这样下一帧就会被捕获。
这是我的代码
public void onUpdateFrame(FrameTime frameTime) {
Frame frame = arFragment.getArSceneView().getArFrame();
// If there is no frame, just return.
if (frame == null) {
return;
}
//Making sure ARCore is tracking some feature points, makes the augmentation little stable.
if(frame.getCamera().getTrackingState()==TrackingState.TRACKING && !locked) {
locked = true;
if (mProgressDialog == null) {
mProgressDialog = ProgressDialog.show(this, "Processing",
"OCR...", true);
} else {
mProgressDialog.show();
}
executor.execute(() -> {
Bitmap b = captureImage();
final String[] text = {getOCRResult(b)};
handler.post(() -> {
if(text[0] != null && !text[0].equals("")){
doSomething();
}
else{
locked = false;
}
}
但这不起作用。当检测到表面时,我的应用程序会立即崩溃。
我收到以下错误,该错误所涉及的 Toast 指的是我在 captureImage()
方法中拥有的 ToastE/AndroidRuntime: 致命异常: pool-1-thread-1 进程:opencv.org,PID:27860 java.lang.RuntimeException: 不能在没有调用 Looper.prepare() 的线程上吐司
我不明白我做错了什么。 我听说过信号量,这就是我问这个问题的原因。我应该使用信号量,我是否需要这样的东西才能让我的应用程序正常工作。据我了解,我随时需要一个线程来捕获当前帧。 有人可以帮我我有点迷路吗? 谢谢
【问题讨论】:
标签: multithreading android-studio ocr arcore android-multithreading