Я пытаюсь осуществить выравнивание лица реализации 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()?
Я с радостью буду признателен за помощь в навигации.
Спасибо за ваш ответ. Однако я заметил, что imshow («warp_dst», warp_dst); отображает одно и то же изображение src без каких-либо преобразований, когда я использую warp_mat = getAffineTransform (srcTri.position (0), dstTri.position (0)); Когда я использую warp_mat = getAffineTransform (srcTri, dstTri); изображение лица растягивается ненормально. Есть ли что-то, что я пропускаю или делаю неправильно в getAffineTransform? Это единственный оставшийся бит, который меня перепутал, иначе ваше решение приблизило меня ближе к ожидаемому результату. –
На самом деле, я не знаком со всем этим материалом в opencv. Но я могу предположить, что, поскольку 'srcTri' имеет все те же координаты, что и' dstTri' (как видно из вашего кода), никакое преобразование не является ожидаемым результатом. – Roman
Правда. Я понял. Мои координаты «srcTri» и «dstTri» не отличались друг от друга. Ваш подход правильный. Спасибо. –