こんにちは、opencv と c++ を使用しています。私は左の横顔と正面の顔が同じ人物です。顔画像間の変換行列を決定し、その変換行列を左の画像に適用した後、元の正面顔に重ねると、すべてが揃ったこのような顔が得られたはずではありませんか?私は明らかにやっています何かが間違っていて、この結果を得てい
ます。誰でもこれを手伝ってもらえますか?その研究論文へのリンクは次のとおりですhttp://www.utdallas.edu/~herve/abdi-ypaa-jmm2006.pdf
2 に答える
4
レジストレーション手順は機能している可能性がありますが、位置合わせに使用する機能をより適切に定義する必要があるか、または変形が大きすぎる画像を使用しています。
- 小さい(カラー)画像では、目が揃っています。
- 大きな(グレーの)画像では、顔の一部が正しく位置合わせされているように見えますが、目はそうではありません(たとえば)。
目と口を揃えることが目標の場合は、目と口を検出し、それらをテンプレートに揃える 2D (アフィンまたはホモグラフィック) マッピングを適用する必要があります。目標が緑/青のポイントを揃えることである場合は、それらを使用して 2D マッピング エスティメータをフィードする必要がありますが、この場合、目、口などが揃っているという保証はありません。ポイントのみを配置する必要があります。マッチ。
于 2014-02-11T10:18:56.103 に答える
0
以前の質問の1つから画像を取得し、手動で緑色のドットのみのピクセル対応を見つけ(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);
代わりに線を使用し、青いマーカーも使用すると、次のようになります。
edit : C++ 構文ですが、C# と Java で同様に機能すると思います。
于 2014-02-11T13:26:27.543 に答える