Android 人脸检测仅适用于绘图,不适用于 SD 卡中的图像

2024-02-06

所以我有代码可以在任何给定的图像文件中检测最多 10 张面孔,并向我返回信息,例如眼睛的位置和其他类似信息。因此,当我告诉它使用存储在我的项目资源的可绘制文件夹中的图像文件时,它效果很好。但是当我尝试从 SD 卡导入的位图中查找面孔时,它不会找到任何面孔。但这些都是完全相同的图像。有任何想法吗?我的代码如下:

编辑: 经过进一步检查我发现当我插入这行代码时System.out.println("Row Bytes: " + sourceImage.getRowBytes());我得到的可绘制对象是 352,而 SD 卡映像是 704。我认为这意味着可绘制对象被压缩在 .apk 文件中,但 SD 卡映像显然没有被压缩。不确定这是否会产生任何影响。

 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;

                   //********This code imports the image from the SD card which does not work
                   String imageInSD = Environment.getExternalStorageDirectory()
                        .getAbsolutePath() + "/testfolder/" + "face1" + ".png";

                   Bitmap sourceImage = BitmapFactory.decodeFile(imageInSD,bfo);

                   //**********This code uses an image in the projects drawable folder, this code works.
                   sourceImage = BitmapFactory.decodeResource( getResources() ,R.drawable.face1, 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);
                           }
                   }


           }  

}

好吧,我相信我知道你的问题是什么。由于图像位于外部存储器中,因此设备无法将图像渲染为位图图像。人脸识别正在工作,只是没有出现在画布上。所有设备对我的 xoom (2048x2048) 都有渲染限制 我发现here http://groups.google.com/group/android-developers/browse_thread/thread/2352c776651b6f99。当您将图像添加为资源时它起作用的原因是因为您的文件在构建 .apk 时缩小了(说实话,我不确定它为什么这样做,但我留下了一些 println 进行测试,其他人可以更好地回答这个问题)。不管怎样,我只是在代码查找面孔之后、尝试将位图渲染到画布之前,通过除以 2 来缩放位图。现在一切似乎都运行良好。您可能想调整脸部指示器,但它很实用。我希望这有帮助。

public class FaceView extends View {
private static final int NUM_FACES = 1; // 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;

        //********This code imports the image from the SD card which does not work
        String imageInSD = Environment.getExternalStorageDirectory().getAbsolutePath() + "/face1" + ".jpg";

        System.out.println(imageInSD);

        sourceImage = BitmapFactory.decodeFile(imageInSD, bfo);

        //Bitmap sourceImage;// = BitmapFactory.decodeFile(imageInSD,bfo);


        //**********This code uses an image in the projects drawable folder, this code works.
        //sourceImage = BitmapFactory.decodeResource( getResources() ,R.drawable.face1, bfo);

        picWidth = sourceImage.getWidth();
        picHeight = sourceImage.getHeight(); 

        System.out.println(picWidth + "x" + picHeight);

        arrayFaces = new FaceDetector( picWidth, picHeight, NUM_FACES );
        arrayFaces.findFaces(sourceImage, getAllFaces);

        sourceImage = Bitmap.createScaledBitmap (sourceImage, picWidth/2, picHeight/2, false);

        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);
                }
        }


}

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 人脸检测仅适用于绘图,不适用于 SD 卡中的图像 的相关文章

