我正在尝试使图像变形的移动最小二乘方法,并且我有一个专门用于基于点变化which is basically this translated into Java计算网格变化的类。
我的执行代码是:
org.opencv.core.Rect leftFaceBounds = Imgproc.boundingRect(leftFacePointsNF);
//p = facial landmark points from original face acquired using OpenCV's Facemark contrib module
//q = same thing except for the destination face
double a = 2.0 ;
v = renderFaceOnlyMesh(leftFaceBounds, 30, 30);
Mat w = mlsAlgo.precomputeWeights(p, v, a);
Mat A = new Mat();
Mat fv = new Mat();
Vector<MovingLeastSquares.TypeA> tA;
MovingLeastSquares.TypeRigid mlsd;
mlsd = mlsAlgo.precomputeRigid(p, v, w);
fv = mlsAlgo.PointsTransformRigid(w,mlsd, q); //Generates the 'crumpled' mesh
//A = mlsAlgo.precomputeAffine(p, v, w);
//fv = mlsAlgo.PointsTransformAffine(w, A, q);
//tA = mlsAlgo.precomputeSimilar(p, v, w);
//fv = mlsAlgo.PointsTransformSimilar(w, tA, q);
//renderFrameDeformedGrid(mRgba, mRgba.cols(), mRgba.rows(), 80, 80, fv)
renderFaceDeformedGrid(mRgba, leftFaceBounds, 30, 30, fv);
基本上,我获取了由OpenCV的Facemark生成的原始人脸的68个界标点,在所述界标的边界框中生成了网格,然后根据点之间的变换生成了“皱缩的”网格。
我的问题是我不知道如何将整个网格扭曲到“皱缩的”网格中,我知道要获取透视透视扭曲矩阵,然后使用所述矩阵扭曲原始网格的每个正方形到每个对应的网格中。 crumpled
网格的平方不是最有效的答案(可能完全将相机预览挂起-900个网格段是什么)。
我正在研究Imgproc.remap()
/ cv2.remap()
函数,但是当我只有900个原始网格物体和900个原始网格物体时,我对如何设置地图感到困惑皱巴巴的网格。
为此,Imgproc.remap()
/ cv2.remap()
函数是最好的选择吗?