【问题标题】:Android: Draw Landmarks on face using Google Vision APIAndroid:使用 Google Vision API 在脸上绘制地标
【发布时间】:2021-05-02 09:37:54
【问题描述】:

我有当前的代码,它在实时相机预览中围绕用户的脸部绘制一个边界框。

我还尝试在实时摄像头预览中绘制面部标志的位置。由于没有比例值,它会绘制它们但不在正确的位置

我在网上找到了这段代码,但我很难计算这个比例值,因为它是实时相机预览而不是位图图像

网上找到的示例代码

 double scale = Math.min( viewWidth / imageWidth, viewHeight / imageHeight );

 for (Landmark landmark : face.getLandmarks()) {
        int cx = (int) (landmark.getPosition().x * scale);
        int cy = (int) (landmark.getPosition().y * scale);
        canvas.drawCircle(cx, cy, 10, paint);
    }

我的功能

@Override
   public void draw(Canvas canvas) {
       Face face = mFace;

       if (face == null) {
           return;
       }


       // Draws a circle at the position of the detected face, with the face's track id below.

    
       float x = translateX(face.getPosition().x + face.getWidth() / 2);
       float y = translateY(face.getPosition().y + face.getHeight() / 2);
       canvas.drawCircle(x, y, FACE_POSITION_RADIUS, mFacePositionPaint);
      


       // Draws a bounding box around the face.
       float xOffset = scaleX(face.getWidth() / 2.0f);
       float yOffset = scaleY(face.getHeight() / 2.0f);
       float left = x - xOffset;
       float top = y - yOffset;
       float right = x + xOffset;
       float bottom = y + yOffset;
       canvas.drawRect(left, top, right, bottom, mBoxPaint);

       Paint paint = new Paint();
       paint.setColor( Color.GREEN );
       paint.setStyle( Paint.Style.STROKE );
       paint.setStrokeWidth( 5 );

       for ( Landmark landmark : face.getLandmarks() ) {
           int cx = (int) ( landmark.getPosition().x);
           int cy = (int) ( landmark.getPosition().y);
           canvas.drawCircle( cx, cy, 10, paint );
       }

       }

【问题讨论】:

    标签: android google-vision vision-api


    【解决方案1】:

    通过以下方式解决,但不完全准确

     if ((contains(face.getLandmarks(), 11) != 99)
                    && (contains(face.getLandmarks(), 5) != 99)
                    && (contains(face.getLandmarks(), 6) != 99)
            ) {
    
                Log.i(TAG, "draw: Mouth Open >> found all the points");
    
                /**
                 * for bottom mouth
                 */
                int cBottomMouthX;
                int cBottomMouthY;
    
                    cBottomMouthX = (int) translateX(face.getLandmarks().get(contains(face.getLandmarks(), 0)).getPosition().x);
                    cBottomMouthY = (int) translateY(face.getLandmarks().get(contains(face.getLandmarks(), 0)).getPosition().y);
    
                    Log.i(TAG, "draw: Condition Bottom mouth >> cBottomMouthX >> " + cBottomMouthX + "    cBottomMouthY >> " + cBottomMouthY);
    
                canvas.drawCircle(cBottomMouthX, cBottomMouthY, 10, paint);
    
                /**
                 * for left mouth
                 */
                int cLeftMouthX;
                int cLeftMouthY;
    
                    cLeftMouthX = (int) translateX(face.getLandmarks().get(contains(face.getLandmarks(), 5)).getPosition().x);
                    cLeftMouthY = (int) translateY(face.getLandmarks().get(contains(face.getLandmarks(), 5)).getPosition().y);
    
                    Log.i(TAG, "draw: Condition LEft mouth >> cLeftMouthX >> " + cLeftMouthX + "    cLeftMouthY >> " + cLeftMouthY);
                    cLeftMouthX = (int) translateX(face.getLandmarks().get(contains(face.getLandmarks(), 5)).getPosition().x);
                    cLeftMouthY = (int) translateY(face.getLandmarks().get(contains(face.getLandmarks(), 5)).getPosition().y);
                canvas.drawCircle(cLeftMouthX, cLeftMouthY, 10, paint);
    
                /**
                 * for Right mouth
                 */
                int cRightMouthX;
                int cRightMouthY;
    
                    cRightMouthX = (int) translateX(face.getLandmarks().get(contains(face.getLandmarks(), 11)).getPosition().x);
                    cRightMouthY = (int) translateY(face.getLandmarks().get(contains(face.getLandmarks(), 11)).getPosition().y);
    
                    Log.i(TAG, "draw: Condition Right mouth >> cRightMouthX >> " + cRightMouthX + "    cRightMouthY >> " + cRightMouthY);
    
    
    
                    cRightMouthX = (int) translateX(face.getLandmarks().get(contains(face.getLandmarks(), 11)).getPosition().x);
                    cRightMouthY = (int) translateY(face.getLandmarks().get(contains(face.getLandmarks(), 11)).getPosition().y);
    
                canvas.drawCircle(cRightMouthX, cRightMouthY, 10, paint);
    
                float centerPointX = (cLeftMouthX + cRightMouthX) / 2;
                float centerPointY = ((cLeftMouthY + cRightMouthY) / 2) - 20;
    
                canvas.drawCircle(centerPointX, centerPointY, 10, paint);
    
                float differenceX = centerPointX - cBottomMouthX;
                float differenceY = centerPointY - cBottomMouthY;
    
                Log.i(TAG, "draw: difference X >> " + differenceX + "     Y >> " + differenceY);
    
                if (differenceY < (-60)) {
                    Log.i(TAG, "draw: difference - Mouth is OPENED ");
                } else {
                    Log.i(TAG, "draw: difference - Mouth is CLOSED ");
                }
            }
        }
    
    
        private int contains (List < Landmark > list,int name){
            for (int i = 0; i < list.size(); i++) {
                if (list.get(i).getType() == name) {
                    return i;
                }
            }
            return 99;
        }
    

    【讨论】:

      猜你喜欢
      • 2019-08-27
      • 2019-04-08
      • 2016-07-20
      • 1970-01-01
      • 1970-01-01
      • 2020-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多