如何使用OpenCV将图像从平面网格变形为“皱缩”网格?

时间:2018-09-21 08:24:06

标签: opencv

我正在尝试使图像变形的移动最小二乘方法,并且我有一个专门用于基于点变化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()函数是最好的选择吗?

0 个答案:

没有答案