人脸识别 , aardio调用FaceCoreEx.dll类库实现面部检测

By admin at 2023-09-11 • 0人收藏 • 1608人看过

1694419639194972.png

1694579194647438.png

我对人脸识别ViewFaceCore库进行了二次封装, 

这样就可以在aardio中简单调用了.

注意: dll需要.netFrameWork4.6.1以上运行库,我编译用的4.7.2

import console; 
 
import dotNet;
import System.Drawing;
 
var viewFaceCoredll = dotNet.load("\FaceCoreEx.dll");
var fc = viewFaceCoredll.new("FaceCoreEx.Core");
//获取检测到的人脸数量 
var ret = fc.FromFlie(io.fullpath("\images\Jay_4.jpg"));
//显示位置和得分
for(i=0;ret-1;1){
    var info = fc.GetInfo(i)
    console.log(info.X)
    console.log(info.Y)
    console.log(info.Width)
    console.log(info.Height)
    console.log(info.Score)
}
 
console.pause(true);

完整工程如下:  文件300多M是因为包含里所有的人脸数据匹配文件

链接:

https://pan.baidu.com/s/1FoXoMMqhy56NVaqR9Zo31g?pwd=uzd4

提取码:uzd4



下面是二次封装的FaceCoreEx类库源码:

将上面工程中的 ViewFaceCore.dll 和ViewFaceCore.Extension.SystemDrawing.dll 引用在类库工程中即可.

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Globalization;
using System.Linq;
using System.Runtime.InteropServices;
using System.Runtime.InteropServices.ComTypes;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using ViewFaceCore.Core;
using ViewFaceCore.Model;
 
namespace FaceCoreEx
{
    public class Core
    {
        private FaceInfo[] infos;
        public int FromFlie(string path)
        {
            var bitmap = Bitmap.FromFile(path);
            var faceImage = ViewFaceCore.ViewFaceSystemDrawingExtension.ToFaceImage(bitmap);
            FaceDetector faceDetector = new FaceDetector();
            infos = faceDetector.Detect(faceImage);
 
            bitmap.Dispose();
            faceImage.Dispose();
            faceDetector.Dispose();
            return infos.Length;
        }
 
        public InfoStruct GetInfo(int index)
        {
            InfoStruct info = new InfoStruct(){
                X = 0,
                Y = 0,
                Width = 0,
                Height = 0,
                Score = 0
            };
            if (index>=0 && index< infos.Length)
            {
                info.X = infos[index].Location.X;
                info.Y = infos[index].Location.Y;
                info.Width = infos[index].Location.Width;
                info.Height = infos[index].Location.Height;
                info.Score = infos[index].Score;
            }
            return info;   
        }
 
        public struct InfoStruct
        {
            public int X;
            public int Y;
            public int Width;
            public int Height;
            public double Score;
        };
 
    }
}

工程文件同在一个百度盘里.

10 个回复 | 最后更新于 2023-09-14
2023-09-13   #1

感谢分享, 试了下, 效果很好

有个小问题, 我希望能够识别几个, 不知道该怎么修改呢?

我尝试了如下方法, 发现会有很大机会会出错,出错信息:

微信截图_20230913090801.png


我的代码, 拖放图片到窗体测试

另外, 方法 FromFlie 是不是 FromFile 的误拼呢?


import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=935;bottom=599)
winform.add(
plus={cls="plus";left=32;top=16;right=896;bottom=584;db=1;dl=1;dr=1;dt=1;z=1}
)
/*}}*/

import gdip;
import dotNet;
var viewFaceCoredll = dotNet.load("\FaceCoreEx.dll");
var fc = viewFaceCoredll.new("FaceCoreEx.Core");
var pen = ..gdip.pen( 0xFF00ff00, 1, 2/*_GdipUnitPixel*/ )

var getFaceInfo = function(path){
	var ret = fc.FromFlie(io.fullpath(path));//FromFlie 是不是 方法拼写时有误FromFile?
	var bmp = ..gdip.bitmap(path);
	var graphics = bmp.getGraphics();
	for(i=0;ret-1;1){
		var info = fc.GetInfo(i);
		graphics.drawRectangle(pen, info.X,info.Y,info.Width,info.Height)
	}
	winform.plus.background = bmp;
	winform.plus.redraw()
}

winform.onDropFiles = function(files){
	getFaceInfo(files[1])
}

winform.show();
win.loopMessage();
2023-09-13   #2

回复#1 @鼠头鸭脖 :

你不说我还真没注意,file拼错了

内存问题我也不晓得, 是不是图片太大了?

image.png

2023-09-13   #3

回复#2 @admin :

应该不是大小原因, 我试的图片都小于1M,如果运行一次只测试一个文件就肯定没问题, 但如果测试几个就很大概率(90%吧),最好的时候,连续拖放6,7个都没问题,但最终还是会出错, 一般第二个就会出错, 我不懂C#, 会不会是这里

            bitmap.Dispose();
            faceImage.Dispose();
            faceDetector.Dispose();

资源过早回收了导致的呢?瞎猜的



screenshots.gif



2023-09-14   #4

回复#3 @鼠头鸭脖 :

今天我刚测试用了多张照片, 来回拖进去, 并没有发现你说的内存问题, 

从提示上看, 感觉应该是有照片被别的软件占用了或者图片格式不正确, 你直接从 [照片的文件夹 ] 里面拖动真实照片进去试试, 

我看你似乎用aar写了个展示的图片列表, 从里面拖进去的 ,会不会是这个问题

2023-09-14   #5

回复#4 @admin :

应该和这个没关系, 我上面显示就是本地目录来的, 只是用wb.form显示出来, 之前测试都是直接从本地目录直接拖放的, 刚刚又试了win11的, 也有同样问题, 有没有其它小伙伴测试过说说哈



screenshots.gif

2023-09-14   #6

回复#5 @鼠头鸭脖 :

你可以试试看使用英文路径以及去除特殊符号,有时候C#在处理中文字符时,尤其涉及到路径转换时会有问题。

2023-09-14   #7

回复#5 @鼠头鸭脖 :

你把你的图片,放到百度盘, 我测测, 我win10 , .net4.7.2 没问题

我下面的图片中录制了很长时间, 只是截取了其中一点, 完全没问题, 


screenshots.gif

2023-09-14   #8

回复#7 @admin :

刚刚试了,路径改成全英文也是一样, 应该不是这个原因, 因为测试的第一个文件也是有中文的, 每次都OK,但第二个就99%有问题

图片只是普通图片, 随机测试不同大小结果都是一样

我的系统也是win10 x64 .net版本信息

微信截图_20230914150617.png

2023-09-14   #9

回复#7 @admin :

用你包里的图片测试也是一样, 第一张总是OK, 第二张就出错

2023-09-14   #10

回复#9 @鼠头鸭脖 :

看我上面的动图, 随便怎么拖....

估计是电脑环境问题吧

随便啦, 反正我这没问题, 我也用不到,开源的, 你自己研究吧

登录后方可回帖

登 录
信息栏
 私人小站

本站域名

ChengXu.XYZ

投诉联系:  popdes@126.com



快速上位机开发学习,本站主要记录了学习过程中遇到的问题和解决办法及上位机代码分享

这里主要专注于学习交流和经验分享.
纯私人站,当笔记本用的,学到哪写到哪.
如果侵权,联系 Popdes@126.com

友情链接
Aardio官方
Aardio资源网


才仁机械


网站地图SiteMap

Loading...