如何在OpenCV中将4维矩阵转换为NHWC格式

时间:2018-06-18 12:33:23

标签: c++ opencv

所以我正在实施SIFT,事实是我不知道如何处理OpenCV中的频道。这是我到目前为止所做的。

#ifndef QUANTIZATION_DATABASE_DATA_READ_H
#define QUANTIZATION_DATABASE_DATA_READ_H
// C HEADERS
#include <stdlib.h>
#include <fcntl.h>
// C++ HEADERS
#include <iostream>
#include <string>
// OPENCV HEADERS
#include <opencv2/opencv.hpp>

namespace cv
{
    class DataReader
    {
    public:

        explicit DataReader(int _flags) : flags(_flags)
        {

        }

        void read(std::string filename, const char *key, Mat &res)
        {
            try
            {
                FileStorage fs(filename, FileStorage::Mode::FORMAT_XML | FileStorage::Mode::READ);
                fs[key] >> res;
                fs.release();
            }
            catch (Exception e)
            {
                std::cerr << e.msg << std::endl;
            }

        }

    private:
        int flags;
    };
}

我想实现的算法如下。

  1. 从xml文件中读取4维矩阵(NHWC)。
  2. 将其存储在矩阵中
  3. 将其转换为NHWC
  4. 当我使用Tensorflow做一些事情时,我不需要做第3步。它只是自动知道最后一个维度是通道。那么,我该怎么办?

1 个答案:

答案 0 :(得分:0)

似乎没有办法为一批图像制作4维缓冲区。所以我决定改变xml文件的格式,它就像一个魅力。

以下是此问题的暂时解决方法。

#ifndef QUANTIZATION_DATABASE_DATA_READ_H
#define QUANTIZATION_DATABASE_DATA_READ_H
// C HEADERS
#include <stdlib.h>
#include <fcntl.h>
// C++ HEADERS
#include <iostream>
#include <string>
// OPENCV HEADERS
#include <opencv2/opencv.hpp>

namespace cv
{
    class DataReader
    {
    public:

        explicit DataReader(int _flags) : flags(_flags)
        {

        }

        void read(std::string filename, Mat &res)
        {
            try
            {
                float length = 0;

                FileStorage fs(filename, FileStorage::Mode::FORMAT_XML | FileStorage::Mode::READ);

                fs["size"] >> length;
                for (int i = 0; i < (int)length; ++i) {
                    std::string key("image");
                    std::string index = std::to_string(i);
                    Mat image;

                    key = key + index;
                    fs[key.c_str()] >> image;
                    std::cout << image.channels() << std::endl;
                    res.push_back(image);
                }

                fs.release();
            }
            catch (Exception e)
            {
                std::cerr << e.msg << std::endl;
            }

        }

    private:
        int flags;
    };
}