1

嗨,我正在使用 opencv 和 c++。我有同一个人的左侧轮廓和正面。如果在确定面部图像之间的变换矩阵并将该变换矩阵应用到左图像之后,当我将它叠加在原始正面的脸上时,它不应该给我这样的脸期望的结果,一切都对齐吗?我显然在做出了点问题,得到了这个结果在此处输入图像描述。有人可以帮忙吗?这是该研究论文的链接http://www.utdallas.edu/~herve/abdi-ypaa-jmm2006.pdf

4

2 回答 2

4

配准过程可能有效,但您需要更好地定义要用于对齐的特征,或者您正在使用变形过大的图像。

  • 在小(彩色)图像中,眼睛是对齐的。
  • 在大(灰色)图像中,脸部的某些部分似乎正确对齐,但眼睛却没有(例如)。

如果您的目标是让眼睛和嘴巴对齐,那么您应该检测它们并应用一些 2D(仿射或单应)映射将它们与您的模板对齐。如果您的目标是对齐绿/蓝点,那么您需要使用它们来馈送 2D 映射估计器,但在这种情况下,不能保证眼睛、嘴巴等对齐:只有点应该匹配。

于 2014-02-11T10:18:56.103 回答
0

从您之前的一个问题中获取图像,仅手动查找绿点的像素对应关系(因此 3 个对应关系)和此代码

//cv::Mat perspectiveTransform = cv::getPerspectiveTransform(firstFacePositions, secondFacePositions) ;
cv::Mat affineTransform = cv::getAffineTransform(firstFacePositions, secondFacePositions) ;
std::cout << affineTransform << std::endl;
cv::Mat perspectiveTransform = cv::Mat::eye(3,3,CV_64FC1);
for(unsigned int y=0; y<2; ++y)
    for(unsigned int x=0; x<3; ++x)
    {
        perspectiveTransform.at<double>(y,x) = affineTransform.at<double>(y,x);
    }

std::cout << perspectiveTransform << std::endl;

cv::Mat warped1;
cv::warpPerspective(face1,warped1,perspectiveTransform,face2.size());

cv::imshow("combined",warped1/2 + face2/2);

我得到以下结果:

在此处输入图像描述

改用这条线cv::Mat perspectiveTransform = cv::getPerspectiveTransform(firstFacePositions, secondFacePositions);并使用蓝色标记,我得到:

在此处输入图像描述

编辑:C++ 语法,但我猜这与 C# 和 Java 类似。

于 2014-02-11T13:26:27.543 回答