在使用C++进行推理时用到了函数mindspore::dataset::GetAffineTransform
,但是输入相同的数据后,与Python的cv2中的同名函数cv2.getAffineTransform
所输出的结果不同。
#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
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
里面有对比计算值和期望值的方法AccuracyComparison。