【问题标题】:Passing Point2f [] as arguments for getAffineTransform() in Javacv将 Point2f [] 作为 Javacv 中 getAffineTransform() 的参数传递
【发布时间】:2015-07-02 12:23:54
【问题描述】:

我正在尝试使用 javacv 在 java 中找到 here 的面部对齐实现 C++ 位,但我被困在如何通过

point2f[] 在 getAffineTransform() 中作为 point2f。

这是我能想到的;

    //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。甚至有可能这样做吗? 如何将地标放入可以在 getAfflineTransform() 中作为参数接受的 Point2f 中?

非常感谢您在此处导航方面的帮助。

【问题讨论】:

    标签: java c++ opencv javacv affinetransform


    【解决方案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 文件以获取带有 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) );
    

    【讨论】:

    • 感谢您的回答。然而,我注意到 imshow("warp_dst", warp_dst);当我使用 warp_mat = getAffineTransform( srcTri.position(0), dstTri.position(0) ); 时显示相同的 src 图像而没有任何转换当我使用 warp_mat = getAffineTransform(srcTri, dstTri);人脸图像异常拉伸。在 getAffineTransform 中我有什么遗漏或做错了吗?这是唯一让我感到困惑的地方,否则你的解决方案会让我更接近我的预期结果。
    • 实际上,我并不熟悉所有 opencv 的东西。但我可以建议,由于srcTridstTri 具有所有相同的坐标(如您的代码中所示),因此没有转换是预期的结果。
    • 是的。我想到了。我的 'srcTri' 和 'dstTri' 是坐标,彼此没有什么不同。你的方法是正确的。谢谢。
    猜你喜欢
    • 2019-03-26
    • 2020-09-18
    • 2015-05-24
    • 2012-11-10
    • 2020-10-30
    • 2014-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多