libtorch之cv::Mat和Tensor的互转

      cv::Mat转Tensro libtorch官网例子中给的是如下形式:

        torch::TensorOptions option(torch::kFloat);   

        auto img_tensor = torch::from_blob(img.data,

                                                             {1,img.rows,img.cols,img.channels() }, option);

                                                            // opencv (H x W x C)  to torch  (batch x H x W x C)

        img_tensor = img_tensor.permute({0, 3, 1, 2 });//调整矩阵列顺序 batch x C x H x W

     这种方式应用在分类问题中应该没什么问题,但应用在faster RCNN时却存在一定问题。使用from_blob构造一个Tensor,他只是一个内存数据的拷贝,没有更多的对数据处理。

      cv::Mat数据在内存中是如下形式存储的

     (r,g,b),(r,g,b),(r,g,b)......   

     然而Tensor在内存中的数据确是

      (r,r,r,r,......),(g,g,g,g,......),(b,b,b,......)

     这两种不同结构的数据是无法直接使用内存拷贝方式转换。

     以下是一个完整的cv::Mat转Tensor

    torch::Tensor image2Tensor(cv::Mat &img)

   {

          if(img.channels() == 1)

         {

             torch::TensorOptions option(torch::kFloat);

             auto img_tensor = torch::from_blob(img.data, {1,img.rows,img.cols}, option);

                                                            // opencv (H x W)  to torch  (C x H x W)

              return img_tensor;

        }

       else

       {

                torch::Tensor t = torch::zeros({3,img.rows,img.cols},torch::kFloat);

               float * r = (float*)t[0].data_ptr();

               float * g = (float*)t[1].data_ptr();

               float * b = (float*)t[2].data_ptr();

              for(int row = 0; row < img.rows; row++)

             {

                     for(int col = 0; col < img.cols; col++)

                    {

                            cv::Vec3f &v = img.at<cv::Vec3f>(row,col);

                            r[row*img.cols + col] = v[0];

                            g[row*img.cols + col] = v[1];

                            b[row*img.cols + col] = v[2];

                   }

           }

            return t;

        }

         return torch::Tensor();

    }

     这是一个Tensor转cv::Mat的函数,方便可视化的呈现特征图像。

     cv::Mat tensor2Image(const torch::Tensor &t)

    {

             torch::IntArrayRef s = t.sizes();

             if(s[0] == 1)

            {

                    cv::Mat des(s[1], s[2], CV_32FC1, t.data_ptr<float>());

                      return des;

             }

            else

           {

                 float * r = (float*)t[0].data_ptr();

                 float * g = (float*)t[1].data_ptr();

                 float * b = (float*)t[2].data_ptr();

                 int rows = s[1];

                 int cols = s[2];

                 cv::Mat des = cv::Mat::zeros(rows, cols,CV_32FC3);

                for(int row=0; row<rows; row++)

                {

                        for(int col=0; col<cols; col++)

                       {

                            cv::Vec3f v;

                            v[0] = r[row*cols + col];

                            v[1] = g[row*cols + col];

                            v[2] = b[row*cols + col];

                           des.at<cv::Vec3f>(row,col) = v;

                       }

                }

               return des;

          }

          return cv::Mat();

      }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/89108.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

单元测试spring-boot-starter-test

参考博客&#xff1a; https://www.cnblogs.com/mzc1997/p/14306538.html 配置pom junit-vintage-engine junit4 junit-jupiter-engine junit5 排除junit4使用junit5,两者在切换时要特别注意 <dependency><groupId>org.springframework.boot</groupId><…

【产品运营】如何做好B端产品规划

产品规划是基于当下掌握的多维度信息&#xff0c;为追求特定目的&#xff0c;而制定的产品资源投入计划。 产品规划是基于当下掌握的多维度信息&#xff08;客户需求、市场趋势、竞争对手、竞争策略等&#xff09;&#xff0c;为追求特定目的&#xff08;商业增长、客户满意等&…

数码产品数码配件无线键盘等出口欧盟CE-RED认证测试办理

数码产品数码配件无线键盘CE-RED认证测试办理 无线产品CE-RED认证进入东欧市场规定&#xff1a; 在通信终端设备和无线产品在这些/地区合法销售之前&#xff0c;必须按照 RED 指令进行测试&#xff0c;并且还必须提供 CE 标志。无线远程控制产品必须符合 RED 指令的 REDEU 要…

ruoyi-nbcio增加websocket与测试页面

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 为了后面流程发起等消息推送&#xff0c;所以需要集成websocket。 1、后端增加websoket支持 首先在framework模块里的pom.xml增加websocket <dependency…

matlab产生指定功率的噪声信号、固定SNR的信号

randn函数产生噪声信号 首先要理解信号的幅度和功率&#xff0c;例如信号的幅度为 U U U&#xff0c;那么信号的功率就是 U 2 U^2 U2&#xff0c;他们之间是平方的关系。 matlab中randn函数用法&#xff0c;产生正态分布的随机数或矩阵的函数。 randn&#xff1a;产生均值为0…

PostMan、ApiFox等工具Post请求中@RequestParam和@RequestBody的混合使用如何传参

