您好我正在使用opencv和c ++。我有一个左侧轮廓和同一个人的正面。如果在确定人脸图像之间的变换矩阵并将该变换矩阵应用于左图像之后,当我将其叠加在原始正面上时,它不应该给我一张像这样的脸,所有对齐的?我显然做错了,得到了这个结果。任何人都可以帮忙吗?这是研究论文http://www.utdallas.edu/~herve/abdi-ypaa-jmm2006.pdf
的链接答案 0 :(得分:4)
注册程序可能有效,但您需要更好地定义要用于对齐的功能,或者使用变形太大的图像。
如果您的目标是让眼睛和嘴巴对齐,那么您应该检测它们并应用一些2D(仿射或同形)映射,使它们与您的模板对齐。如果您的目标是使绿色/蓝色点对齐,那么您需要使用它们来提供2D映射估算器,但在这种情况下,将无法保证眼睛,嘴等对齐:只有点应该匹配。
答案 1 :(得分: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类似。