我已经开始使用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都存在此问题
你知道引擎盖下面会发生什么吗?