使用estimateAffinePartial2D

时间:2018-12-07 12:20:22

标签: c++ opencv

我已经开始使用estimateAffinePartial2D来代替不推荐使用的estimateRigidTransform方法。该应用程序正在对齐由面部检测算法生成的5个界标。

以前,如果刚性变换无法求解估计值,则刚性变换将返回None而不是变换向量。 EAP2D总是返回向量。

问题是,如果EAP2D无法产生解决方案(如果面未对齐),则该点之后返回的所有方法都是垃圾。我已经通过在产生无效变换矩阵的地标值中进行了仔细检查,然后重新启动并传递了相同的值,从而生成了有效的变换矩阵。

以下是同一组地标的输出:

   actual landmarks: 
   [[[ 65.3148   96.60192]
      [152.09814  97.58065]
      [122.19773 140.87932]
      [ 80.71128 196.89061]
      [145.18759 197.73586]]]
   reference landmarks:
   [[[70.7299 92.2041]
      [70.7299 92.2041]
      [70.7299 92.2041]
      [70.7299 92.2041]
      [70.7299 92.2041]]]

   Output after being unable to compute a landmark:
   [[-0.         -0.         70.72989655],
     [ 0.         -0.         92.20410156]]

   Output after restart (with same input):
   [[ 4.11637995e-01, -6.70766338e-03,  1.13927864e+01],
     [ 6.70766338e-03,  4.11637995e-01,  1.06043865e+01]]

代码如下:

# Align the image
# transform = cv.estimateRigidTransform(landmarks, self.reference_landmarks, False)
# Partial affine based on this post:
# http://answers.opencv.org/question/123476/estimateaffinepartial2d-and-estimateaffine2d/
transform = cv.estimateAffinePartial2D(landmarks, self.reference_landmarks)
image = cv.warpAffine(image, transform[0], self.cnn_input_size)

其余代码基于this tutorial,后者使用线程在tkinter GUI上更新视频。

另一个细节让我认为这是内存损坏。我必须分别测试刚性转换和EAP2D。如果我使用EAP2D计算了错误的转换,即使它们存储在单独的变量中,它也会影响thewularTransform的输出!

我正在使用cv2包装器,而3.4和4.0都存在此问题

你知道引擎盖下面会发生什么吗?

0 个答案:

没有答案