摘要:最近上了,這是一個小巧的人臉檢測庫,行,大小,性能很好,效果也還還行。于是我想有沒其他的能在瀏覽器跑的人臉檢測庫,一查才發現已經支持編譯到,也就可以直接在瀏覽器里使用了。
最近picojs上了Github Trending,這是一個小巧的人臉檢測庫,200行JS,2K大小,性能很好,效果也還還行。于是我想有沒其他的能在瀏覽器跑的人臉檢測庫,一查才發現OpenCV已經支持編譯到WebAssembly,也就可以直接在瀏覽器里使用了。
編譯OpenCV.js安裝Emscripten SDK:
git clone https://github.com/juj/emsdk.git cd emsdk ./emsdk update-tags ./emsdk install latest ./emsdk activate latest source ./emsdk_env.sh
Emscripten可以把C/C++程序編譯成asm.js,然后通過binaryen的asm2wasm轉成WebAssembly。
接著就可以編譯OpenCV了:
wget https://github.com/opencv/opencv/archive/3.4.1.zip unzip 3.4.1.zip cd opencv-3.4.1 python ./platforms/js/build_js.py build_wasm --build_wasm
編譯的成果在build_wasm/bin:
$ ls -lh build_wasm/bin/ total 5.5M -rw-r--r-- 1 lyp lyp 263K Apr 26 22:10 opencv.js -rw-r--r-- 1 lyp lyp 262K Apr 26 22:10 opencv_js.js -rw-r--r-- 1 lyp lyp 5.0M Apr 26 22:10 opencv_js.wasm
我們只需要其中的opencv.js和opencv_js.wasm,可以復制到其他地方使用,而opencv_js.js是中間生成的asm.js,可以忽略。
加載OpenCV我們可以直接在HTML頁面里引用opencv.js,它會自動加載opencv_js.wasm然后完成編譯。遇到的第一個問題是,opencv.js默認會加載根目錄的opencv_js.wasm,而我們通常會把js文件放在二級目錄里。第二個問題是,我們的代碼必須在OpenCV編譯完成之后才能調用,不會代碼就直接出錯了。
更新2018-08-20:在Emscripten v1.38.9,locateFile行為已經修改,不需要這個hack了。
為了解決以上的問題,要通過Module進行配置:
Module是Emscripten生成的全局對象,通過它可以配置和調用Emscripten的API。例如locateFile用配置文件的實際URL。
preRun會在初始化前前調用,在這個時候,OpenCV還沒初始化,我們可以先用Emscripten的文件系統API預加載之后會用的文件,這里我加載了一個預訓練好的模型data/haarcascade_frontalface_default.xml,存放在Emscripten文件系統的"/face.xml"。
postRun會在初始化完成之后執行,這時候OpenCV編譯完成,可以使用cv模塊了。
獲取攝像頭圖像首先我們需要一個video標簽,然后打開攝像頭:
async function startCamera() { let video = document.getElementById("video"); let stream = await navigator.mediaDevices.getUserMedia({ video: { width: { exact: videoWidth }, height: { exact: videoHeight } }, audio: false }) video.srcObject = stream; video.play(); }
然后我們就可以用cv.VideoCapture來讀取攝像頭了:
// 創建VideoCapture let cap = new cv.VideoCapture(video); // 創建存放圖像的Mat let src = new cv.Mat(videoHeight, videoWidth, cv.CV_8UC4); // 讀一幀圖像 cap.read(src);Haar Cascades人臉檢測
創建人臉檢測器:
faceCascade = new cv.CascadeClassifier(); faceCascade.load("face.xml")
接著就可以循環讀取圖像,檢查人臉,顯示了:
// Capture a frame cap.read(src) // Convert to greyscale cv.cvtColor(src, gray, cv.COLOR_RGBA2GRAY); // Downsample let downSampled = new cv.Mat(); cv.pyrDown(gray, downSampled); cv.pyrDown(downSampled, downSampled); // Detect faces let faces = new cv.RectVector(); faceCascade.detectMultiScale(downSampled, faces) // Draw boxes let size = downSampled.size(); let xRatio = videoWidth / size.width; let yRatio = videoHeight / size.height; for (let i = 0; i < faces.size(); ++i) { let face = faces.get(i); let point1 = new cv.Point(face.x * xRatio, face.y * yRatio); let point2 = new cv.Point((face.x + face.width) * xRatio, (face.y + face.height) * xRatio); cv.rectangle(src, point1, point2, [255, 0, 0, 255]) } // Show image cv.imshow(outputCanvas, src) // Cleanup downSampled.delete() faces.delete()
性能在30FPS左右,效果要比picojs好,代價是需要加載很大的JS和wasm,初始化慢。
完整代碼:learn_ml/opencv.js
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/94673.html
摘要:總結在本文中,我們學習了如何使用中的,即通過代碼寫了一個人臉檢測的程序。 OpenCV是如今最流行的計算機視覺庫,而我們今天就是要學習如何安裝使用OpenCV,以及如何去訪問我們的攝像頭。然后我們一起來看看寫一個人臉檢測程序是如何地簡單,簡單到只需要幾行代碼。 在開始之前,我假設你已經對Python有一定的了解。當然,如果你覺得你還不夠格,這里有推薦一些學習Python的電子書,你可以...
摘要:身為一名前業務程序員和現前端程序員,這樣的功能還是陌生的領域。需求使用加攝像頭,通過人臉檢測,完成自動拍照功能。在的屏幕上,顯示攝像頭的實時畫面,要是畫面中檢測出人臉,則觸發拍照。這樣做的效果能夠獲得更高的,同時還能完成更遠距離臉部的捕獲。 因為項目原因,需要使用人臉檢測(face detection)功能。身為一名前JAVA業務程序員和現前端程序員,這樣的功能還是陌生的領域。那能不能...
摘要:十開放模式識別項目開放模式識別項目,致力于開發出一套包含圖像處理計算機視覺自然語言處理模式識別機器學習和相關領域算法的函數庫。 一、開源生物特征識別庫 OpenBROpenBR 是一個用來從照片中識別人臉的工具。還支持推算性別與年齡。使用方法:$ br -algorithm FaceRecognition -compare me.jpg you.jpg二、計算機視覺庫 OpenCVOpenC...
閱讀 3973·2021-10-09 09:43
閱讀 2880·2021-10-08 10:05
閱讀 2740·2021-09-08 10:44
閱讀 889·2019-08-30 15:52
閱讀 2817·2019-08-26 17:01
閱讀 3024·2019-08-26 13:54
閱讀 1657·2019-08-26 10:48
閱讀 815·2019-08-23 14:41