2017-01-31 2 views
1

Les applications détectent la couleur spécifique sur le cadre et dessinent les contours à l'aide d'OpenCV. Et quand on clique sur le bouton de capture, l'image du cadre sera utilisée pour effectuer un traitement d'image, tandis que les contours dessinés sont également capturés avec le cadre qui n'est pas ce que je veux. Ma question est de savoir comment puis-je supprimer les contours dessinés lorsque je clique sur le bouton de capture. Ou y at-il une méthode pour obtenir le cadre sans contours dessinés?OpenCV (Android) - Supprimer les contours dessinés

La méthode que j'ai essayé:

  1. Verrouillez le onCapture() jusqu'à ce que onCameraFrame est appelé et le retour mRbg avant drawContour() est appelée.
  2. Clone mRgba à nouveau Mat et utiliser le nouveau Mat en tant que paramètre de subColor

Mais deux d'entre eux ne fonctionne pas.

Je pense à mettre en pause onCapture() jusqu'à onCameraFrame appelé et fait plusieurs fois en sautant les lignes des contours de dessin pour s'assurer que rien n'a été dessiné sur le cadre. Mais je ne sais pas comment gérer deux synchronized().

public boolean onTouch(View v, MotionEvent event) { 
    lock = true; 
    if (event.getAction() == MotionEvent.ACTION_DOWN) { 
     //do something 
    } else if (event.getAction() == MotionEvent.ACTION_UP) { 
     //do something 
     //↓to make sure onCameraFrame is pause before the finger left the screen 
     lock = false; 
     synchronized (locker) { locker.notify(); } 
    } 

    return true; 
} 

public Mat onCameraFrame(CvCameraViewFrame inputFrame) { 
    //Pause until onTouch() is done 
    commandLocker(); 

    //Detect the contour 
    mDetector.setHsvColor(txtHsv); 
    if (area) { 
     nRgba = mRgba.submat(ey, sy, sx, ex); 
     mDetector.process(nRgba); 
    } else { 
     mDetector.process(mRgba); 
    } 

    //Skip this when onCapture is called 
    //Draw the contour on the frame 
    if (!capture) { 
     List<MatOfPoint> contours = mDetector.getContours(); 
     if (nRgba != null && area) { 
      Imgproc.rectangle(mRgba, new Point(sx, sy), new Point(ex, ey), areaColor, 3); 
      Imgproc.drawContours(nRgba, contours, -1, contourColor); 
     } else 
      Imgproc.drawContours(mRgba, contours, -1, contourColor); 
    } 

    return mRgba; 
} 

public void onCapture(View view) throws IOException { 
    capture = true; 
    //Pause until onCameraFrame() done 
    if (!area) 
     subColor(mRgba); 
    else 
     subColor(nRgba); 
} 

public void subColor (Mat src) throws IOException { 
    //do something 
} 

private void commandLocker() { 
    synchronized (locker) { 
     while (lock) { 
      try { 
       locker.wait(); 
      } catch (InterruptedException e) { 
       Log.e("Exception", "InterruptedException"); 
      } 
     } 
    } 
} 

Frame captured without processing Processed image

Répondre

0

Dans votre fonction onCameraFrame(CvCameraViewFrame inputFrame), si la condition:

if (nRgba != null)

est pas satisfait, vous écrasez votre tapis d'origine mRgba en faisant Imgproc.drawContours(mRgba, contours, -1, contourColor);

Est-ce votre problème?

+0

si la zone est sélectionnée par l'utilisateur, nRgba (submat de mRgba) n'est pas nul, alors fera Imgproc.drawContours (nRgba, contours, -1, contourColor), sinon Imgproc.drawContours (mRgba, contours, - 1, contourColor). Cela n'a aucun problème pour dessiner les contours. Le problème est que l'image capturée comprend la bordure de contours dessinée par cette méthode, ce qui n'est pas ce que je veux. Ce que je veux, c'est les contours affichés sur l'écran mais pas sur l'image enregistrée. – shisushi

+0

s'il vous plaît avoir un contrôle sur mon édition – shisushi

+0

Je ne comprends pas cette partie: "Le problème est l'image capturée comprend la bordure de contours dessinée par cette méthode". Voulez-vous dire que l'image capturée a déjà les contours dessinés avant d'appeler le ** Imgproc.drawContours **? – NAmorim