2012-12-15 36 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