矩阵和tensor相互转换

cvmat到tensor

tips:这里主要要注意的就是在opencv和pytorch中存储顺序的差异

 cv::cvtColor(frame, frame, CV_BGR2RGB);//normalizationframe.convertTo(frame, CV_32FC3, 1.0f / 255.0f);//opencv format H*W*Cauto input_tensor = torch::from_blob(frame.data, {1, frame_h, frame_w, kCHANNELS});//pytorch format N*C*H*Winput_tensor = input_tensor.permute({0, 3, 1, 2});

tensor 到cvmat

tips:1.squeeze只用于batchsize为1的场景2.permute 是将存储格式从pytorch形式转成opencv格式3.因为在处理前对cvmat中的值做了归一化,所以现在要*255恢复,同时对于不在0-255范围内的数据,需要做限制4.因为cvmat的数据格式是8UC3,所以torch tensor要提前转换成kU8

//send tensor to cpu
input_tensor = input_tensor.to(at::kCUDA);
//inference
torch::Tensor out_tensor = module->forward({input_tensor}).toTensor();
//sequeeze trans tensor shape from 1*C*H*W to C*H*W
//permute C*H*W to H*W*C
out_tensor = out_tensor.squeeze().detach().permute({1, 2, 0});
//see tip3,tip4
out_tensor = out_tensor.mul(255).clamp(0, 255).to(torch::kU8);
out_tensor = out_tensor.to(torch::kCPU);
cv::Mat resultImg(frame_h, frame_w, CV_8UC1);
//copy the data from out_tensor to resultImg
std::memcpy((void *) resultImg.data, out_tensor.data_ptr(), sizeof(torch::kU8) * out_tensor.numel());

如有错误,感谢指正!


2020/01/14更新

1.tensor 到 cv::Mat 修改一处错误

memcpy 复制过程,resultImg对应的数据结构应该为CV_8UC1。

2.对于非uint类型的数据类型转换,例如float、double,需做以下两点修改:

1)resultImg需修改成其他opencv的数据结构

2)std::memcpy 行中sizeof()中内容,需要修改成c++中内建的数据类型,如果使用torch::kF32或者其他浮点型,会出现数据复制缺失的情况。

opencv mat 修改_C++ opencv矩阵和pytorch tensor的互相转换相关推荐

  1. mat 释放_c++ - OpenCV无法释放Mat *内存 - 堆栈内存溢出

    绝对可以使用cv :: Mat指针,但是(与所有指针一样)您必须格外小心地删除创建的对象,以再次释放分配的内存. 在您的示例代码中,尚不清楚是否将在任何地方删除其指针在函数中返回的对象. 如果不是这种 ...

  2. opencv mat 修改_OpenCV中initUndistortRectifyMap函数存在bug原因探究

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 3D视觉工坊的第52篇文章 最近在运行如下一段代码时,生成的mapx和mapy有点异常. 代码片段如下 ...

  3. pytorch:tensor与numpy转换 .cpu.numpy()和.numpy() torch.from_numpy VS torch.Tensor

    1.tensor to numpy 1.1代码 .numpy() import torch a0 = torch.ones(6) print(a0) 运行结果: tensor([1., 1., 1., ...

  4. Opencv Mat矩阵操作

    Opencv Mat矩阵操作 1.生成矩阵: Mat image(240, 320, CV8UC3); 第一个参数是rows,该矩阵的行数:第二个参数是cols,该矩阵的列数:第三个参数是该矩阵元素的 ...

  5. opencv Mat类

    本博客转载于这里! Mat 基础 图片在计算机中的本质就是一个数组.其中 Mat 就是在 OpenCV 中图像的表示形式,因此简单介绍 Mat 中一些常用的基础知识. 其中 Mat 类中有一些基本属性 ...

  6. OpenCV Mat类详解

    光心:每个透镜主轴上都有一个特殊点,凡是通过该点的光,其传播方向不变,这个点叫光心. 光线经过透镜后不会发生折射,仍然沿原方向射出. 基础矩阵(Fundamental matrix)是一个3×3的矩阵 ...

  7. 【opencv4】opencv视频教程 C++(opencv教程)2、加载imread()(以灰度加载),修改,保存图像

    上一讲:[opencv4]opencv视频教程 C++(opencv教程)1.opencv介绍和环境搭建 下一讲:[opencv4]opencv视频教程 C++(opencv教程)3.矩阵的掩膜操作( ...

  8. OpenCV Mat类详解和用法(官网原文)

    参考文章:OpenCV Mat类详解和用法 我马克一下,日后更 官网原文链接:https://docs.opencv.org/3.2.0/d6/d6d/tutorial_mat_the_basic_i ...

  9. FFmpeg转OpenCV Mat显示

    FFmpeg一般采用SDL进行显示,如果不追求复杂的界面.交互和多线程功能,当然也可以使用OpenCV的imshow()方法进行显示了,而且实现起来比SDL更简单.方法也很简单,只需要把视频帧的BGR ...

最新文章

  1. matlab 流程计算方法,吸波材料LLG公式计算复磁导率的过程及matlab程序
  2. 一个非常简单的 ASP.NET MVC 示例:长轮询(又叫:反向 AJAX,英文名:Comet)实现...
  3. python3.6小程序_python3.6 tkinter实现屏保小程序
  4. xp系统怎么弄清微软服务器名称,xp系统电脑怎么远程云服务器
  5. bash: pcre-config: 未找到命令..._Docker 常用操作命令
  6. codeforces Round #320 (Div. 2) C. A Problem about Polyline(数学) D. Or Game(暴力,数学)
  7. linux内核部件分析(十)——设备驱动模型之class,linux内核部件分析(十)——设备驱动模型之class...
  8. cocos2d-x系列 Mac下配置cocos2d-x开发环境(android和ios)
  9. 1.12 改善你的模型的表现
  10. C语言学习笔记---字符串拼接函数 strcat() 和 strncat()
  11. JS中的值是按值传递,还是按引用传递呢?
  12. 丹麦为NSA开绿灯 通过通信中心监控欧洲政客
  13. Win10电脑安装打印机驱动运转打印机的方法
  14. 使用Storyboard 创建ViewController
  15. android 汉字 转 拼音首字母,Android开发之拼音转换工具类PinyinUtils示例
  16. python3基础知识复习 -- 进程,线程,多任务讲解
  17. 【全面恢复受损的Word文档】
  18. Java实现分割矩形
  19. codeforces_946D_Timetable(分组背包)
  20. 求字符串的全排列的递归实现(对字符串中有相同字符也适用)

热门文章

  1. Scrapy:python3下的第一次运行测试 1
  2. SpringMVC+Hibernate +MySql+ EasyUI实现POI导出Excel(二)
  3. MSSQL WITH (NOLOCK) 脏读
  4. EhCache的配置
  5. 具备安全态势感知能力的安全管理平台
  6. GDI+:自定义控件时如何使用Region来输出特定区域
  7. oracle sql语句怎么查询所有存储过程中是否包含某个注释?
  8. 查看CentOS的系统版本(亲测)
  9. Tensorflow实例3: 验证码图片的识别训练,每张图片有4个字母
  10. 线性表【项目 - 求集合并集C语言】