2015-11-06 1 views
0

Я работаю над проектом «Нормализация лица». То, что я сделал до сих пор:Как обрезать треугольник

  1. обнаружение лица
  2. лица Обнаружение Landmark (68)
  3. Разделить лицо нескольких треугольников, соединяющие несколько достопримечательностей (Триангуляция Делона -> AAM)
  4. Создание некоторые 3D-модели родового лица (состоит из 68 (так же, как ориентиры) Точки) в 3D, а также сделал некоторые триангуляционную

Теперь то, что мне нужно сделать сейчас: Я знаю все координаты Landmark и все 3D-координаты, поэтому я хочу обрезать каждый треугольник в 2D и поместить его в нужное место на 3D-модели для создания 3D-модели обнаруженного лица.

Вопрос: 1.) Кто-нибудь знает способ обрезки одного треугольника, зная все три соглашения? 2.) И какое преобразование я должен использовать, чтобы «скопировать» обрезанный треугольник в нужное место на общей 3D-модели?

Я программирования в C++ и взял dlib и OpenCV для обнаружения знакового лица и на 3D стороне Я работаю с OPENGL

EDIT: Может быть, это лучше «видеть» проблему. Это то, что я уже

enter image description here

и теперь я просто хочу, чтобы обрезать все эти треугольники seperatly. Так как я могу обрезать треугольник (когда я знаю все 3 коорда) с рисунка и безопасно его в другом окне?

ответ

0

Для обрезки треугольника нам необходимо использовать метод warpaffine.

http://docs.opencv.org/2.4/doc/tutorials/imgproc/imgtrans/warp_affine/warp_affine.html

#include "opencv2/highgui/highgui.hpp" 
#include "opencv2/imgproc/imgproc.hpp" 
#include <iostream> 
#include <stdio.h> 

using namespace cv; 
using namespace std; 

/// Global variables 
char* source_window = "Source image"; 
char* warp_window = "Warp"; 
char* warp_rotate_window = "Warp + Rotate"; 

/** @function main */ 
int main(int argc, char** argv) 
{ 
    Point2f srcTri[3]; 
    Point2f dstTri[3]; 

    Mat rot_mat(2, 3, CV_32FC1); 
    Mat warp_mat(2, 3, CV_32FC1); 
    Mat src, warp_dst, warp_rotate_dst; 

    /// Load the image 
    src = imread(argv[1], 1); 

    /// Set the dst image the same type and size as src 
    warp_dst = Mat::zeros(src.rows, src.cols, src.type()); 

    /// Set your 3 points to calculate the Affine Transform 
    srcTri[0] = Point2f(0,0); 
    srcTri[1] = Point2f(src.cols - 1, 0); 
    srcTri[2] = Point2f(0, src.rows - 1); 

    dstTri[0] = Point2f(src.cols*0.0, src.rows*0.33); 
    dstTri[1] = Point2f(src.cols*0.85, src.rows*0.25); 
    dstTri[2] = Point2f(src.cols*0.15, src.rows*0.7); 

    /// Get the Affine Transform 
    warp_mat = getAffineTransform(srcTri, dstTri); 

    /// Apply the Affine Transform just found to the src image 
    warpAffine(src, warp_dst, warp_mat, warp_dst.size()); 

    /** Rotating the image after Warp */ 

    /// Compute a rotation matrix with respect to the center of the image 
    Point center = Point(warp_dst.cols/2, warp_dst.rows/2); 
    double angle = -50.0; 
    double scale = 0.6; 

    /// Get the rotation matrix with the specifications above 
    rot_mat = getRotationMatrix2D(center, angle, scale); 

    /// Rotate the warped image 
    warpAffine(warp_dst, warp_rotate_dst, rot_mat, warp_dst.size()); 

    /// Show what you got 
    namedWindow(source_window, CV_WINDOW_AUTOSIZE); 
    imshow(source_window, src); 

    namedWindow(warp_window, CV_WINDOW_AUTOSIZE); 
    imshow(warp_window, warp_dst); 

    namedWindow(warp_rotate_window, CV_WINDOW_AUTOSIZE); 
    imshow(warp_rotate_window, warp_rotate_dst); 

    /// Wait until user exits the program 
    waitKey(0); 

    return 0; 
    } 
+0

Спасибо за вашу помощь сейчас, но это мое не понимание этого Methode или вы поняли мой вопрос не так? –

+1

Измените свой вопрос, чтобы добавить более подробную информацию. –