Я пытаюсь реализовать реализацию выравнивания лица C ++ бит найден Вот в Java, используя 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 ()?
Я с радостью оценю вашу помощь по навигации здесь.
Я считаю, что вот ответ: 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 для примера с
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) );