admin 管理员组

文章数量: 887031

OpenCvSharp是OpenCv的包装器,相当于底层是OpenCv只是用.Net的方式调用底层的接口的实现,所以,从OpenCv的知识架构来讲,源码是一样一样的。就是换个语言写而已。

  1. OpenCvSharp 尽可能地以原生 OpenCV C/C++ API 风格为蓝本。
  2. OpenCvSharp 的许多类都实现了 IDisposable。无需管理不安全的资源。
  3. OpenCvSharp 不会强迫您使用面向对象的编程风格。您还可以调用原生风格的 OpenCV 函数。
  4. OpenCvSharp 提供了从转换Mat为Bitmap(GDI+) 或WriteableBitmap(WPF) 的函数。

所以,只要想学OpenCv,那就可以以原OpenCv的代码方式用.NET 来进行实现。

我早就想识别人脸,最好能识别我是谁,最好能把家里的小猫,也识别了,爽歪歪,最近去了一趟水世界,人家都是摄像头识别人脸,只用提交一张自拍照就可以了,而OpenCv肯定是能达到这种效果的,当然,我还在学习中,先试试识别人脸的效果。

我是台式机,也没有摄像头,突发奇想,能不能连上我的手机(安卓)来实现摄像头的效果,经过不断尝试,终于达到了目的,也算是有一个不错的效果。

手机支持Web摄像头

网上搜了很多资料,最后找到了这个好用的视频工具 DroidCam ,它分为两个端,一个是手机端,一个是PC端,这样QQ就可以用PC端的驱动来实现PC的摄像头效果。

但是,主要是靠手机端,因为,有了手机端,本身它就有了WebCamera的功能,其中像海康这种网络摄像头,都是有RTSP协议的,也是可以用的。

可以网上搜相关资源,也可以下载我提供的资源(我提供的是DroidCamX版本呦 支持720和1080清晰度呦)

安装后效果

手机端是这个样子的,直接运行起来就好,还有一些相关的设置,可以自行设置

电脑端是这个样子的

连上手机后

效果还是很明显

Web直接打开

地址大概是: http://192.168.1.3:4747/video

也可以通过 http://192.168.1.3:4747 打开

我这里是乱码了,但是,可以点一下


就可以通过Web的方式来实现对摄像头的相关设置。这样也就不用客户端了。

OpenCvSharp 摄像头人脸识别

主要是通过以下两个Nuget

Install-Package OpenCvSharp4.Windows -Version 4.6.0.20220608
Install-Package OpenCvSharp4.Extensions -Version 4.6.0.20220608

人脸识别模型库

人脸识别模型库是从官网下载的

地址如下:

https://codeload.github/opencv/opencv/zip/refs/tags/4.6.0

在这个目录下

人脸识别相关业务逻辑

static void Main(string[] args)
{
    Mat frame = new Mat();
    var Capture = new VideoCapture("http://192.168.1.3:4747/video?1280x720"); // 这里是DroidCam手机端的IP地址和端口号 ?1280x720
    Console.WriteLine($"摄像头是否打开:{Capture.IsOpened()}");
    //声明窗口
    Cv2.NamedWindow("video", WindowFlags.KeepRatio);
    Cv2.ResizeWindow("video", 1280, 720);

    //加载人眼、人脸模型数据
    CascadeClassifier faceFinder = new CascadeClassifier(@"haarcascades\haarcascade_frontalface_default.xml");
    CascadeClassifier eyeFinder = new CascadeClassifier(@"haarcascades\haarcascade_eye_tree_eyeglasses.xml");
    var Count = new ConcurrentDictionary<long, int>();
    long PreviousTime = 0;
    long FPS = 0;
    while (true)
    {
        bool res = Capture.Read(frame);//会阻塞线程
        if (!res || frame.Empty())
        {
            continue;
        }
        var times = GettimeStamp();
        if (PreviousTime != times && Count.ContainsKey(times - 1))
        {
            PreviousTime = times;
            FPS = Count[times - 1];
            Console.WriteLine($"每秒处理图片:{FPS}帧");
        }
        Count.AddOrUpdate(times, 1, (k, v) => v + 1);

        Cv2.PutText(frame, $"{FPS}", new Point(10, 70), HersheyFonts.HersheyPlain, 4, new Scalar(0, 0, 255), 3);
        //进行检测识别
        Rect[] faceRects = faceFinder.DetectMultiScale(frame);
        Rect[] eyeRects = eyeFinder.DetectMultiScale(frame);
        //如果有检测到,就绘制结果到图像上
        if (faceRects.Length > 0)
        {
            Cv2.Rectangle(frame, faceRects[0], new Scalar(0, 0, 255), 3);
        }
        if (eyeRects.Length > 1)
        {
            Cv2.Rectangle(frame, eyeRects[0], new Scalar(255, 0, 0), 3);
            Cv2.Rectangle(frame, eyeRects[1], new Scalar(255, 0, 0), 3);
        }
        //显示结果
        Cv2.ImShow("video", frame);
        Cv2.WaitKey(1);
        //省略几个以加快图像的速度
        Capture.Grab();
        Capture.Grab();
        Capture.Grab();
        Capture.Grab();
    }
    Capture.Release();
    //销毁所有的窗口
    Cv2.DestroyAllWindows();
    Console.WriteLine("录制完毕!");
    Console.ReadLine();
}
public static long GettimeStamp()
{
    return new DateTimeOffset(DateTime.UtcNow).ToUnixTimeSeconds();
}

运行结果

哈哈,算是露脸了,我这脸可是有版权的呦!!!

总结

效果还是很不错的,终于算是入手OpenCv了,后期的各种技巧和书籍就可以学起来了。最好,以后可以通过一张图片,就能识别到对方是谁,这样的应用场景应该很多,我之前公司的门禁都是统一拍照发照片搞定的。

但是,具体人脸咋搞一个数据出来,还得继续搞搞。

代码地址(包含了DroidCamX 相关工具)

https://github/kesshei/CameraDemo.git

https://gitee/kesshei/CameraDemo.git

一键三连呦!,感谢大佬的支持,您的支持就是我的动力!

本文标签: 摄像头 手机 AI OpenCvSharp