2015-07-02 1 views
1

Я пытаюсь осуществить выравнивание лица реализации C++ бит найден here в Java с помощью javacv, но я застрял на том, как передатьПередача Point2f [] в качестве аргументов для getAffineTransform() в Javacv

point2f [], как point2f в getAffineTransform().

Это то, что я смог придумать;

//face alignment begin 
Point2f[] srcTri = new Point2f[3]; 
Point2f[] dstTri = new Point2f[3]; 

Mat src_mat= new Mat(orig); 
Mat dst_mat= new Mat(input); 
Mat warp_mat = new Mat(2, 3, CV_32FC1); 

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

//Set your 3 points to calculate the Affine Transform 
srcTri[0] = new Point2f((float)landmarks[5*2], (float)landmarks[5*2+1]); 
srcTri[1] = new Point2f((float)landmarks[6*2], (float)landmarks[6*2+1]); 
srcTri[2] = new Point2f((float)landmarks[0*2], (float)landmarks[0*2+1]); 

dstTri[0] = new Point2f((float)landmarks[5*2], (float)landmarks[5*2+1]); 
dstTri[1] = new Point2f((float)landmarks[6*2], (float)landmarks[6*2+1]); 
dstTri[2] = new Point2f((float)landmarks[0*2], (float)landmarks[0*2+1]); 

//Get the Affine Transform 
warp_mat = getAffineTransform(srcTri, dstTri); //This is where I have problems. getAffineTransform() expects Point2f but I have Point2f[] 

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

//show images 
imshow("src", src_mat); 
imshow("dst", dst_mat); 
imshow("warp_dst", warp_dst); 
waitKey(0); 

//face alignment end 

Кто-то пожалуйста, покажите мне, как я должен пройти srcTri и dstTri, как Point2f к getAffineTransform() или как преобразовать Point2f [] в Point2f. Возможно ли это сделать? Как получить ориентиры в Point2f, которые могут быть приняты в качестве аргумента в getAfflineTransform()?

Я с радостью буду признателен за помощь в навигации.

ответ

1

Я считаю, что здесь есть ответ: https://groups.google.com/d/msg/javacv/dbWTNCHFyeg/Q6k59GPavgsJ:

Point2f является Pointer, который работает как родной массив: http://bytedeco.org/javacpp-presets/opencv/apidocs/org/bytedeco/javacpp/opencv_core.Point2f.html

И мы можем сделать что-то подобное с Pointer, чтобы получить доступ к элементы собственного массива: http://bytedeco.org/javacpp/apidocs/org/bytedeco/javacpp/Pointer.html#position-int-

Проверьте файл README для примера e с CvPoint: https://github.com/bytedeco/javacv#sample-usage Теперь сделайте то же самое, , но с Point2f.

Так что ваш код должен быть изменен следующим образом:

Point2f srcTri = new Point2f(3); 
Point2f dstTri = new Point2f(3); 

// ... 

srcTri.position(0).x((float)landmarks[5*2]).y((float)landmarks[5*2+1]); 
srcTri.position(1).x((float)landmarks[6*2]).y((float)landmarks[6*2+1]); 
srcTri.position(2).x((float)landmarks[0*2]).y((float)landmarks[0*2+1]); 
// and do the same for dstTri 

warp_mat = getAffineTransform(srcTri.position(0), dstTri.position(0)); 
+0

Спасибо за ваш ответ. Однако я заметил, что imshow («warp_dst», warp_dst); отображает одно и то же изображение src без каких-либо преобразований, когда я использую warp_mat = getAffineTransform (srcTri.position (0), dstTri.position (0)); Когда я использую warp_mat = getAffineTransform (srcTri, dstTri); изображение лица растягивается ненормально. Есть ли что-то, что я пропускаю или делаю неправильно в getAffineTransform? Это единственный оставшийся бит, который меня перепутал, иначе ваше решение приблизило меня ближе к ожидаемому результату. –

+0

На самом деле, я не знаком со всем этим материалом в opencv. Но я могу предположить, что, поскольку 'srcTri' имеет все те же координаты, что и' dstTri' (как видно из вашего кода), никакое преобразование не является ожидаемым результатом. – Roman

+0

Правда. Я понял. Мои координаты «srcTri» и «dstTri» не отличались друг от друга. Ваш подход правильный. Спасибо. –

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