2016-10-20 3 views
0

Je travaille avec OpenCV4Android version 2.4.11, et j'essaye de détecter des cornrs dans l'image. Pour ce faire, j'utilise Harris détecteur de coin. Le problème auquel je suis confronté est, après avoir détecté les coins dans l'image comme indiqué ci-dessous dans le code Je veux afficher l'image qui contient les coins détectés après la conversion en Bitmap , mais je reçois l'erreur ci-dessous posté.convertir un Mat en Bitmap provoque une erreur

l'étape 1 et l'étape 2 sont exécutées sans erreur, mais lorsque j'exécute l'étape 3, j'obtiens l'erreur logcat affichée.

Veuillez nous faire savoir pourquoi je reçois cette erreur et comment y remédier?

Code:

//step 1 
this.mMatGray = new Mat(); 
Imgproc.cvtColor(this.mMatInputFrame, this.mMatGray, Imgproc.COLOR_BGR2GRAY); 

//step 2 
Imgproc.cornerHarris(mMatGray,mMatGray,3,3,3,1); 

//step 3 
final Bitmap bitmap = Bitmap.createBitmap(mMatInputFrame.cols(), mMatInputFrame.rows(), Bitmap.Config.ARGB_8888); 
Utils.matToBitmap(mMatGray, bitmap); 
getActivity().runOnUiThread(new Runnable() { 
@Override 
public void run() { 
mIVEdges.setImageBitmap(bitmap); 
    } 
}); 

erreur:

OpenCV Error: Assertion failed (src.type() == CV_8UC1 || src.type() == CV_8UC3 || src.type() == CV_8UC4) in void Java_org_opencv_android_Utils_nMatToBitmap2(JNIEnv*, jclass, jlong, jobject, jboolean), file /hdd2/buildbot/slaves/slave_ardbeg1/50-SDK/opencv/modules/java/generator/src/cpp/utils.cpp, line 98 
E/org.opencv.android.Utils: nMatToBitmap catched cv::Exception: /hdd2/buildbot/slaves/slave_ardbeg1/50-SDK/opencv/modules/java/generator/src/cpp/utils.cpp:98: error: (-215) src.type() == CV_8UC1 || src.type() == CV_8UC3 || src.type() == CV_8UC4 in function void Java_org_opencv_android_Utils_nMatToBitmap2(JNIEnv*, jclass, jlong, jobject, jboolean) 
E/AndroidRuntime: FATAL EXCEPTION: Thread-2477 
Process: com.example.cornerdetection_00, PID: 22407 
CvException [org.opencv.core.CvException: /hdd2/buildbot/slaves/slave_ardbeg1/50-SDK/opencv/modules/java/generator/src/cpp/utils.cpp:98: error: (-215) src.type() == CV_8UC1 || src.type() == CV_8UC3 || src.type() == CV_8UC4 in function void Java_org_opencv_android_Utils_nMatToBitmap2(JNIEnv*, jclass, jlong, jobject, jboolean) 
] 
at org.opencv.android.Utils.nMatToBitmap2(Native Method) 
at org.opencv.android.Utils.matToBitmap(Utils.java:123) 
at org.opencv.android.Utils.matToBitmap(Utils.java:132) 
at com.example.cornerdetection_00.FragOpenCVCam.cornerHarris(FragOpenCVCam.java:204) 
at com.example.cornerdetection_00.FragOpenCVCam.onCameraFrame(FragOpenCVCam.java:159) 
at org.opencv.android.CameraBridgeViewBase.deliverAndDrawFrame(CameraBridgeViewBase.java:387) 
at org.opencv.android.JavaCameraView$CameraWorker.run(JavaCameraView.java:346) 

Update1:

maintenant après avoir testé le code suivant fourni par "Mikka Marmik" je reçois les erreurs ci-dessous

Code:

Mat mMatGray = new Mat(); 
Imgproc.cvtColor(mMatGray, mMatGray, Imgproc.COLOR_BGR2GRAY); 
//step 2 
Imgproc.cornerHarris(mMatGray,mMatGray,3,3,3,1); 
//step 3 
final Bitmap bitmap = Bitmap.createBitmap(mMatGray.cols(), mMatGray.rows(), Bitmap.Config.ARGB_8888); 
Utils.matToBitmap(mMatGray, bitmap); 

