2012-12-15 39 views
2

我是OpenCV2的新手,正在從事情感識別項目,並希望調整與參考臉部圖像相關的臉部圖像。我希望在移動到旋轉之前讓圖像翻譯工作。當前的想法是在有限的範圍內在x和y座標上運行搜索,並使用平方差的和作爲誤差度量來選擇最佳的x/y參數來對齊圖像。我使用OpenCV face_cascade函數檢測臉部圖像,所有圖像都調整爲固定尺寸(128x128)。問題:我需要修改Mat圖像的哪些參數,以在x軸和y軸上以正/負方向移動圖像?我相信mat數據類型不再支持setImageROI?我有兩個面孔的投資回報率,但我不確定如何使用它們。OpenCV:移動/對齊臉部圖像相對於參考圖像(圖像註冊)

void alignImage(vector<Rect> faceROIstore, vector<Mat> faceIMGstore) 
{ 
    Mat refimg = faceIMGstore[1]; //reference image 
    Mat dispimg = faceIMGstore[52]; // "displaced" version of reference image 
    //Rect refROI = faceROIstore[1]; //Bounding box for face in reference image 
    //Rect dispROI = faceROIstore[52]; //Bounding box for face in displaced image 
    Mat aligned; 

    matchTemplate(dispimg, refimg, aligned, CV_TM_SQDIFF_NORMED); 
    imshow("Aligned image", aligned); 
} 

這種方法的想法是基於Image Alignment Tutorial by Richard Szeliski在Windows上使用OpenCV 2.4進行工作。任何建議,非常感謝。

+0

喜abhischek我有同樣的問題你..請你指導我在這個http://stackoverflow.com/questions/22296058/align-profile-face-image-with-its-frontal-face-image? – Steph

回答

2

cv::Mat確實支持投資回報率。 (但它不支持COI - 通道的利益。)

要應用的投資回報率,您可以使用operator()或特殊的構造:

Mat refimgROI = faceIMGstore[1](faceROIstore[1]); //reference image ROI 
Mat dispimgROI(faceIMGstore[52], faceROIstore[52]); // "displaced" version of reference image ROI 

,並找到你可以利用移動圖像內的最佳位置matchTemplate功能。


根據您的意見,我可以建議如下代碼,會發現參照塊附近的第二(移動)貼片的最佳位置!

Mat ref = faceIMGstore[1](faceROIstore[1]); 
Mat disp = faceIMGstore[52](faceROIstore[52]); 

disp = disp.adjustROI(5,5,5,5); //allow 5 pixel max adjustment in any direction 
if(disp.cols < ref.cols || disp.rows < ref.rows) 
    return 0; 
Mat map; 
cv::matchTemplate(disp, ref, map, CV_TM_SQDIFF_NORMED); 

Point minLoc; 
cv::minMaxLoc(map, 0, &minLoc); 

Mat adjusted = disp(Rect(minLoc.x, minLoc.y, ref.cols, ref.rows)); 
+0

感謝您的幫助!我現在已經實現了模板匹配,但是當我輸出結果矩陣時,它顯示爲一個點!? aligned.cols是1並且對齊.rows是1!值得一提的是,兩幅圖像的大小相同,但不完全是「相同」圖像。 refimg是一箇中性表達/ dispimg是一個微笑的表達。你認爲這樣做還是會有結果嗎?或者這是導致結果矩陣成爲點的問題嗎?請參閱更新代碼 – Abhischek

+0

當圖像具有相同的大小時,預計會成爲點 - 它在文檔中。如果你的圖像尺寸相同,那麼你根本沒有什麼可以對齊的(或者我沒有得到你想要做的)。在調用matchTemplate之前,可能需要在移動的圖像上添加一些邊距。 –

+0

是的圖像具有相同的大小,但第二張圖像上的人臉比第一張人臉稍低,導致使用addWeighted輸出疊加層時眼睛未對齊。因此,我想向上「推」第二個圖像以對齊眼睛區域。 – Abhischek