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

How to convert 4 dimensional matrix to NHWC format in OpenCV

本文关键字:转换 NHWC 格式 4维 OpenCV 中将      更新时间:2023-10-16

所以我正在实现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

问题是,当我使用 Tensorflow 做一些事情时,我不必执行第 3 步。它只是自动知道最后一个维度是通道。那么,我该怎么办?

似乎没有任何方法可以为一批图像制作 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;
};
}