opencv的Mat相关操作

news2024/12/25 12:22:57
  1. cv Mat类型的使用
    下载安装好opencv,使用时只需添加如下头文件:
#include<opencv2/opencv.hpp>

另外在工程的属性页中要添加opencv的包含目录与库目录:
在这里插入图片描述
在这里插入图片描述
在写稍大一些工程的时候,尽量不要直接用using namespace cv; 因为在实践的过程中,发现会出现一些报错,例如错误“ACCESS_MASK”不明确,就是因为opencv的using namespace cv和windows.h中ACCESS_MASK定义冲突,解决的办法就是把using namespace cv注掉, 在使用的时候加上cv::,当然也有其他的方法可以解决,也就是去处理windows.h头文件,具体可以看博客:
https://blog.csdn.net/jacke121/article/details/110121394?spm=1001.2014.3001.5506
2. cv Mat类型的声明
利用矩阵尺寸和类型参数构造Mat:

cv::Mat Matname( int  rows, int  cols, int type);
cv::Mat pred_uvd_jts_29(29, 3, CV_32FC1);//声明一个29行3列数据类型为32位float单通道的矩阵

其中,float: 4字节,6-7位有效数字 -3.4E-38 到 3.4E38
double: 8字节,15~16位有效数字 -1.7E-308 到 1.7E308
Float 32bits:CvMat数据结构参数:CV_32FC1,CV_32FC2,CV_32FC3,CV_32FC4
Double 64bits:CvMat数据结构参数:CV_64FC1,CV_64FC2,CV_64FC3,CV_64FC4,
要注意,cv Mat类型是有double类型的,参数为CV_64F,注意使用时,深度学习模型的推理结果类型为torch.float32,所以声明的Mat也要为CV_32F,否则类型不对应会导致结果不正确,相差离谱。

声明全0矩阵(cv::Mat::zeros):

cv::Mat pred_xyz_jts_29 = cv::Mat::zeros(29, 3, CV_32FC1);

声明全1矩阵:

cv::Mat mm = cv::Mat::ones(2, 2, CV_8UC3);

cv Mat给其中整行或整列赋值(使用copyTo函数):
把c的第一列赋值给a的第一列:

    Mat c = Mat::zeros(3, 5, CV_32F);
    Mat a = Mat::ones(3, 6, CV_32F);
    c.col(0).copyTo(a.col(0));
    //将c的1-5列赋值给a
    c.copyTo(a.colRange(1, 6));
    //pred_uvd_jts_29的第3列赋值给pred_xyz_jts_29的第3列
    pred_uvd_jts_29.col(2).copyTo(pred_xyz_jts_29.col(2));

colRange(start,end),包括左边界,不包括右边界,对rowRange同样适用。
3. cv Mat类型的取值方法
cv Mat类型是支持直接输出的:

//可以直接输出pred_uvd_jts_29矩阵的值
std::cout << "pred_uvd_jts_29 : " << pred_uvd_jts_29  << std::endl;

其他三种取值的方法:

Matname.at<float>(i, j);
Matname.ptr<float>(i)[j];
Matname.data;
cv::Mat camera_root(1, 3, CV_32FC1);
//代码实例
for(int i = 0; i < 29; i++)
{
    pred_xy_jts_29_meter.at<float>(i,0) = ((pred_uvd_jts_29.at<float>(i,0) + cx) * input_size / focal_length) * (pred_xyz_jts_29.at<float>(i, 2) * \
                                            depth_factor + pred_camDepth.at<float>(0, 0));
    pred_xy_jts_29_meter.at<float>(i,1) = ((pred_uvd_jts_29.at<float>(i,1) + cy) * input_size / focal_length) * (pred_xyz_jts_29.ptr<float>(i)[2] * \
                                            depth_factor + pred_camDepth.ptr<float>(0)[0]);
    pred_xyz_jts_29.at<float>(i,0) = pred_xy_jts_29_meter.at<float>(i,0) / depth_factor;
    pred_xyz_jts_29.at<float>(i,1) = pred_xy_jts_29_meter.at<float>(i,1) / depth_factor;
}
//camera_root为1行3列,给它的一行三个数赋值
camera_root.at<float>(0,0) = pred_xyz_jts_29.at<float>(0, 0) * depth_factor;
camera_root.at<float>(0,1) = pred_xyz_jts_29.at<float>(0, 1) * depth_factor;
camera_root.at<float>(0,2) = pred_xyz_jts_29.at<float>(0, 2) * depth_factor;
camera_root.at<float>(0,2) += pred_camDepth.at<float>(0, 0);

