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.com/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地址和端口號??1280x720Console.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.com/kesshei/CameraDemo.git
https://gitee.com/kesshei/CameraDemo.git
閱
一鍵三連呦!,感謝大佬的支持,您的支持就是我的動力!