首页 文章

在tensorflow c api中,如何从张量中保存图片或数组

提问于
浏览
0

我正在尝试使用tf 1.5.0 c api运行已保存的图像分割模型 . 我的模型得到一个大小为1 * 256 * 256 * 3的输入图像,并提供给这样的张量:

for (int x = 0; x < 256; x++) {
    for (int y = 0; y <256; y++) {
      data_(0, x, y, 0) =
          (float) image_out.at<cv::Vec3b>(x, y)[0];
      data_(0, x, y, 1) =
          (float) image_out.at<cv::Vec3b>(x, y)[1];
      data_(0, x, y, 2) =
          (float) image_out.at<cv::Vec3b>(x, y)[2];
    }
  }

然后我使用 sess->Run() 运行模型,并获得输出:

输入张量类型:浮点形状:[1,224,224,3]值:[[[254 254 254]]] ...输出张量类型:浮点形状:[1,224,224,1]值:[[[0.160249829] [0.0639446825] [ 0.0414313935]]] ...

我想使用cv :: imwrite()将输出保存到图像中 . 但是,张量不能直接保存 . 所以我试着像这样转换张量:tensorflow :: tensor-> eigen :: mat-> cv :: mat . 代码是:

auto m = Eigen::Map<Eigen::Matrix<
             float,           /* scalar element type */
             Eigen::Dynamic,  /* num_rows is a run-time value */
             Eigen::Dynamic,  /* num_cols is a run-time value */
             Eigen::RowMajor  /* tensorflow::Tensor is always row-major */
              >>(
                 outputs[0].flat<float>().data(),  /* ptr to data */
                 outputs[0].dim_size(1),           /* num_rows */
                 outputs[0].dim_size(2)            /* num_cols */);

  //std::cout << "m " << m << std::endl;

  cv::Mat rotMatrix;
  cv::eigen2cv(m, rotMatrix);

这在编译时引发错误:

注意:模板void cv :: eigen2cv(const Eigen :: Matrix <_Scalar,_Rows,_Cols,_Options,_MaxRows,_MaxCols>&,cv :: Mat&)void eigen2cv(const Eigen :: Matrix <_Tp,_rows,_cols, _options,_maxRows,_maxCols>&src,Mat&dst)^ /usr/local/opencv3.1/include/opencv2/core/eigen.hpp:63:6:注意:模板参数扣除/替换失败:src / demo / demo .cpp:152:28:注意:\ u2018Eigen :: Map> \ u2019不是来自\ u2018const Eigen :: Matrix <_Scalar,_Rows,_Cols,_Options,_MaxRows,_MaxCols> \ u2019 cv :: eigen2cv(m,rotMatrix ); ^在src / demo / demo.cpp中包含的文件中:11:0:/usr/local/opencv3.1/include/opencv2/core/eigen.hpp:81:6:注意:template void cv :: eigen2cv(const Eigen :: Matrix <_Scalar,_Rows,_Cols,_Options,_MaxRows,_MaxCols>&,cv :: Matx <_Tp,m,n>&)void eigen2cv(const Eigen :: Matrix <_Tp,_rows,_cols,_options,_maxRows ,_maxCols>&src,^ /usr/local/opencv3.1/include/opencv2/core/eigen.hpp:81:6:注意:模板参数扣除/替换失败:src / demo / demo.cpp:152:28 :注意:\ u2018Eigen :: Map> \ u2019不是来自\ u2018const Eigen :: Matrix <_Scalar,_Rows,_Cols,_Options,_MaxRows,_MaxCols> \ u2019 cv :: eigen2cv(m,rotMatrix); ^ make:* ** [obj / demo.o]错误1

怎么了?

另一方面,我没有找到一个好方法.Page 4 's c++ api doc, and didn'找到了一个好办法 . https://www.tensorflow.org/api_docs/cc/class/tensorflow/tensor#classtensorflow_1_1_tensor_1a6afab48885080a80ff0b52437959d929

那么,有没有一种方便的方法呢?

1 回答

  • 0

    我想你可以用这种方式直接用OpenCV矩阵头包裹张量数据:

    cv::Mat rotMatrix(outputs[0].dim_size(1), outputs[0].dim_size(2), CV_32FC1, outputs[0].flat<float>().data())
    

相关问题