C++ 实现tensor 转RGB图

C++ 实现torch::Tensor tensor 转RGB图,要求:tensor 的形状为{4,418,512},取第1,2,3 通道的值分别赋予R,G,B三个不同通道 ,实现方法如下:

#include<opencv2/opencv.hpp>
#include <torch/torch.h>
//#少包自己补充

int shouRGBImg(torch::Tensor tensor) {
	// 分别提取四个通道
	torch::Tensor channel1 = tensor[1];
	torch::Tensor channel2 = tensor[2];
	torch::Tensor channel3 = tensor[3];
	torch::Tensor channel4 = tensor[0];

	// 将四个通道转换成RGB图
	cv::Mat rgbImage = cv::Mat::zeros(cv::Size(512, 704), CV_8UC3);
	for (int row = 0; row < 704; ++row) {
		for (int col = 0; col < 512; ++col) {
			rgbImage.at<cv::Vec3b>(row, col) = cv::Vec3b(channel2[row][col].item<float>() * 255,
				channel3[row][col].item<float>() * 255,
				channel1[row][col].item<float>() * 255);
		}
	}

	// 显示RGB图
	namedWindow("RGB Image", WINDOW_FREERATIO);
	cv::imshow("RGB Image", rgbImage);
	cv::waitKey(0);

	return 0;
}

补充:
如果tensor 的形状为{1,4,418,512},则用下方法替换循环:

rgbImage.at<cv::Vec3b>(row, col) = cv::Vec3b(channel2[0][row][col].item<float>() * 255,
				channel3[0][row][col].item<float>() * 255,
				channel1[0][row][col].item<float>() * 255);

测试:

int main(){
	// 创建一个形状为{4,704,512}的随机Tensor
	torch::Tensor tensor1 = torch::rand({ 4, 704, 512 });
	shouRGBImg(tensor1);
}

图片: 在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用C++和libtorch实现类似于pytorch的ImageFolder方法的示例代码: ``` #include <torch/torch.h> #include <opencv2/opencv.hpp> class ImageFolderDataset : public torch::data::datasets::Dataset<ImageFolderDataset> { public: ImageFolderDataset(const std::string& root_dir, const std::string& extensions = ".jpg") : root_dir_(root_dir), extensions_(extensions) { // find all image files in the root directory for (auto& dir_entry : std::filesystem::directory_iterator(root_dir)) { auto path = dir_entry.path(); if (std::filesystem::is_regular_file(path) && is_image_file(path)) { image_paths_.push_back(path); } } } // get the i-th example in the dataset torch::data::Example<> get(size_t index) override { // load the image and convert to tensor auto image = cv::imread(image_paths_[index].string()); cv::cvtColor(image, image, cv::COLOR_BGR2RGB); // convert from BGR to RGB torch::Tensor tensor_image = torch::from_blob(image.data, { image.rows, image.cols, 3 }, torch::kByte).permute({ 2, 0, 1 }).toType(torch::kFloat) / 255.0; // get the label from the directory name auto label_path = image_paths_[index].parent_path(); int label = std::distance(std::filesystem::directory_iterator(root_dir_), std::find_if(std::filesystem::directory_iterator(root_dir_), std::filesystem::directory_iterator(), [&label_path](const auto& dir_entry) { return dir_entry.path() == label_path; })); return { tensor_image.clone(), torch::tensor(label) }; } // return the number of examples in the dataset torch::optional<size_t> size() const override { return image_paths_.size(); } private: std::vector<std::filesystem::path> image_paths_; std::string root_dir_; std::string extensions_; bool is_image_file(const std::filesystem::path& path) const { auto extension = path.extension().string(); return extensions_.empty() || std::find(extensions_.begin(), extensions_.end(), extension) != extensions_.end(); } }; int main() { // create the dataset and dataloader std::string root_dir = "/path/to/dataset"; ImageFolderDataset dataset(root_dir); auto data_loader = torch::data::make_data_loader<torch::data::samplers::SequentialSampler>(dataset, torch::data::DataLoaderOptions().batch_size(32)); // train the model using the dataset // ... } ``` 在上面的代码中,`ImageFolderDataset`类继承了`torch::data::datasets::Dataset`,并实现了`get()`和`size()`方法,以便能够使用`torch::data::make_data_loader()`函数创建一个数据加载器。在`get()`方法中,我们加载了像并将其换为张量,并从目录名称中获取标签。在`size()`方法中,我们返回数据集中的示例数。 注意,这里我们使用了OpenCV库来加载和处理像。如果您想使用其他库,可以相应地修改代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值