2017-06-19 73 views
1

這聽起來很簡單,但它非常棘手。我使用NodeJS OpenCV從圖片中識別出臉部的X和Y.Nodejs OpenCV在人臉檢測上重疊圖像

從例子:

cv.readImage("./files/mona.png", function(err, im){ 
    if (err) throw err; 
    if (im.width() < 1 || im.height() < 1) throw new Error('Image has no size'); 

    im.detectObject("../data/haarcascade_frontalface_alt.xml", {}, function(err, faces){ 
    if (err) throw err; 

    for (var i = 0; i < faces.length; i++){ 
     var face = faces[i]; 
     im.ellipse(face.x + face.width/2, face.y + face.height/2, face.width/2, face.height/2); 
    } 

    im.save('./tmp/face-detection.png'); 
    console.log('Image saved to ./tmp/face-detection.png'); 
    }); 
}); 

我不想一個橢圓添加到圖像,我想補充的圖像ontop的人的臉。我該怎麼做呢?

使用OpenCV,我試着創建一個緩衝區矩陣併合並來自2張圖片的數據。這真的很複雜。我現在正在研究Node Canvas,但我會認爲OpenCV會爲此提供一個簡單的解決方案。任何人都有一些示例代碼可以做到嗎?

感謝

回答

0

可以實現,使用功能CopyTo從()當前在節點的OpenCV提供,僅僅作爲參數指示目標圖像與要應用ROI(感興趣區域)第二個圖像。

NAN_METHOD(Matrix::CopyTo) { 
Nan::HandleScope scope; 

Matrix * self = Nan::ObjectWrap::Unwrap<Matrix>(info.This()); 
int width = self->mat.size().width; 
int height = self->mat.size().height; 

// param 0 - destination image: 
Matrix *dest = Nan::ObjectWrap::Unwrap<Matrix>(info[0]->ToObject()); 
// param 1 - x coord of the destination 
int x = info[1]->IntegerValue(); 
// param 2 - y coord of the destination 
int y = info[2]->IntegerValue(); 

cv::Mat dstROI = cv::Mat(dest->mat, cv::Rect(x, y, width, height)); 
self->mat.copyTo(dstROI); 

return;} 

我強烈建議你看看源代碼,因爲這個庫沒有記錄。

它應該工作

overlapImage.copyTo(sourceImage, x, y, width, height);