另外,几种取值的方法在debug和release模式下的时间不同,Debug模式下M.at(i, j)最耗时,用指针取值最快,在Release模式下,三者耗时相差不大,结果如下,感兴趣的小伙伴可以看看:穿越门
在这里插入图片描述
这里指针取值就是有一个Mat矩阵,根据Mat矩阵的属性行、列及通道数,将Mat拉成一行进行取值,具体代码如下:

cv::Mat feature = this->output[nodes_name[i]];//feature即得到onnx对应节点的输出
if (nodes_name[i] == "pred_xyz_jts_29")
{
    auto* pred_xyz_jts_29 = feature.ptr<float>();//定义一个auto指针类型
    //根据Mat的rows、cols及channels属性确定元素个数
    size_t pred_xyz_jts_29_out_length = feature.rows * feature.cols * feature.channels();
    for (int j = 0; j < pred_xyz_jts_29_out_length; j++)//遍历即可
    {
        std::cout << "pred_xyz_jts_29 " << j << "," << pred_xyz_jts_29[j] << std::endl;
    }
}
  1. cv Mat类型做归一化操作(减均值、除方差)
    我的预处理是先做了一个to_tensor操作,然后减mean,除std
img = im_to_torch(img)
# mean
img[0].add_(-0.406)
img[1].add_(-0.457)
img[2].add_(-0.480)

# std
img[0].div_(0.225)
img[1].div_(0.224)
img[2].div_(0.229)

首先数学上这两个操作可以合并,最后只减一次均值和方差即可,计算合并后:
在这里插入图片描述

cv::Mat input_f;
input.convertTo(input_f, CV_32FC3);//input是处理完的U8C3类型要先convertTo转换成浮点型
input_f = input_f - cv::Scalar(103.53, 116.535, 122.4);//用scalar,对应通道减去计算出的均值
vector<float> v_std = {57.375, 57.12, 58.395};
std::vector<cv::Mat> planes(3);//planes是个长度为3的vector,里面每个元素类型都是cv Mat
cv::split(input_f, planes);//三通道的input_f按通道分割,结果存放在事先声明的planes中
cv::Mat planer;
for (int i = 0; i < 3; i++)
{
    cv::Mat f;
    planes[i].convertTo(f, CV_32FC1, 1.0 / v_std[i] );//除方差
    planer.push_back(f.reshape(1,1));//f.reshape(1,1)将矩阵转换成一个列向量,维度(row*col, 1)
}//planer.size():[65536*3]

注意:Mat.convertTo()方法在转换类型的同时可以做一些转换操作,原型是:

src.convertTo(dst, type, scale, shift)

scale是要乘上的比例因子,shift是要加上的类似偏置, 如果scale=1,shift=0,则不进行比例缩放:
dst(i)=src(i) x scale + shift
所以除255的操作可以写成:

image.convertTo(src_f, CV_32F, 1.0/255, 0);//图像大小没有变化,类型从UINT8变为了FLOAT32位

cv::split和cv::merge的原型:

void cv::split(
const cv::Mat& mtx, //输入图像
vector<Mat>& mv // 输出的多通道序列(n个单通道序列)
);
void merge(
	const vector<cv::Mat>& mv, // 输入的多通道序列(n个单通道序列)
	cv::OutputArray dst // 输出图像,包含mv
);

opencv相关函数可以学习博客:https://www.cnblogs.com/yanghailin/p/12067239.html#3-c-opencv%E7%9B%B4%E6%8E%A5%E5%87%8F%E5%9D%87%E5%80%BC–%E9%99%A4%E6%96%B9%E5%B7%AE
opencv的总结就到这里了,知道的越多,自己不知道的越多,书到用时方恨少,希望自己能不断积累,早日从菜鸡像不那么菜的菜鸡进化,加油喔~~~~~

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

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

