2

warpAffine とほぼ同じように、OpenCV Mat 内の 1 つの三角形を別の三角形にマップしたいと思います (ここで確認してください) が、Delaunay 三角形分割で使用するために、四角形ではなく三角形の場合です。

マスクを使用できることは知っていますが、より良い解決策があれば知りたいです。

4

2 に答える 2

8

ここに画像の説明を入力 上記の画像と次の C++ コードを投稿からコピーしましたOpenCV (C++ / Python ) を使用して 1 つの三角形を別の三角形にワープします。以下のコードのコメントは、何が起こっているかをよく示しているはずです。詳細と Python コードについては、上記のリンクにアクセスしてください。img1 の三角形 tri1 内のすべてのピクセルは、img2 の三角形 tri2 に変換されます。お役に立てれば。

void warpTriangle(Mat &img1, Mat &img2, vector<Point2f> tri1, vector<Point2f> tri2)
{
    // Find bounding rectangle for each triangle
    Rect r1 = boundingRect(tri1);
    Rect r2 = boundingRect(tri2);

   // Offset points by left top corner of the respective rectangles
   vector<Point2f> tri1Cropped, tri2Cropped;
   vector<Point> tri2CroppedInt;
   for(int i = 0; i < 3; i++)
   {
      tri1Cropped.push_back( Point2f( tri1[i].x - r1.x, tri1[i].y -  r1.y) );
      tri2Cropped.push_back( Point2f( tri2[i].x - r2.x, tri2[i].y - r2.y) );

      // fillConvexPoly needs a vector of Point and not Point2f
      tri2CroppedInt.push_back( Point((int)(tri2[i].x - r2.x), (int)(tri2[i].y - r2.y)) );

   }

   // Apply warpImage to small rectangular patches
   Mat img1Cropped;
   img1(r1).copyTo(img1Cropped);

   // Given a pair of triangles, find the affine transform.
   Mat warpMat = getAffineTransform( tri1Cropped, tri2Cropped );

   // Apply the Affine Transform just found to the src image
   Mat img2Cropped = Mat::zeros(r2.height, r2.width, img1Cropped.type());
   warpAffine( img1Cropped, img2Cropped, warpMat, img2Cropped.size(), INTER_LINEAR, BORDER_REFLECT_101);

   // Get mask by filling triangle
   Mat mask = Mat::zeros(r2.height, r2.width, CV_32FC3);
   fillConvexPoly(mask, tri2CroppedInt, Scalar(1.0, 1.0, 1.0), 16, 0);

  // Copy triangular region of the rectangular patch to the output image
  multiply(img2Cropped,mask, img2Cropped);
  multiply(img2(r2), Scalar(1.0,1.0,1.0) - mask, img2(r2));
  img2(r2) = img2(r2) + img2Cropped;

}
于 2016-05-19T13:51:25.337 に答える
-2

変換を見つけるにはgetAffineTransformを使用し、それを適用するには warpAffine を使用する必要があります。

于 2012-04-11T06:23:21.110 に答える