Координаты point leftEye и rightEye возвращают значение null с использованием Nexus 4. Разве это не поддерживается в Nexus 4?

Я пытаюсь получить координаты левого глаза и правого глаза и провести линию от левого глаза к правому глазу, но возвращаемые координаты равны нулю. Я использую Nexus 4 для тестирования приложения. Nexus 4 не поддерживает эту функцию?? Я могу без проблем нарисовать прямоугольник вокруг обнаруженного лица. Для справки прилагаю свои коды для определения координат глаза.

try{
         float x1 = detectedFaces[i].leftEye.x;
         float y1 = detectedFaces[i].leftEye.y;
         float x2 = detectedFaces[i].rightEye.y;
         float y2 = detectedFaces[i].rightEye.y;

         //Converting from driver coordinate to view coordinate
         float Xx1 = (x1+1000) * vWidth/2000;
         float Yy1  = (y1+1000) * vHeight/2000;
         float Xx2 = (x2+1000) * vWidth/2000;
         float Yy2  = (y2+1000) * vHeight/2000;

         canvas.drawLine(Xx1, Yy1, Xx2, Yy2, drawingPaint);
         }
         catch(Exception e){
             Log.e(TAG, "Error: " +e.getMessage());
         }

Логкэт

11-15 16:37:52.895: E/Take_Picture(1304): Error: null
11-15 16:37:53.115: E/Take_Picture(1304): Error: null
11-15 16:37:53.286: E/Take_Picture(1304): Error: null

person Jack    schedule 15.11.2013    source источник


Ответы (1)


Чтение справочника по Android: «Это необязательное поле, которое может поддерживаться не на всех устройствах. Если оно не поддерживается, для значения всегда будет установлено значение null».

Я тестировал на нескольких устройствах (Nexus 4 и 5, Samsung Galaxy S4 и S5, Sony Experia, HTC One и т. д. и т. д.) и никогда не работал. Это может быть хорошим вопросом для команды разработчиков Android в Google.

Варианты, которые у вас есть, будут использовать библиотеку OpenCv (http://opencv.org/platforms/android.html).

Другим вариантом было бы выполнить обнаружение после съемки изображения, а не делать это вживую с помощью класса FaceDetector, не уверен, что вы хотите сделать это вживую.

См. пример:

public class TutorialOnFaceDetect1 extends Activity {
private MyImageView mIV;
private Bitmap mFaceBitmap;
private int mFaceWidth = 200;
private int mFaceHeight = 200;   
private static final int MAX_FACES = 10;
private static String TAG = "TutorialOnFaceDetect";

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    mIV = new MyImageView(this);
    setContentView(mIV, new LayoutParams(LayoutParams.WRAP_CONTENT,    LayoutParams.WRAP_CONTENT));       

    // load the photo
    Bitmap b = BitmapFactory.decodeResource(getResources(), R.drawable.face3); 
    mFaceBitmap = b.copy(Bitmap.Config.RGB_565, true); 
    b.recycle();

    mFaceWidth = mFaceBitmap.getWidth();
    mFaceHeight = mFaceBitmap.getHeight();  
    mIV.setImageBitmap(mFaceBitmap); 

    // perform face detection and set the feature points
    setFace();

    mIV.invalidate();
}

public void setFace() {
    FaceDetector fd;
    FaceDetector.Face [] faces = new FaceDetector.Face[MAX_FACES];
    PointF midpoint = new PointF();
    int [] fpx = null;
    int [] fpy = null;
    int count = 0;

    try {
        fd = new FaceDetector(mFaceWidth, mFaceHeight, MAX_FACES);        
        count = fd.findFaces(mFaceBitmap, faces);
    } catch (Exception e) {
        Log.e(TAG, "setFace(): " + e.toString());
        return;
    }

    // check if we detect any faces
    if (count > 0) {
        fpx = new int[count];
        fpy = new int[count];

        for (int i = 0; i < count; i++) { 
            try {                 
                faces[i].getMidPoint(midpoint);                  

                fpx[i] = (int)midpoint.x;
                fpy[i] = (int)midpoint.y;
            } catch (Exception e) { 
                Log.e(TAG, "setFace(): face " + i + ": " + e.toString());
            }            
        }      
    }

    mIV.setDisplayPoints(fpx, fpy, count, 0);
} 

}

person David Guerrero    schedule 11.11.2014