c++ - 使用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 中都有这个问题
知道引擎盖下会发生什么吗?
解决方案
推荐阅读
- python - 在 C 中获取从 python 生成的二维数组
- html - 如何使单个标签的内容相等?
- javascript - 从excel文件中复制文本并粘贴到浏览器中
- bootstrap-4 - 如何在手机屏幕尺寸上使用 Bootstrap“Display-3”
- jquery - jquery number 插件作为整数插入数据库
- python - 在列中查找字母并提取包含特定字母的行
- jupyter-notebook - 无法使用 jupyterlab 桌面应用程序更改主路径
- power-automate - 如何在 Power Automate 自定义连接器中使用纯数字作为字符串类型默认值
- excel - 在 Excel 中将四位数字更改为年份
- php - 如何将电子邮件发送到多个地址?