Я скопировал выше изображение и следующий C++ код из моего поста Warp one triangle to another using OpenCV (C++/Python) , Комментарии в приведенном ниже коде должны дать хорошее представление о том, что происходит. Для получения более подробной информации и для кода python вы можете посетить приведенную выше ссылку. Все пиксели внутри треугольника tri1 в img1 преобразуются в треугольник tri2 в img2. Надеюсь это поможет.
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;
}
Привет, vasile, я бы использовал getAffineTransform(), а затем warpAffine(), но warpAffine преобразует все изображение. Я просто хочу, чтобы один треугольник был преобразован. Было бы хорошо, если бы я мог установить ROI как треугольник, но я не думаю, что этот вариант существует. – dannyxyz22
Вам нужно преобразовать новое изображение, а затем скопировать его с помощью маски. Или измените warpAffine для удовлетворения ваших потребностей. – Sam
Или лучше попробуйте сделать это с помощью BorderTransparent. Это может сработать ... – Sam