方法签名 PostMapping("/mms/sendAudit")public R sendAudit(RequestParam("mmsId") Long mmsId,RequestParam("ecId") Long ecId,RequestBody(required false) SignMatchRule signMatchRule) {以ApiFox为例子 RequestParam的Params的参数正常…

Unity用相机实现的镜子效果

首先登场 场景中的元素 mirror是镜子&#xff0c;挂着我们的脚本&#xff0c;Quad是一个面片。Camera是用来生成RenderTexture给面片的。里面的test1是我用来调试位置的球。 镜子size是大小&#xff0c;x是-2&#xff0c;为了反转一下贴图 相机直接可以禁用掉&#xff0c;用…

C语言数组和指针笔试题(四)(一定要看)

目录 二维数组例题一例题二例题三例题四例题五例题六例题七例题八例题九例题十例题十一 结果 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 &#x1f412;&#x1f412;&#x1f412;个人主页 &#x1f978;&#x1f978;&#x1f978;C语言 &#x1f43f;️…

【笔记】Splay

【笔记】Splay 目录 简介右旋左旋 核心思想操作a. Splayb. 插入c. 删除 信息的维护例题AcWing 2437. SplayP3369 【模板】普通平衡树 简介 Splay 是一种平衡树&#xff0c;并且是一棵二叉搜索树&#xff08;BST&#xff09;。 它满足对于任意节点&#xff0c;都有左子树上任意…

0基础学习VR全景平台篇 第101篇:企业版功能-子账号分配管理

大家好&#xff0c;欢迎观看蛙色VR官方系列——后台使用课程&#xff01; 本期为大家带来蛙色VR平台&#xff0c;企业版教程-子账号分配管理功能&#xff01; 功能位置示意 一、本功能将用在哪里&#xff1f; 子账号分配管理功能&#xff0c;主要用于企业版用户为自己服务的终…

大模型助力企业数据驱动,火山引擎数智平台发布AI助手

9月19日&#xff0c;火山引擎在其举办的“V-Tech数据驱动科技峰会”上宣布&#xff0c;火山引擎数智平台VeDI推出“AI助手”&#xff0c;通过接入人工智能大模型&#xff0c;帮助企业提升数据处理和查询分析的效率。即使是不会写代码的运营人员&#xff0c;和大模型对话也能做好…

Java内存泄漏知识(软引用、弱引用等)

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 未经允许不得转载 目录 一、导读二、概览三、相关知识3.1 内存…

react ref获取dom节点

在React中&#xff0c;可以使用ref来获取DOM节点的引用。以下是一些示例代码&#xff0c;说明如何使用ref来获取DOM节点&#xff1a; 使用React.createRef()&#xff08;React 16.3版本以及更高版本的推荐方法&#xff09;&#xff1a; import React, { Component } from react…

前后端分离的计算机毕设之基于springboot+vue的课程设计选题管理系统(内含源码+文档+教程)

博主介绍&#xff1a;✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久&#xff0c;选择我们就是选择放心、选择安心毕业✌ &#x1f345;由于篇幅限制&#xff0c;想要获取完整文章或者源码&#xff0c;或者代做&am…

唤醒手腕 2023年 B 站课程 Golang 语言详细教程笔记(更新中)

0001、1000集GO语言Flag毒誓 唤醒手腕UP猪Pig目标花费1000集进行讲解Go语言视频学习教程&#xff08;有趣的灵魂&#xff0c;适合小白&#xff0c;不适合巨佬&#xff09;&#xff0c;从2023年3月19日开始&#xff0c;将会一直每天更新&#xff0c;准备在2024年5月1日之前更新…

Pikachu靶场——SSRF 服务端请求伪造

文章目录 1 SSRF 服务端请求伪造1.1 SSRF(curl)1.1.1 漏洞防御 1.2 SSRF(file_get_content)1.2.1 漏洞防御1.2.3 SSRF 防御 1 SSRF 服务端请求伪造 SSRF(Server-Side Request Forgery:服务器端请求伪造) 其形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能&a…

孤网双机并联逆变器下垂控制策略MATLAB仿真模型

微❤关注“电气仔推送”获得资料 主体模块&#xff1a; 建议使用MATLAB2021b及以上版本打开&#xff01; 功率计算模块、下垂控制模块、电压电流双环控制模块 系统输出有功功率: 系统输出无功功率&#xff1a; 系统频率变化曲线: 参考文献&#xff1a; 微电网并网运行模式下…

四川众佰诚:现在的抖音小店怎么注册

抖音小店是一种新的电子商务形式&#xff0c;它允许用户在抖音平台上直接销售商品。下面是一篇关于如何注册抖音小店的步骤说明&#xff1a; 下载并安装抖音App: 首先&#xff0c;你需要在手机上下载并安装最新版本的抖音App。你可以在苹果App Store或者安卓应用商店找到它。 创…

助力交叉学科应用型数据科学人才培养,和鲸科技携手华为发布联合解决方案

时代高速发展&#xff0c;智能化的浪潮奔腾而来&#xff0c;以“加速行业智能化”为主题&#xff0c;第八届华为全联接大会&#xff08;HUAWEI CONNECT 2023&#xff09;于 9 月 20 日正式开幕。本次大会中&#xff0c;华为携手生态伙伴引领智慧教育新风尚&#xff0c;和鲸科技…

【GIT】Git clone https://xxx.git 报错仓库找不到,ssh却可以。

环境 MacBook Pro&#xff1a;13.0 (22A380)&#xff0c;Intel。 Python&#xff1a;3.10.9 序言 最近在Mac电脑中按照stable diffusion webUI 时&#xff0c;总是报&#xff1a; MacBook-Pro:openai yutao$ git clone https://github.com/AUTOMATIC1111/stable-diffusion-…