相关文章

运营策略:影响内容病毒式传播的 8 个维度

目录 01 第一个影响要素就是内容的类型 02 第二个要素时内容的长度 03 第三个要素是要唤起正确的情感 04 第四个是利用趋势&#xff0c;也就是热点问题或事件 05 第五个是视觉效果 06 第六个是增加作者署 07 第七个是在正确的时间发布内容 08 第八个是影响者的力量 病毒…

“实时数据同步:构建高效的 MySQL 数据同步方案“

方案一 基于LVM快照进行备份切换 介绍: MySQL数据库本身并不支持快照功能(sqlServer支持) 因此快照备份是指通过文件系统支持的快照功能对数据库进行备份 备份的前提是将所有数据库文件放在同一文件分区中&#xff0c;然后对该分区进行快照操作 LVM是LINUX系统下对磁盘分区进…

Linux:磁盘资源耗尽故障

有两种经典原因 磁盘空间已被大量的数据占满&#xff0c;空间耗尽。 解决办法&#xff1a;将没有用的大型文件转移或删除 文件i节点耗尽故障 &#xff08;文件过多&#xff09; 解决办法&#xff1a;删除 磁盘被大型文件占满 模拟 准备了一个2G大小的分区 然后进行挂载 我…

电子企业如何高效地使用MES生产管理系统

引言&#xff1a; 在当今数字化、智能化的时代&#xff0c;电子企业的发展已经达到了一个新的高度。与此同时&#xff0c;MES生产管理系统在电子企业中扮演着越来越重要的角色。本文将探讨电子企业如何高效地使用MES生产管理系统&#xff0c;提高企业生产效率和管理水平&#…

基于点云和图像的目标识别与定位,以及目标去重

【背景介绍】 无人系统常常面临对特定目标进行跟踪侦察的任务需求&#xff0c;这就要求无人系统要具备对目标进行识别以及对目标进行定位的能力&#xff0c;同时&#xff0c;任务一般发生在一段连续时间跨度&#xff0c;而相同目标存在被单个机器人重复发现&#xff0c;或者被…

Vue电商项目--详情页面完成

