2012-04-11 5 views
0

Я хотел бы сопоставить один треугольник внутри мата OpenCV с другим, похожий на warpAffine (проверьте его here), но вместо треугольников вместо квадратиков, чтобы использовать его в треугольная триангуляция.OpenCV деформирование от одного треугольника к другому

Я знаю, что один может использовать маску, но я хотел бы знать, есть ли лучшее решение.

С наилучшими пожеланиями, Daniel

ответ

0

Вы должны использовать getAffineTransform найти преобразование, и использовать warpAffine применять его

+0

Привет, vasile, я бы использовал getAffineTransform(), а затем warpAffine(), но warpAffine преобразует все изображение. Я просто хочу, чтобы один треугольник был преобразован. Было бы хорошо, если бы я мог установить ROI как треугольник, но я не думаю, что этот вариант существует. – dannyxyz22

+0

Вам нужно преобразовать новое изображение, а затем скопировать его с помощью маски. Или измените warpAffine для удовлетворения ваших потребностей. – Sam

+0

Или лучше попробуйте сделать это с помощью BorderTransparent. Это может сработать ... – Sam

4

enter image description here Я скопировал выше изображение и следующий 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; 

} 
+0

Ницца. Мне нравится ваша работа на LearnOpenCV.com, это скалы :) Спасибо. – dannyxyz22

+0

Спасибо за добрые слова! +1 +1 на этот ответ будет очень приятным: P –

Смежные вопросы