【问题标题】:OpenCV: Shift/Align face image relative to reference Image (Image Registration)OpenCV:相对于参考图像移动/对齐面部图像(图像配准)
【发布时间】:2012-12-03 00:38:05
【问题描述】:

我是 OpenCV2 的新手,正在从事一个情绪识别项目,并希望将面部图像与参考面部图像对齐。我想在转向旋转之前让图像翻译工作。当前的想法是在 x 和 y 坐标的有限范围内运行搜索,并使用平方差之和作为误差度量来选择最佳 x/y 参数来对齐图像。我正在使用 OpenCV face_cascade 函数来检测人脸图像,所有图像都被调整为固定的(128x128)。问题:我需要修改 Mat 图像的哪些参数才能在 x 和 y 轴上沿正/负方向移动图像?我相信 Mat 数据类型不再支持 setImageROI?我有两张脸的 ROI,但我不确定如何使用它们。

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 Working on Windows with OpenCV 2.4。任何建议都非常感谢。

【问题讨论】:

标签: c++ image-processing opencv translate face-recognition


【解决方案1】:

cv::Mat 确实支持 ROI。 (但它不支持 COI - 感兴趣的渠道。)

要应用 ROI,您可以使用 operator() 或特殊构造函数:

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

您可以使用matchTemplate 函数来找到置换图像中的最佳位置。


根据您的 cmets,我可以建议以下代码,它将在第二个(置换的)补丁附近找到参考补丁的最佳位置:

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));

【讨论】:

  • 感谢您的帮助!我现在已经实现了模板匹配,但是当我输出结果矩阵时,它显示为一个点!? aligned.cols 为 1,aligned.rows 为 1!值得一提的是,这两个图像的大小相同,但并不完全是“相同”的图像。 refimg 是一个中性的表情/ dispimg 是一个微笑的表情。您认为这仍然会匹配,还是导致结果矩阵成为点的问题?请查看更新的代码
  • 当图像大小相同时,它应该是点 - 它在文档中。而且,如果您的图像具有相同的大小,那么您根本就没有什么可以对齐的(或者我没有得到您想要做的事情)。在调用 matchTemplate 之前,您可能需要为移位的图像添加一些边距。
  • 是的,图像具有相同的大小,但是第二张图像上的面部略低于第一张,导致当我使用 addWeighted 输出叠加层时眼睛未对齐。因此,我想向上“推”第二张图像以对齐眼睛区域。
  • 谢谢,正在尝试实施更改。根据您的专业知识,您认为这也适用于对齐不同的面孔(男性/女性)吗?
  • 您好!有趣的帖子。在原始函数 void alignImage(vector faceROIstore, vector faceIMGstore) 中,参数的含义是什么?
猜你喜欢
  • 2014-01-02
  • 2013-12-06
  • 2020-04-30
  • 2015-05-16
  • 2019-11-09
  • 1970-01-01
  • 1970-01-01
  • 2014-04-13
  • 2020-06-04
相关资源
最近更新 更多