放大镜操作上 <script> var mySwiper new Swiper (.swiper, {direction: vertical, // 垂直切换选项loop: true, // 循环模式选项// 如果需要分页器pagination: {el: .swiper-pagination,},// 如果需要前进后退按钮navigation: {nextEl: .swiper-button-next,pr…

14.2:派对的最大快乐值

派对的最大快乐值 员工信息的定义如下: class Employee { public int happy; // 这名员工可以带来的快乐值 List subordinates; // 这名员工有哪些直接下级 } 公司的每个员工都符合 Employee 类的描述。整个公司的人员结构可以看作是一棵标准的、 没有环的多叉树 树的头节点是公…

框架解耦神器 -- REventBus

REventBus背景 在实际的项目开发中&#xff0c;经常会遇到业务与业务&#xff0c;组件与组件&#xff0c;业务与组件之间的通信&#xff0c;举个例子&#xff1a;当有烟雾传感器检测到烟雾超标时&#xff0c;需要打开排气扇排气&#xff0c;同时显示烟雾浓度显示到显示器中&am…

centos7升级rockylinux 未写完

前言 查看centos的版本 &#xff0c;我这台服务器是虚拟机 [rootlocalhost ~]#cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) [rootlocalhost ~]#uname -a Linux jenkins_server 3.10.0-1160.83.1.el7.x86_64 #1 SMP Wed Jan 25 16:41:43 UTC 2023 x86_64 …

PIC 使能485/422笔记(修订中...)

1.需求 工作中需要把目前设备的单向232转为485/422模式&#xff0c;实现双向通讯&#xff0c;目前查找相关资料。突然想到一件事&#xff0c;我是否能让232现有的单向上发线同时连工控机的tx,rx&#xff0c;然后靠协议&#xff0c;来定时切换PIC一侧的tx rx?PIC可能不支持这个…

Python之pyecharts的常见用法2-柱状图-折线图

Pyecharts是一个基于Echarts的Python可视化库&#xff0c;可以用Python语言轻松地生成各种交互式图表和地图。它支持多种图表类型&#xff0c;包括折线图、柱状图、散点图、饼图、地图等&#xff0c;并且可以通过简单的API调用实现数据可视化。 Pyecharts的优点包括&#xff1a…

关于 Oracle Schema 级别的权限问题

作者 | JiekeXu 来源 |公众号 JiekeXu DBA之路&#xff08;ID: JiekeXu_IT&#xff09; 如需转载请联系授权 | (个人微信 ID&#xff1a;JiekeXu_DBA) 大家好&#xff0c;我是 JiekeXu,很高兴又和大家见面了,今天和大家一起来看看关于 Oracle Schema 级别的权限问题&#xff0c…

PyCaret 3.0介绍 -- Python中的开源、低代码机器学习库

PyCaret是一个Python中的开源、低代码机器学习库&#xff0c;可以自动化机器学习工作流。它是一个端到端的机器学习和模型管理工具&#xff0c;可以成倍地加快实验周期&#xff0c;提高工作效率。 与其他开源机器学习库相比&#xff0c;PyCaret是一个替代的低代码库&#xff0c…

如何利用外卖小程序源码,快速开启你的外卖生意?

作为外卖行业不可或缺的一部分&#xff0c;外卖小程序越来越受到人们的关注。它不仅可以提高用户的订餐体验&#xff0c;还可以为商家带来更高的收益。然而&#xff0c;对于一些想通过外卖小程序来开启自己的外卖生意的商家来说&#xff0c;开发一款定制化的外卖小程序需要投入…

浙江大华后端开发一面面经

目录 1.SpringBuffer和SpringBuilder的区别是什么&#xff1f;2.常用的集合类有哪些&#xff1f;HashMap的底层数据结构&#xff1f;推荐一下线程安全的Map&#xff1f;3.TCP和UDP的差异是什么&#xff1f;4.MySQL的左连接和右连接的区别&#xff1f;5.MySQL慢查询如何排查&…

01 【Vue简介 初识Vue 模板语法和数据绑定】

01 【Vue简介 初识Vue 模板语法和数据绑定】 1.Vue简介 1.1官网 英文官网中文官网 1.2介绍与描述 Vue 是一套用来动态构建用户界面的渐进式JavaScript框架 ○构建用户界面&#xff1a;把数据通过某种办法变成用户界面 ○渐进式&#xff1a;Vue可以自底向上逐层的应用&…

图解LeetCode——108. 将有序数组转换为二叉搜索树

一、题目 给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 高度平衡 二叉搜索树。 高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。 二、示例 2.1> 示例 1&#xff1a; 【输入】n…

企业邮箱大文件发送指南:推荐一个适用于大文件的邮箱服务

大多数电子邮件服务都不安全并且限制附件文件的大小&#xff0c;但是有一些方法可以安全地发送大文件。如果您曾尝试将多个图像或视频文件附加到电子邮件&#xff0c;您就会知道它并不总是有效。下面为大家介绍一款可以发送大文件的企业邮箱--Zoho Mail。 一、电子邮件发送大文…

【Python】Python系列教程--Python3 环境搭建(二)

文章目录 前言Python3 下载Python 安装Unix & Linux 平台安装 Python3:Window 平台安装 Python:MAC 平台安装 Python: 环境变量配置在 Unix/Linux 设置环境变量在 Windows 设置环境变量在命令提示框中(cmd) : 输入 Python 环境变量运行 Python1、交互式解释器&#xff1a;2…

品牌如何给自己创建一个百度百科词条,在百科上传企业资料方法

对于企业来说&#xff0c;很多人都想给自己企业或者品牌上传正面简介内容到百度百科平台&#xff0c;但创建一个品牌百度百科词条似乎并不是那么简答&#xff0c;很多自己尝试创建品牌百度百科词条的朋友最终都失败了&#xff0c;下面洛希爱做百科网教教大家如何给自己品牌创建…