J'utilise OpenCV pour adaptiveThreshold. Mon code pour le traitement des images avec OpenCV est le suivant:
imageMat=new Mat();
Utils.bitmapToMat(bmp, imageMat);
Imgproc.cvtColor(imageMat, imageMat, Imgproc.COLOR_BGR2GRAY);
Imgproc.GaussianBlur(imageMat, imageMat, new Size(3, 3), 0);
Imgproc.adaptiveThreshold(imageMat, imageMat, 255,Imgproc.ADAPTIVE_THRESH_MEAN_C, Imgproc.THRESH_BINARY_INV, 5, 4);
Mais je reçois une erreur en déclarant Mat. Comme:
No implementation found for long org.opencv.core.Mat.n_Mat() (tried Java_org_opencv_core_Mat_n_1Mat and Java_org_opencv_core_Mat_n_1Mat__)
at org.opencv.core.Mat.n_Mat(Native Method)
at org.opencv.core.Mat.<init>(Mat.Java:24)
at com.example.pial_pc.instantbookreview.ImageCapture$3.onPictureTaken(ImageCapture.Java:105)
En tant que nouveau dans OpenCV, je ne comprends pas très bien l'erreur. Toute la classe Java à laquelle appartient ce code est ici .
Que dois-je faire pour éliminer l'erreur?
J'ai réussi à éliminer l'erreur et mon application ne se bloque pas lors de l'exécution de cette ligne imageMat=new Mat();
La raison de cette erreur est qu'Android appelle la méthode "onCreate" avant de charger la bibliothèque OpenCV4Android. J'ai donc utilisé l'initialisation async d'OpenCV à l'aide de OpenCVManager. J'ai créé BaseLoaderCallback avant la méthode onCreate. Et à l'intérieur de cela j'ai déclaré new Mat () comme ceci:
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
switch (status) {
case LoaderCallbackInterface.SUCCESS:
{
Log.i("OpenCV", "OpenCV loaded successfully");
imageMat=new Mat();
} break;
default:
{
super.onManagerConnected(status);
} break;
}
}
};
Ensuite, dans onResume (), j’ai vérifié si la bibliothèque OpenCV avait été chargée et initialisée à partir du package d’application en cours ou non. Les codes sont les suivants:
public void onResume()
{
super.onResume();
if (!OpenCVLoader.initDebug()) {
Log.d("OpenCV", "Internal OpenCV library not found. Using OpenCV Manager for initialization");
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_0_0, this, mLoaderCallback);
} else {
Log.d("OpenCV", "OpenCV library found inside package. Using it!");
mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
}
}
Et mon erreur est parti. Ma classe Java entièrement mise à jour est ici .
Liens de référence:
Initialiser la bibliothèque openCV dans votre activité Ajouter ce code avant la méthode onCreate ()
static {
if (!OpenCVLoader.initDebug()) {
// Handle initialization error
}
}
ajoutez cette lib dans votre projet: https://github.com/hschott/Camdroid
Peut-être oubliez-vous d'inclure la bibliothèque openCV.
Comprendre
static {
System.loadLibrary("opencv_Java");
}
pour OpenCV version 3, vous devriez plutôt ajouter:
static {
System.loadLibrary("opencv_Java3");
}
Bonne chance :)