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


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

    C++ Ascend310端测试核心代码
     

    1. #include
    2. #include
    3. #include "include/dataset/lite_cv/lite_mat.h"
    4. #include "include/dataset/lite_cv/image_process.h"
    5. using mindspore::MSTensor;
    6. using mindspore::DataType;
    7. using mindspore::dataset::LiteMat;
    8. using mindspore::dataset::Point;
    9. using mindspore::dataset::Affine;
    10. using mindspore::dataset::GetAffineTransform;
    11. int main(int argc, char **argv) {
    12. float src[3][2] = {154.61, 90.4373,
    13. 154.61, 38.1699,
    14. 102.342, 38.1699,};
    15. float dst[3][2] = {144, 192,
    16. 144, 48,
    17. 0, 48,};
    18. mindspore::dataset::LiteMat trans;
    19. 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])};
    20. 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])};
    21. int inv = 0;
    22. if (inv) mindspore::dataset::GetAffineTransform(dst_point, src_point, trans);
    23. else mindspore::dataset::GetAffineTransform(src_point, dst_point, trans);
    24. std::cout << "[D]trans: " << trans.width_ << ' ' << trans.height_ << std::endl;
    25. std::cout << *(float*)(trans.data_ptr_) << ' ' << *((float*)(trans.data_ptr_) + 1) << ' ' << *((float*)(trans.data_ptr_) + 2) << std::endl;
    26. 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;
    27. return 0;
    28. }

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

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

    Python cv2.getAffineTransform()

    1. import numpy as np
    2. import cv2
    3. src = np.array([[154.6097, 90.43735],
    4. [154.6097, 38.16989],
    5. [102.34224, 38.16989]])
    6. dst = np.array([[144., 192.],
    7. [144., 48.],
    8. [0., 48.]])
    9. inv = 0
    10. if inv:
    11. trans = cv2.getAffineTransform(np.float32(dst), np.float32(src))
    12. else:
    13. trans = cv2.getAffineTransform(np.float32(src), np.float32(dst))
    14. print(trans)

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

    1. [[ 2.75506043e+00 -0.00000000e+00 -2.81959054e+02]
    2. [ 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。

  • 相关阅读:
    猿创征文 第二季| #「笔耕不辍」--生命不息,写作不止#
    Redis的快速入门【全方位进攻】
    使用Spring Boot和Kafka实现消息发送和订阅
    利用扰动模型计算旋转矩阵的导数例题
    Linux防火墙(iptables)
    盲盒小程序 跨平台兼容性测试策略:打造无缝体验
    Go HTTP 调用(下)
    基于Java的小说下载网站管理系统设计与实现(源码+lw+部署文档+讲解等)
    HC-05 蓝牙模块之间的通信配置
    java--String
  • 原文地址:https://blog.csdn.net/weixin_45666880/article/details/127800555