Autore Topic: bordo di rettangolo su immagine  (Letto 834 volte)

Offline titanum

  • Nuovo arrivato
  • *
  • Post: 47
  • Respect: 0
    • Mostra profilo
bordo di rettangolo su immagine
« il: 18 Luglio 2012, 18:00:23 CEST »
0
Ciao ragazzi, seguendo un tutorial a questo indirizzo anddev.org • View topic - Quick and easy FaceDetector demo ho realizzato un'applicazione che data un'immagine riconosce i volti e disegna due cerchi sul volto vicino agli occhi, Questo è il codice della classe FaceView:

Codice: [Seleziona]
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PointF;
import android.graphics.Rect;
import android.media.FaceDetector;
import android.util.Log;
import android.view.View;

public class FaceView extends View {
       
        private static final int NUM_FACES = 10; // max is 64
        private static final boolean DEBUG = true;
 
        private FaceDetector arrayFaces;
        private FaceDetector.Face getAllFaces[] = new FaceDetector.Face[NUM_FACES];
        private FaceDetector.Face getFace = null;
       
        private PointF eyesMidPts[] = new PointF[NUM_FACES];
        private float  eyesDistance[] = new float[NUM_FACES];
       
        private Bitmap sourceImage;
       
        private Paint tmpPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        private Paint pOuterBullsEye = new Paint(Paint.ANTI_ALIAS_FLAG);
        private Paint pInnerBullsEye = new Paint(Paint.ANTI_ALIAS_FLAG);
       
        private int picWidth, picHeight;
        private float xRatio, yRatio;

        public FaceView(Context context) {
                super(context);
               
                pInnerBullsEye.setStyle(Paint.Style.FILL);
                pInnerBullsEye.setColor(Color.RED);
               
                pOuterBullsEye.setStyle(Paint.Style.STROKE);
                pOuterBullsEye.setColor(Color.RED);
               
                tmpPaint.setStyle(Paint.Style.STROKE);
                tmpPaint.setTextAlign(Paint.Align.CENTER);
               
                BitmapFactory.Options bfo = new BitmapFactory.Options();
                bfo.inPreferredConfig = Bitmap.Config.RGB_565;
               
                sourceImage = BitmapFactory.decodeResource( getResources() ,R.drawable.volto, bfo);
 
                picWidth = sourceImage.getWidth();
                picHeight = sourceImage.getHeight();
               
                arrayFaces = new FaceDetector( picWidth, picHeight, NUM_FACES );
                arrayFaces.findFaces(sourceImage, getAllFaces);
               
                for (int i = 0; i < getAllFaces.length; i++)
                {
                        getFace = getAllFaces[i];
                        try {
                                PointF eyesMP = new PointF();
                                getFace.getMidPoint(eyesMP);
                                eyesDistance[i] = getFace.eyesDistance();
                                eyesMidPts[i] = eyesMP;
                               
                                if (DEBUG)
                                {
                                        Log.i("Face",
                                                i +  " " + getFace.confidence() + " " + getFace.eyesDistance() + " "
                                                + "Pose: ("+ getFace.pose(FaceDetector.Face.EULER_X) + ","
                                                + getFace.pose(FaceDetector.Face.EULER_Y) + ","
                                                + getFace.pose(FaceDetector.Face.EULER_Z) + ")"
                                                + "Eyes Midpoint: ("+eyesMidPts[i].x + "," + eyesMidPts[i].y +")"
                                        );
                                }
                        }
                        catch (Exception e)
                        {
                                if (DEBUG) Log.e("Face", i + " is null");
                        }
               
                }
        }
       
        @Override
        protected void onDraw(Canvas canvas)
        {
                xRatio = getWidth()*1.0f / picWidth;
                yRatio = getHeight()*1.0f / picHeight;
                canvas.drawBitmap( sourceImage, null , new Rect(0,0,getWidth(),getHeight()),tmpPaint);
                for (int i = 0; i < eyesMidPts.length; i++) {
                        if (eyesMidPts[i] != null) {
                                pOuterBullsEye.setStrokeWidth(eyesDistance[i] /6);
                                canvas.drawCircle(eyesMidPts[i].x*xRatio, eyesMidPts[i].y*yRatio, eyesDistance[i] / 2 , pOuterBullsEye);
                                canvas.drawCircle(eyesMidPts[i].x*xRatio, eyesMidPts[i].y*yRatio, eyesDistance[i] / 6 , pInnerBullsEye);
                        }
                }
        }
}

Ora vorrei che oltre ai cerchi disegnasse un rettangolo, quindi ho modificato il metodo onDraw in questo modo:

Codice: [Seleziona]
protected void onDraw(Canvas canvas)
        {
                xRatio = getWidth()*1.0f / picWidth;
                yRatio = getHeight()*1.0f / picHeight;
                canvas.drawBitmap( sourceImage, null , new Rect(0,0,getWidth(),getHeight()),tmpPaint);
                for (int i = 0; i < eyesMidPts.length; i++) {
                        if (eyesMidPts[i] != null) {
                                pOuterBullsEye.setStrokeWidth(eyesDistance[i] /6);
                                canvas.drawCircle(eyesMidPts[i].x*xRatio, eyesMidPts[i].y*yRatio, eyesDistance[i] / 2 , pOuterBullsEye);
                                canvas.drawCircle(eyesMidPts[i].x*xRatio, eyesMidPts[i].y*yRatio, eyesDistance[i] / 6 , pInnerBullsEye);
                                canvas.drawRect(200, 200, 400, 400, pInnerBullsEye); //disegna il rettangolo
                        }
                }
        }
Il problema è che il rettangolo è pieno, io vorrei che fosse visibile solo il bordo del rettangolo, come devo fare? Grazie.

Offline aw4y

  • Utente junior
  • **
  • Post: 59
  • Respect: +6
    • Mostra profilo
  • Dispositivo Android:
    samsung i5500
  • Sistema operativo:
    osx/linux
Re:bordo di rettangolo su immagine
« Risposta #1 il: 18 Luglio 2012, 18:09:36 CEST »
0
usare 4 drawLine?

Online undead

  • Utente senior
  • ****
  • Post: 666
  • Respect: +113
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S6
  • Play Store ID:
    DrKappa
  • Sistema operativo:
    Windows 10 64-bit, Windows 8.1 64-bit
Re:bordo di rettangolo su immagine
« Risposta #2 il: 19 Luglio 2012, 10:33:33 CEST »
+1
Stai usando pInnerBullsEye che ha lo style su fill, devi usare pOuterBullsEye che ha lo style su stroke.  ;-)

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:bordo di rettangolo su immagine
« Risposta #3 il: 19 Luglio 2012, 11:43:27 CEST »
0
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline titanum

  • Nuovo arrivato
  • *
  • Post: 47
  • Respect: 0
    • Mostra profilo
Re:bordo di rettangolo su immagine
« Risposta #4 il: 20 Luglio 2012, 09:52:38 CEST »
0
Grazie ragazzi, l'effetto che cercavo era quello che si ottiene settando lo stile su stroke come detto da undead.