erreur:

OpenCV Error: Assertion failed (scn == 3 || scn == 4) in void cv::cvtColor(cv::InputArray, cv::OutputArray, int, int), file /hdd2/buildbot/slaves/slave_ardbeg1/50-SDK/opencv/modules/imgproc/src/color.cpp, line 3739 
E/org.opencv.imgproc: imgproc::cvtColor_11() caught cv::Exception: /hdd2/buildbot/slaves/slave_ardbeg1/50-SDK/opencv/modules/imgproc/src/color.cpp:3739: error: (-215) scn == 3 || scn == 4 in function void cv::cvtColor(cv::InputArray, cv::OutputArray, int, int) 
E/AndroidRuntime: FATAL EXCEPTION: Thread-4693 

Répondre

1

La méthode createBitmap attend une image qui est soit 1,3 ou 4 canaux . Vous devez convertir votre sortie mMatGray au format requis pour la méthode createBitmap. Cependant, après avoir vérifié le OpenCV documentation pour l'algorithme d'angle de Harris, il y a quelques étapes supplémentaires pour configurer votre image pour la détection de coin. Essayez ceci:

Mat src_gray  = new Mat(); 
Mat dst    = new Mat(); 
Mat dst_norm  = new Mat(); 
Mat dst_norm_scaled = new Mat(); 

// Detector parameters 
int blockSize = 2; 
int apertureSize = 3; 
double k = 0.04; 
// Filter params 
int thresh = 200; 
int max_thresh = 255; 

// Detecting corner 
Imgproc.cvtColor(src, src_gray, Imgproc.COLOR_BGR2GRAY); 
Imgproc.cornerHarris(src_gray, dst, blockSize, apertureSize, k); 

// Normalizing 
Core.normalize(dst, dst_norm, 0, 255, Core.NORM_MINMAX); 
Core.convertScaleAbs(dst_norm, dst_norm_scaled); 

// Drawing a circle around corners 
for (int j = 0; j < dst_norm.rows(); j++) { 
    for (int i = 0; i < dst_norm.cols(); i++) { 
     if (dst_norm.get(j, i)[0] > thresh) { 
      Core.circle(dst_norm_scaled, new Point(i, j), 5, new Scalar(255)); 
     } 
    } 
} 

// Create bitmap 
final Bitmap bitmap = Bitmap.createBitmap(dst_norm_scaled.cols(), dst_norm_scaled.rows(), Bitmap.Config.ARGB_8888); 
Utils.matToBitmap(dst_norm_scaled, bitmap); 
+0

maintenant le "mMatGray" est complètement noir !!! – user2121

+0

Vérifiez la réponse révisée, espérons que cela aide – sparkplug

+1

J'ai mis à jour le code en corrigeant certains problèmes. Je l'ai testé dans une vraie application et fonctionne correctement. –

0

essayer ce

Mat mMatGray = new Mat(); 
    mMatGray = Highgui.imread(path); 
    Imgproc.cvtColor(mMatGray, mMatGray, Imgproc.COLOR_RGB2BGR); 
    Imgproc.cvtColor(mMatGray, mMatGray, Imgproc.COLOR_BGR2GRAY); 
    //step 2 
    Imgproc.cornerHarris(mMatGray,mMatGray,3,3,3,1); 
    Core.normalize(mMatGray, mMatGray, 0, 255, Core.NORM_MINMAX, CvType.CV_32FC1, new Mat()); 
    Core.convertScaleAbs(mMatGray, mMatGray); 
//step 3 
    final Bitmap bitmap = Bitmap.createBitmap(mMatGray.cols(), mMatGray.rows(), Bitmap.Config.ARGB_8888); 
Utils.matToBitmap(mMatGray, bitmap); 
+0

s'il vous plaît jeter un oeil à la section de mise à jour ci-dessus – user2121

+0

maintenant, je reçois "Assertion a échoué (scn == 3 || == scn 4)" – user2121

+0

maintenant "mMatGray" est complètement noir !!! – user2121