OpenCV / Android BufferQueue Erreur: La Texture De La Surface A Été Abandonné
Nouvelle pour Android et OpenCV. Essayé d'implémenter du code du nouveau livre, Mastering OpenCV avec la Pratique de la Vision par Ordinateur des Projets. L'application fondamentalement rend cartoonified images de prévisualisation de la caméra à l'aide d'OpenCV. Vous pouvez toucher l'écran pour enregistrer le cartoonified image.
Code Source à partir d'auteurs est situé ici.
J'ai fait une petite modification (voir ci-dessous) pour CartoonifierApp.java fichier afin que je puisse charge statique la cartoonifier de la bibliothèque avec la OpenCV Manager application (le code d'origine jeta un UnsatisfiedLinkError).
Le problème que je me pose, c'est que lorsque je charge l'application sur mon Galaxy Nexus (Android 4.1.1), je reçois un vide noir de l'écran. Mon LogCat dit:
E/BufferQueue(4744): [sans nom-4744-0] setBufferCount: SurfaceTexture
a été abandonné! E/Cartoonifier::SurfaceView(4744):
startPreview() a échoué
Je pense que c'est un problème de mémoire. Je sais que le rpc code fonctionne, car il fonctionne très bien par lui-même sur mon ordinateur, bien que le rendu est lent sur un relativement nouveau pc portable (Asus U46E).
Je n'ai aucune idée de comment résoudre ce problème. Le seul conseil utile que j'ai trouvé était ici. Si je remplace mon setPreview méthode CatoonifierVewBase.java
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
mCamera.setPreviewTexture( new SurfaceTexture(10) );
else
mCamera.setPreviewDisplay(null);
avec
mCamera.setPreviewDisplay(mHolder);
puis ce qui se passe est la caméra fonctionne comme d'habitude et je peux enregistrer cartoonified images en touchant l'écran. Notez que ce n'est pas exactement le résultat souhaité que je veux continuellement cartoonify image de prévisualisation de la caméra. L'appareil photo ne fonctionne que parce que je n'écris pas à la surface d'affichage (du moins c'est ma compréhension). La réponse dans le mentionné précédemment site a certains solution de contournement, mais je n'ai aucune idée de quoi il parle.
BTW j'ai essayé tous les échantillons de OpenCV4Android apps et ils fonctionnent très bien. Aussi, je suis en utilisant OpenCV version 2.4.3. API niveau de la cible est de 15.
Plein Logcat:
12-22 15:33:07.966: I/CartoonifierApp(5999): Instancié nouvelle classe
com.Cartoonifier.CartoonifierApp 12-22 15:33:07.966:
J'/CartoonifierApp(5999): appelé onCreate 12-22 15:33:07.966:
J'/CartoonifierApp(5999): tentative de chargement de la bibliothèque OpenCV 12-22
15:33:07.982: I/Cartoonifier::SurfaceView(5999): Instancié nouveau
classe com.Cartoonifier.CartoonifierView 12-22 15:33:07.990:
J'/CartoonifierApp(5999): onResume 12-22 15:33:07.990:
J'/Cartoonifier::SurfaceView(5999): openCamera 12-22 15:33:07.990:
J'/Cartoonifier::SurfaceView(5999): releaseCamera 12-22 15:33:08.099:
D/OpenCVManager/Helper(5999): Service de connexion créé 12-22
15:33:08.099: D/OpenCVManager/Helper(5999): Essayer d'obtenir le chemin de bibliothèque
12-22 15:33:08.138: D/OpenCVManager/Helper(5999): Essayer d'obtenir
liste des bibliothèques 12-22 15:33:08.169: D/OpenCVManager/Helper(5999): Bibliothèque
liste: "" 12-22 15:33:08.169: D/OpenCVManager/Helper(5999): Première
essayez de charger des libs 12-22 15:33:08.169: D/OpenCVManager/Helper(5999):
En essayant d'init OpenCV libs 12-22 15:33:08.169:
D/OpenCVManager/Helper(5999): tentative de chargement de la bibliothèque
/data/data/org.opencv.moteur/lib/libopencv_java.donc, 12-22 15:33:08.169:D/dalvikvm(5999): Essayer de charger lib
/data/data/org.opencv.moteur/lib/libopencv_java.donc 0x41936a40 12-2215:33:08.193: D/dalvikvm(5999): Ajout d'partagé lib
/data/data/org.opencv.moteur/lib/libopencv_java.donc 0x41936a40 12-2215:33:08.193: D/OpenCVManager/Helper(5999): OpenCV libs init était ok!
12-22 15:33:08.193: D/OpenCVManager/Helper(5999): Première tentative de
charge libs est OK 12-22 15:33:08.193: D/OpenCVManager/Helper(5999): Init
fini avec le statut de 0 12-22 15:33:08.193:
D/OpenCVManager/Helper(5999): supprimer la liaison de service 12-22 15:33:08.200:
D/OpenCVManager/Helper(5999): l'Appel à l'aide de rappel 12-22
15:33:08.200: I/CartoonifierApp(5999): OpenCV chargé avec succès12-22 15:33:08.200: D/dalvikvm(5999): Essayer de charger lib
/data/data/com.Cartoonifier/lib/libcartoonifier.donc 0x41936a40 12-2215:33:08.200: D/dalvikvm(5999): Ajout d'partagé lib
/data/data/com.Cartoonifier/lib/libcartoonifier.donc 0x41936a40 12-2215:33:08.200: D/dalvikvm(5999): Pas de JNI_OnLoad trouvé dans
/data/data/com.Cartoonifier/lib/libcartoonifier.donc 0x41936a40,
ignorant l'initialisation 12-22 15:33:08.200: D/OpenCVManager/Helper(5999):
Service de connexion créé 12-22 15:33:08.200:
D/OpenCVManager/Helper(5999): Essayer d'obtenir le chemin de bibliothèque 12-2215:33:08.232: D/OpenCVManager/Helper(5999): Essayer d'obtenir la liste de la bibliothèque
12-22 15:33:08.271: D/OpenCVManager/Helper(5999): liste des bibliothèques: ""12-22 15:33:08.271: D/OpenCVManager/Helper(5999): Première tentative de
charge libs 12-22 15:33:08.271: D/OpenCVManager/Helper(5999): tentative deinit OpenCV libs 12-22 15:33:08.271: D/OpenCVManager/Helper(5999):
Essayer de charger la bibliothèque de
/data/data/org.opencv.moteur/lib/libopencv_java.donc, 12-22 15:33:08.271:
D/dalvikvm(5999): Essayer de charger lib
/data/data/org.opencv.moteur/lib/libopencv_java.donc 0x41936a40 12-2215:33:08.271: D/dalvikvm(5999): Partagé lib
'/data/data/org.opencv.moteur/lib/libopencv_java.si " déjà chargé dans
même CL 0x41936a40 12-22 15:33:08.271: D/OpenCVManager/Helper(5999):
OpenCV libs init était ok! 12-22 15:33:08.271:
D/OpenCVManager/Helper(5999): Première tentative de chargement d'libs est OK12-22 15:33:08.271: D/OpenCVManager/Helper(5999): Init terminé avec le statut de 0
12-22 15:33:08.271: D/OpenCVManager/Helper(5999): supprimer la liaison de service
12-22 15:33:08.271: D/OpenCVManager/Helper(5999): l'Appel à l'aide de rappel
12-22 15:33:08.271: I/CartoonifierApp(5999): OpenCV chargé avec succès
12-22 15:33:08.279: D/dalvikvm(5999): Essayer de charger lib /data/data/com.Cartoonifier/lib/libcartoonifier.donc 0x41936a40
12-22 15:33:08.279: D/dalvikvm(5999): Partagé lib '/data/data/com.Cartoonifier/lib/libcartoonifier.si " déjà chargé dans les mêmes CL 0x41936a40
12-22 15:33:08.302: I/Cartoonifier::SurfaceView(5999): surfaceCreated
12-22 15:33:08.302: I/Cartoonifier::SurfaceView(5999): surfaceChanged(). La taille de la fenêtre: 1196x670
12-22 15:33:08.302: I/Cartoonifier::SurfaceView(5999): setupCamera(1196x670)
12-22 15:33:08.302: I/Cartoonifier::SurfaceView(5999): à Partir thread de traitement
12-22 15:33:08.310: I/Cartoonifier::SurfaceView(5999): Trouvé Appareil photo de Résolution de 1920 x 1080
12-22 15:33:08.310: I/Cartoonifier::SurfaceView(5999): Trouvé Appareil photo de Résolution de 1280x720
12-22 15:33:08.310: I/Cartoonifier::SurfaceView(5999): Trouvé la Résolution de la Caméra 960x720
12-22 15:33:08.310: I/Cartoonifier::SurfaceView(5999): Trouvé Caméra Résolution de 800x480
12-22 15:33:08.310: I/Cartoonifier::SurfaceView(5999): Trouvé la Résolution de la Caméra 720x576
12-22 15:33:08.310: I/Cartoonifier::SurfaceView(5999): Trouvé Appareil photo de Résolution de 720x480
12-22 15:33:08.310: I/Cartoonifier::SurfaceView(5999): Trouvé la Résolution de la Caméra 768x576
12-22 15:33:08.310: I/Cartoonifier::SurfaceView(5999): Trouvé la Résolution de la Caméra 640 x 480
12-22 15:33:08.310: I/Cartoonifier::SurfaceView(5999): Trouvé Appareil photo de Résolution de 320x240
12-22 15:33:08.310: I/Cartoonifier::SurfaceView(5999): Trouvé la Résolution de la Caméra 352x288
12-22 15:33:08.310: I/Cartoonifier::SurfaceView(5999): Trouvé la Résolution de la Caméra 240x160
12-22 15:33:08.310: I/Cartoonifier::SurfaceView(5999): Trouvé la Résolution de la Caméra 176x144
12-22 15:33:08.310: I/Cartoonifier::SurfaceView(5999): Trouvé la Résolution de la Caméra 128x96
12-22 15:33:08.318: I/Cartoonifier::SurfaceView(5999): Choisi Aperçu de l'Appareil photo Taille: 1280 x 720
12-22 15:33:08.333: D/dalvikvm(5999): GC_FOR_ALLOC libéré 131K, 2% gratuit 10807K/11011K, pause 13ms, total 13ms12-22 15:33:08.333: I/dalvikvm-tas(5999): la croissance des tas (frag) de la 11.902 MO pour 1382416-allocation d'octets
12-22 15:33:08.357: D/dalvikvm(5999): GC_CONCURRENT libéré 1K, 3% gratuit 12156K/12423K, pause 12 ms+1 ms, le total des 24ms
12-22 15:33:08.357: D/dalvikvm(5999): WAIT_FOR_CONCURRENT_GC bloqué 11 ms
12-22 15:33:08.365: D/dalvikvm(5999): GC_FOR_ALLOC libéré 0K, 3% gratuit 12156K/12423K, pause 9ms, total 9ms
12-22 15:33:08.372: I/dalvikvm-tas(5999): la croissance des tas (frag) de la 13.219 MO pour 1382416-allocation d'octets
12-22 15:33:08.388: D/dalvikvm(5999): GC_CONCURRENT libéré 0K, 3% gratuit 13506K/13831K, pause 11 ms+1 ms, le total des 21ms
12-22 15:33:08.388: D/dalvikvm(5999): WAIT_FOR_CONCURRENT_GC bloqué 7ms
12-22 15:33:08.404: D/dalvikvm(5999): GC_FOR_ALLOC libérés <1K, 3% gratuit 13506K/13831K, pause 9ms, total de 10 ms
12-22 15:33:08.411: I/dalvikvm-tas(5999): la croissance des tas (frag) de la 16.735 MO pour 3686416-allocation d'octets
12-22 15:33:08.427: D/dalvikvm(5999): GC_CONCURRENT libérés <1K, 3% gratuit 17106K/17479K, pause 12 ms+1 ms, le total des 22ms
12-22 15:33:08.427: D/dalvikvm(5999): WAIT_FOR_CONCURRENT_GC bloqué 10ms
12-22 15:33:08.443: D/dalvikvm(5999): GC_FOR_ALLOC libérés <1K, 3% gratuit 17106K/17479K, pause de 10 ms, le total des 10ms
12-22 15:33:08.450: I/dalvikvm-tas(5999): la croissance des tas (frag) de 20.250 MO pour 3686416-allocation d'octets
12-22 15:33:08.466: D/dalvikvm(5999): GC_CONCURRENT libéré 0K, 2% gratuit 20706K/21127K, pause 12 ms+2ms, total 22ms
12-22 15:33:08.466: D/dalvikvm(5999): WAIT_FOR_CONCURRENT_GC bloqué 5ms
12-22 15:33:08.466: I/Cartoonifier::SurfaceView(5999): début aperçu
12-22 15:33:08.497: E/BufferQueue(5999): [sans nom-5999-0] setBufferCount: SurfaceTexture a été abandonné!
12-22 15:33:08.505: E/Cartoonifier::SurfaceView(5999): mCamera.startPreview() a échoué
Extrait de CartoonifierApp.java montrer ma modification
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
switch (status) {
case LoaderCallbackInterface.SUCCESS:
{
Log.i(TAG, "OpenCV loaded successfully");
//Load native library after(!) OpenCV initialization
System.loadLibrary("cartoonifier");
} break;
default:
{
super.onManagerConnected(status);
} break;
}
}
};
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
Log.i(TAG, "called onCreate");
super.onCreate(savedInstanceState);
Log.i(TAG, "Trying to load OpenCV library");
if (!OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_3, this, mLoaderCallback))
{
Log.e(TAG, "Cannot connect to OpenCV Manager");
}
requestWindowFeature(Window.FEATURE_NO_TITLE);
mView = new CartoonifierView(this);
setContentView(mView);
//Call our "onTouch()" callback function whenever the user touches the screen.
mView.setOnTouchListener(this);
}
@Override
protected void onPause() {
Log.i(TAG, "onPause");
super.onPause();
mView.releaseCamera();
}
@Override
public void onResume()
{
super.onResume();
Log.i(TAG, "onResume");
if (!OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_3, this, mLoaderCallback))
{
Log.e(TAG, "Cannot connect to OpenCV Manager");
}
if( !mView.openCamera() ) {
AlertDialog ad = new AlertDialog.Builder(this).create();
ad.setCancelable(false); //This blocks the 'BACK' button
ad.setMessage("Fatal error: can't open camera!");
/*ad.setButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
finish();
}
}); */
ad.show();
}
}
Vous devez vous connecter pour publier un commentaire.
Ce problème a été workarounded dans OpenCV il y a quelques temps.
Ne sais pas si c'est l'application ou du système d'exploitation de bug. Le problème est que l'appel à
Bitmap.createBitmap
détacheSurfaceTexture
objet utilisé à des fins de visualisation.La solution est de modifier le setupCamera méthode de la base
View
de classe et changementà
(l'ordre des lignes est changé)