平滑的前景提取

时间:2018-02-16 11:35:08

标签: javascript opencv

我正在努力做几天顺利的前景提取。我尝试了很多东西,但似乎没有任何工作;(;(

我只想像这样顺利提取人体:https://www.youtube.com/watch?v=rGMqXBvYxog

1-)我使用Morphological Transformations和BackgroundSubstraction来做到这一点。 Documentation说 "打开以消除背景噪音并关闭图像以关闭前景物体内的小孔"但它没有用;(

没有结束和开幕:https://streamable.com/xh368

结束并开幕:https://streamable.com/bixmm

关闭并打开Javascript代码:

let video = document.getElementById('videoInput');
let cap = new cv.VideoCapture(video);

let frame = new cv.Mat(video.height, video.width, cv.CV_8UC4);
let fgmask = new cv.Mat(video.height, video.width, cv.CV_8UC1);
let fgbg = new cv.BackgroundSubtractorMOG2(500, 16,false);

const FPS = 30;
function processVideo() {
    try {
        if (!streaming) {
            // clean and stop.
            frame.delete(); fgmask.delete(); fgbg.delete();
            return;
        }
        let begin = Date.now();
        // start processing.
        cap.read(frame);
        fgbg.apply(frame, fgmask); //Apply Background Substraction
        cv.bitwise_not(fgmask,fgmask);//Set background color black and foreground color white for Morphological Transformations
        let M = cv.Mat.ones(5,5, cv.CV_8U); 
        let anchor = new cv.Point(-1, -1);
    cv.morphologyEx(fgmask, fgmask, cv.MORPH_OPEN, M, anchor, 1,
        cv.BORDER_CONSTANT, cv.morphologyDefaultBorderValue());
    cv.morphologyEx(fgmask,fgmask, cv.MORPH_CLOSE, M);
        frame.copyTo(fgmask, fgmask);   //Copy original colors
        cv.imshow('canvasOutput', fgmask);
        // schedule the next one.
        let delay = 100/FPS - (Date.now() - begin);
        setTimeout(processVideo, delay);
    } catch (err) {
        utils.printError(err);
    }
};

// schedule the first one.
setTimeout(processVideo, 0);

完整HTML:https://anotepad.com/notes/ne7n4w

所有文件:https://files.fm/u/c9egsgqe

2 - ))我正在使用haarcascades来提取这种技术,就像这样:https://www.bytefish.de/blog/extracting_contours_with_opencv/

该算法按照以下5个步骤运行。这些算法不能很好地工作,因为有时候haar级联不能检测到对象 Javascript代码

let src = cv.imread('canvasInput');
let gray = new cv.Mat();
cv.cvtColor(src, gray, cv.COLOR_RGBA2GRAY, 0);
let faces = new cv.RectVector();
let poly=new cv.MatVector();
let faceCascade = new cv.CascadeClassifier();
faceCascade.load('haarcascade_frontalface_default.xml');
let msize = new cv.Size(0, 0);
faceCascade.detectMultiScale(gray, faces, 1.1, 3, 0, msize, msize);


//1-Create a mask with the rectangular coordinates
let rect = new cv.Rect(faces.get(0).x, faces.get(0).y,faces.get(0).width,faces.get(0).height);

//2-Mask out
dst = src.roi(rect);

//3-Edge detection using canny 
let cannyoutput=new cv.Mat();
cv.Canny(dst, cannyoutput, 0, 100, 3, true);

//4-Find contours
let contours = new cv.MatVector();
let hierarchy = new cv.Mat(); 
cv.findContours(cannyoutput,contours, hierarchy, cv.RETR_CCOMP, cv.CHAIN_APPROX_NONE);

//cv.drawContours(); 


cv.imshow('canvasOutput', cannyoutput);
src.delete(); gray.delete(); faceCascade.delete();
faces.delete(); 
contours.delete(); hierarchy.delete();

3-)我试图施加腐蚀然后dialatios,它没有工作。This Answer

没有侵蚀和膨胀:https://streamable.com/xh368

侵蚀和膨胀:https://streamable.com/fffsn

我的javascript代码:

let video = document.getElementById('videoInput');
let cap = new cv.VideoCapture(video);

let frame = new cv.Mat(video.height, video.width, cv.CV_8UC4);
let fgmask = new cv.Mat(video.height, video.width, cv.CV_8UC1);
let fgbg = new cv.BackgroundSubtractorMOG2(500, 16,false);

const FPS = 30;
function processVideo() {
    try {
        if (!streaming) {
            // clean and stop.
            frame.delete(); fgmask.delete(); fgbg.delete();
            return;
        }
        let begin = Date.now();
        // start processing.
        cap.read(frame);
        fgbg.apply(frame, fgmask);
        cv.bitwise_not(fgmask,fgmask);  
        let M = cv.Mat.ones(5,5, cv.CV_8U); 
        let anchor = new cv.Point(-1, -1);
        cv.erode(fgmask, fgmask, M, anchor, 1, 
        cv.BORDER_CONSTANT, cv.morphologyDefaultBorderValue());
        cv.dilate(fgmask, fgmask, M, anchor, 1, cv.BORDER_CONSTANT, 
        cv.morphologyDefaultBorderValue());
        frame.copyTo(fgmask, fgmask);   
        cv.imshow('canvasOutput', fgmask);
        // schedule the next one.
        let delay = 1000/FPS - (Date.now() - begin);
        setTimeout(processVideo, delay);
    } catch (err) {
        utils.printError(err);
    }
};

// schedule the first one.
setTimeout(processVideo, 0);

我的完整HTML:https://anotepad.com/notes/gg5esk

0 个答案:

没有答案