随机推荐

  • 将多列表转换为两列表

    让我们假设我想分析格鲁吉亚 国家 不同地区 城市的旅游游客 这里很容易从以下网站获取数据 https www geostat ge en modules categories 101 domestic tourism https www g
  • 如何使用邮递员测试获得代码覆盖率

    我们在 RestEasy 中创建了 REST 服务 并在 Wildfly 服务器中运行 我们正在运行 Postman 测试用例来测试 Rest URL 当我们执行邮递员测试套件时 有没有办法获得服务的代码覆盖率 我们使用SonarQube来
  • 如何将数据追加到 Excel 工作表列中?

    我有包含一些数据的现有 Excel 文件 我想将数据附加到其中 在此输入图像描述 1 try xlApp new Excel Application xlWorkBook xlApp Workbooks Add misValue xlWor
  • 为什么我的 Google OAuth URL 在返回的 URL 中放置了哈希值?

    给定的网址 返回网址 如果返回 URL 完全有效 更改为 开始查询字符串 为什么谷歌要归还 因此 杀死查询字符串 单独说明 另外 我不太知道我是否应该提出要求token or code作为响应类型 我计划让用户将他们的 Google 云端硬
  • 为什么 selectOneMenu 将 ItemLabel 发送到转换器?

    我的 JSF 页面
  • 为什么我在尝试打印时收到 AttributeError

    我正在按照本教程学习 urllib2http docs python org howto urllib2 html urlerror http docs python org howto urllib2 html urlerror运行下面的
  • 使用 Swift Package Manager 时如何生成用于开发的 Xcode 项目文件

    我正在使用新的开源 Swift Package Manager 并且能够下载文件 我希望管理器根据它检索到的包创建一个 开发环境 通过 Xcode 有人处理过这个吗 更新 正如其他答案中提到的 您现在可以使用以下命令生成 Xcode 项目文
  • 获取 Chrome 扩展程序读取复制文本的权限

    我正在创建一个 Chrome 扩展程序 我希望能够看到用户从 Chrome 复制到剪贴板的内容 这是我目前在内容脚本中所做的工作 document addEventListener copy gt navigator clipboard r
  • 从 groupby 函数中选择组

    我的数据框 df1 group ordercode quantity 0 A 1 B 3 1 C 1 E 2 D 1 我通过以下方式组建了每个小组groupby功能 我需要使用组号提取数据 我想要的输出 在 获取组0 出去 ordercod
  • 将会员资格提供程序和 dbcontext 包装在单个事务上

    使用 EF 5 代码优先和 NET 4 5 的 MVC 项目 我一直在寻找一种将 dbContext 和 SimpleMembershipProvider 包装在单个事务上的方法 我尝试使用 TransactionScope 但由于会员资格
  • 将change、mouseup、mousedown、mouseout、keyup和keydown合并为一个函数

    我拥有的 我有一个文本框 它假定在相应的选择框中选择的任何选项的值 我对 on Change mouseup mousedown mouseout keyup 和 keydown 事件重复完全相同的函数 我需要的 是否可以将上述功能合并为一
  • Java - 动态更改日志记录级别

    我希望能够告诉 JVM 在执行链中的某个时刻停止记录特定级别的消息 在某些时候 我只想记录消息SEVERE水平 所以我正在考虑这样做 for Enumeration
  • 显示高度 100%:IE 中的表格单元格

    我希望在 div 下有一个带有 display table cell 的子元素 占据父 div 的整个高度 有谁知道为什么下面的代码片段在 Chrome 和 FF 中工作得很好 但在 IE 包括 10 下却崩溃了 HTML div clas
  • (数字)和(-数字)的含义

    是什么意思 number number 我已经搜索过但无法找到其含义 我想用i i 在 for 循环中 如 for i 0 i lt n i i i 假设 2 的补码 或者i未签名 i等于 i 1 i i 1 是提取最低设置位的技巧i 它之
  • qPython - kdb响应数据的类型转换

    当我使用 qPython 运行 q 查询时 我能够返回 pandas 数据框中的数据 我正在努力解决的是 字符串 列的类型 即在 q 中以简单或混合 字符 列表形式呈现的列 它们的数据类型是 object 值以 b ab34knadke 的
  • 发现蓝牙设备IOError:RPC服务器不可用

    我只是尝试在 PyCharm 中使用 Python 实现蓝牙PyBluez http karulis github io pybluez 我陷入了这个特殊的错误 我试图搜索这个错误 但找不到它 有人可以帮忙吗 这是我的代码 gt gt gt
  • 使用 Facebook (PHP SDK) 和 Codeigniter 进行身份验证

    好吧 这几天我一直在尝试将 Facebook 身份验证集成到我基于 Codeigniter 的网站中 我已将 Facebook PHP SDK 作为一个库包含在内 并且似乎连接得很好 但是当我在 SDK 中使用 getUser 方法时 会返
  • 如何拥有一个显示不同uitableview建议的搜索栏

    我想在导航栏上有一个搜索栏 当用户开始输入时 显示一些建议 但另外 uitableview 必须与搜索结果不同 例如 用户开始输入 wh 然后显示一个包含white wheater who 的列表 然后 当按下搜索按钮时 会显示其他列表和结
  • Safari 浏览器的媒体查询

    我希望媒体仅在 1280 像素屏幕的 Safari 上运行 这适用于所有浏览器 但我只想要 safari media screen and width 1280px Try this Webkit Chrome 和 Safari 任何版本
  • Android 人脸检测仅适用于绘图,不适用于 SD 卡中的图像

    所以我有代码可以在任何给定的图像文件中检测最多 10 张面孔 并向我返回信息 例如眼睛的位置和其他类似信息 因此 当我告诉它使用存储在我的项目资源的可绘制文件夹中的图像文件时 它效果很好 但是当我尝试从 SD 卡导入的位图中查找面孔时 它不