#java #android #image-processing #camera #raspberry-pi3
Вопрос:
Я разрабатываю приложение camerax для случая использования анализа изображений. Я собрал его и запустил на своем телефоне, и он отлично работал. Я также попробовал это на нескольких других телефонах, и на них это тоже сработало. На самом деле мы планируем использовать приложение на нашем raspberry pi 3B, в котором установлены линейки и подключены необходимые камеры, а также мы пробовали запускать другие приложения, использующие камеру, и оно отлично работало. Но когда я запустил наше приложение, оно запустилось, показало анимацию, которую должно было показывать, и больше ничего не произошло, как будто приложение не рухнуло, мы также заметили, что камера несколько раз включалась и выключалась, но это все. Из журналов я мог видеть, что приложение никогда не запускает код в блоке setAnalyzer (). Вот код для соответствующей части.
model=new LocalModel.Builder()
.setAssetFilePath("model.tflite")
.build();
CustomImageLabelerOptions customImageLabelerOptions=new CustomImageLabelerOptions.Builder(model)
.setConfidenceThreshold(.98f)
.setMaxResultCount(1)
.build();
labeler= ImageLabeling.getClient(customImageLabelerOptions);
analysis=new ImageAnalysis.Builder().setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
.setTargetResolution(new Size(1280, 720))
.build();
Log.i(TAG, "before the analysis starts");
analysis.setAnalyzer(ContextCompat.getMainExecutor(this), image -> {
Log.i(TAG, "Analysis started");
int rotationDegrees = image.getImageInfo().getRotationDegrees();
@SuppressLint("UnsafeOptInUsageError") Image mediaImage=image.getImage();
if(mediaImage!=null){
InputImage i=InputImage.fromMediaImage(mediaImage, rotationDegrees);
labeler.process(i).addOnSuccessListener(new OnSuccessListener<List<ImageLabel>>() {
@Override
public void onSuccess(@NonNull @NotNull List<ImageLabel> imageLabels) {
Log.i(TAG, "successfully started to process the image");
String labels="";
for(ImageLabel label: imageLabels){
Log.i(TAG, label.getText());
labels=label.getText();
Log.i(TAG, labels);
}
if(labels.equalsIgnoreCase("dew")) {
isDetectingBottles=true;
d.stop();
imageView.setBackgroundResource(R.drawable.unnffffamed);
}
else{
if(isDetectingBottles){
isDetectingBottles=false;
imageView.setBackgroundResource(R.drawable.blink_animation);
d= (AnimationDrawable) imageView.getBackground();
d.start();
}
}
image.close();
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull @NotNull Exception e) {
Log.i(TAG, "ImageLabeling process failed");
e.printStackTrace();
image.close();
}
});
}
});
CameraSelector selector= CameraSelector.DEFAULT_BACK_CAMERA;
Log.i(TAG, "before binding to lifecycle");
ListenableFuture<ProcessCameraProvider> m=ProcessCameraProvider.getInstance(this);
m.addListener(new Runnable() {
@Override
public void run() {
try {
m.get().bindToLifecycle((LifecycleOwner) MainActivity.this, selector, analysis);
}
catch(InterruptedException e){
e.printStackTrace();
}
catch(ExecutionException e){
e.printStackTrace();
}
}
}, ContextCompat.getMainExecutor(this));
Вот несколько вещей, которые я попробовал:
- В начале я не устанавливал никакого целевого разрешения и оставил его на camerax, но тогда это все еще не работало.
- Я пробовал использовать разные камеры с селектором, использование фронтальной камеры приводит к сбою.
- Попытался вызвать image.close() в конце блока setAnalyzer, но это, очевидно, не проблема, так как он работает на других устройствах.
ПРИМЕЧАНИЕ: журналы не показывают никаких исключений, чтобы я мог понять, что происходит.
Комментарии:
1. что произойдет, если вы переоденетесь
ContextCompat.getMainExecutor(this)
analysis.setAnalyzer(ContextCompat.getMainExecutor(this), image -> {
сExecutors.newSingleThreadExecutor()
?2. никаких изменений, все так же ведет себя