首页 > 解决方案 > 使用estimateAffinePartial2D 可能导致内存损坏

问题描述

我已经开始使用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)

其余代码基于本教程,该教程使用线程更新 tkinter GUI 上的视频。

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

我正在使用 cv2 包装器,并且在 3.4 和 4.0 中都有这个问题

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

标签: c++opencv

解决方案


推荐阅读