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é:
- Verrouillez le onCapture() jusqu'à ce que onCameraFrame est appelé et le retour mRbg avant drawContour() est appelée.
- 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");
}
}
}
}
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
s'il vous plaît avoir un contrôle sur mon édition – shisushi
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