成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

用OpenCV在瀏覽器進(jìn)行人臉檢測

zengdongbao / 2832人閱讀

摘要:最近上了,這是一個小巧的人臉檢測庫,行,大小,性能很好,效果也還還行。于是我想有沒其他的能在瀏覽器跑的人臉檢測庫,一查才發(fā)現(xiàn)已經(jīng)支持編譯到,也就可以直接在瀏覽器里使用了。

最近picojs上了Github Trending,這是一個小巧的人臉檢測庫,200行JS,2K大小,性能很好,效果也還還行。于是我想有沒其他的能在瀏覽器跑的人臉檢測庫,一查才發(fā)現(xiàn)OpenCV已經(jīng)支持編譯到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轉(zhuǎn)成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.jsopencv_js.wasm,可以復(fù)制到其他地方使用,而opencv_js.js是中間生成的asm.js,可以忽略。

加載OpenCV

我們可以直接在HTML頁面里引用opencv.js,它會自動加載opencv_js.wasm然后完成編譯。遇到的第一個問題是,opencv.js默認(rèn)會加載根目錄的opencv_js.wasm,而我們通常會把js文件放在二級目錄里。第二個問題是,我們的代碼必須在OpenCV編譯完成之后才能調(diào)用,不會代碼就直接出錯了。

更新2018-08-20:在Emscripten v1.38.9,locateFile行為已經(jīng)修改,不需要這個hack了。

為了解決以上的問題,要通過Module進(jìn)行配置:


Module是Emscripten生成的全局對象,通過它可以配置和調(diào)用Emscripten的API。例如locateFile用配置文件的實(shí)際URL。

preRun會在初始化前前調(diào)用,在這個時候,OpenCV還沒初始化,我們可以先用Emscripten的文件系統(tǒng)API預(yù)加載之后會用的文件,這里我加載了一個預(yù)訓(xùn)練好的模型data/haarcascade_frontalface_default.xml,存放在Emscripten文件系統(tǒng)的"/face.xml"。

postRun會在初始化完成之后執(zhí)行,這時候OpenCV編譯完成,可以使用cv模塊了。

獲取攝像頭圖像

首先我們需要一個video標(biāo)簽,然后打開攝像頭:

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來讀取攝像頭了:

// 創(chuàng)建VideoCapture
let cap = new cv.VideoCapture(video);
// 創(chuàng)建存放圖像的Mat
let src = new cv.Mat(videoHeight, videoWidth, cv.CV_8UC4);
// 讀一幀圖像
cap.read(src);
Haar Cascades人臉檢測

創(chuàng)建人臉檢測器:

faceCascade = new cv.CascadeClassifier();
faceCascade.load("face.xml")

接著就可以循環(huán)讀取圖像,檢查人臉,顯示了:

// 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

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/94673.html

相關(guān)文章

  • Python中使OpenCV進(jìn)行人臉檢測

    摘要:總結(jié)在本文中,我們學(xué)習(xí)了如何使用中的,即通過代碼寫了一個人臉檢測的程序。 OpenCV是如今最流行的計(jì)算機(jī)視覺庫,而我們今天就是要學(xué)習(xí)如何安裝使用OpenCV,以及如何去訪問我們的攝像頭。然后我們一起來看看寫一個人臉檢測程序是如何地簡單,簡單到只需要幾行代碼。 在開始之前,我假設(shè)你已經(jīng)對Python有一定的了解。當(dāng)然,如果你覺得你還不夠格,這里有推薦一些學(xué)習(xí)Python的電子書,你可以...

    stefanieliang 評論0 收藏0
  • 前端工程師做Face Detection

    摘要:身為一名前業(yè)務(wù)程序員和現(xiàn)前端程序員,這樣的功能還是陌生的領(lǐng)域。需求使用加攝像頭,通過人臉檢測,完成自動拍照功能。在的屏幕上,顯示攝像頭的實(shí)時畫面,要是畫面中檢測出人臉,則觸發(fā)拍照。這樣做的效果能夠獲得更高的,同時還能完成更遠(yuǎn)距離臉部的捕獲。 因?yàn)轫?xiàng)目原因,需要使用人臉檢測(face detection)功能。身為一名前JAVA業(yè)務(wù)程序員和現(xiàn)前端程序員,這樣的功能還是陌生的領(lǐng)域。那能不能...

    nodejh 評論0 收藏0
  • 機(jī)器視覺、模式識別庫匯總

    摘要:十開放模式識別項(xiàng)目開放模式識別項(xiàng)目,致力于開發(fā)出一套包含圖像處理計(jì)算機(jī)視覺自然語言處理模式識別機(jī)器學(xué)習(xí)和相關(guān)領(lǐng)域算法的函數(shù)庫。 一、開源生物特征識別庫 OpenBROpenBR 是一個用來從照片中識別人臉的工具。還支持推算性別與年齡。使用方法:$ br -algorithm FaceRecognition -compare me.jpg you.jpg二、計(jì)算機(jī)視覺庫 OpenCVOpenC...

    habren 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<