mindspore::dataset::GetAffineTransform的输出与cv2的输出不同

在使用C++进行推理时用到了函数mindspore::dataset::GetAffineTransform,但是输入相同的数据后,与Python的cv2中的同名函数cv2.getAffineTransform所输出的结果不同。

C++ Ascend310端测试核心代码
 

#include 
#include 

#include "include/dataset/lite_cv/lite_mat.h"
#include "include/dataset/lite_cv/image_process.h"

using mindspore::MSTensor;
using mindspore::DataType;
using mindspore::dataset::LiteMat;
using mindspore::dataset::Point;
using mindspore::dataset::Affine;
using mindspore::dataset::GetAffineTransform;

int main(int argc, char **argv) {
  float src[3][2] = {154.61, 90.4373,
154.61, 38.1699,
102.342, 38.1699,};
  float dst[3][2] = {144, 192,
144, 48,
0, 48,};
  mindspore::dataset::LiteMat trans;
  std::vector src_point = {Point(src[0][0], src[0][1]), Point(src[1][0], src[1][1]), Point(src[2][0], src[2][1])};
  std::vector dst_point = {Point(dst[0][0], dst[0][1]), Point(dst[1][0], dst[1][1]), Point(dst[2][0], dst[2][1])};
  int inv = 0;
  if (inv) mindspore::dataset::GetAffineTransform(dst_point, src_point, trans);
  else mindspore::dataset::GetAffineTransform(src_point, dst_point, trans);
  std::cout << "[D]trans: " << trans.width_ << ' ' << trans.height_ << std::endl;
  std::cout << *(float*)(trans.data_ptr_) << ' ' << *((float*)(trans.data_ptr_) + 1) << ' ' << *((float*)(trans.data_ptr_) + 2) << std::endl;
  std::cout << *((float*)(trans.data_ptr_ )+ 2 * 1 + 0) << ' ' << *((float*)(trans.data_ptr_ )+ 2 * 1 + 1) << ' ' << *((float*)(trans.data_ptr_) + 2 * 1 + 2) << std::endl;
  return 0;
}

程序运行环境为:Ascend310,Ubuntu18.04,g++8.1.0,mindspore1.8.0,mindspore-lite1.8.1 程序输出结果为:

[D]trans: 3 2
2.80742e-15 2.09438 0
0 -0 -3.64823e-16

Python cv2.getAffineTransform()

import numpy as np
import cv2

src = np.array([[154.6097, 90.43735],
                [154.6097, 38.16989],
                [102.34224, 38.16989]])
dst = np.array([[144., 192.],
                [144., 48.],
                [0., 48.]])
inv = 0
if inv:
    trans = cv2.getAffineTransform(np.float32(dst), np.float32(src))
else:
    trans = cv2.getAffineTransform(np.float32(src), np.float32(dst))
print(trans)

程序运行环境为:CPU,Windows10,Python3.8.8,opencv4.6.0 程序输出结果为:

[[ 2.75506043e+00 -0.00000000e+00 -2.81959054e+02]
 [ 9.19143827e-17  2.75506043e+00 -5.71603573e+01]]

问题

可以看到两者的输出完全不同。我想知道,这两个函数是否是对应关系,如果是的话,我的代码在哪里出了问题,如果不是的话,那么Mindspore在C++中是否有对应的API可以使用。

****************************************************解答*****************************************************

mindspore端侧的GetAffineTransform算子的功能是和opencv的getAffineTransform保持一致的。

我这边验证的结果是和opencv的一致。可能是std::cout的原因?打印的值不太一样?

这边可以参考一下这边的用例:tests/ut/cpp/dataset/image_process_test.cc

mindspore::dataset::GetAffineTransform的输出与cv2的输出不同_第1张图片

里面有对比计算值和期望值的方法AccuracyComparison。

mindspore::dataset::GetAffineTransform的输出与cv2的输出不同_第2张图片

mindspore::dataset::GetAffineTransform的输出与cv2的输出不同_第3张图片

你可能感兴趣的:(python,c++,开发语言)