首页 > 其他分享 >【OpenCV教程】OpenCV中对矩阵的常用操作

【OpenCV教程】OpenCV中对矩阵的常用操作

时间:2024-08-15 12:48:36浏览次数:9  
标签:教程 Mat int 矩阵 typedef OpenCV Vec type CV

@

目录


1.全零矩阵

CV_NODISCARD_STD static MatExpr Mat::zeros(int rows, int cols, int type);
CV_NODISCARD_STD static MatExpr Mat::zeros(Size size, int type);

CV_NODISCARD_STD static MatExpr Mat::zeros(int ndims, const int* sz, int type);
//not recommended
  • 参数如下
参数 含义
rows 行数
cols 列数
type 数据类型(CV_16F)
size Size(宽(列数),高(行数))
  • Size与Mat中的成员函数.size()的返回值,有相同的数据类型,是[宽*高]。
  • Mat中的成员变量.size,与以上二者不同,是 rows*cols

2.全一矩阵

CV_NODISCARD_STD static MatExpr Mat::ones(int rows, int cols, int type);
CV_NODISCARD_STD static MatExpr Mat::ones(Size size, int type);

CV_NODISCARD_STD static MatExpr Mat::ones(int ndims, const int* sz, int type);
//not recommended
  • 参数如下
参数 含义
rows 行数
cols 列数
type 数据类型(CV_16F)
size Size(宽(列数),高(行数))

3.单位矩阵

CV_NODISCARD_STD static MatExpr Mat::eye(int rows, int cols, int type);
CV_NODISCARD_STD static MatExpr Mat::eye(Size size, int type);
  • 参数如下
参数 含义
rows 行数
cols 列数
type 数据类型(CV_16F)
size Size(宽(列数),高(行数))

4.矩阵转置

MatExpr Mat::t() const;

5.求逆矩阵

MatExpr Mat::inv(int method=DECOMP_LU) const;

6.逗号式分隔创建矩阵

  • 常用于自定义卷积核
template<typename _Tp> inline
Mat_<_Tp>::Mat_(int _rows, int _cols)
    : Mat(_rows, _cols, traits::Type<_Tp>::value)
{
}

template<typename _Tp> inline
Mat_<_Tp>::Mat_(int _rows, int _cols, const _Tp& value)
    : Mat(_rows, _cols, traits::Type<_Tp>::value)
{
    *this = value;
}

template<typename _Tp> inline
Mat_<_Tp>::Mat_(Size _sz)
    : Mat(_sz.height, _sz.width, traits::Type<_Tp>::value)
{}

template<typename _Tp> inline
Mat_<_Tp>::Mat_(Size _sz, const _Tp& value)
    : Mat(_sz.height, _sz.width, traits::Type<_Tp>::value)
{
    *this = value;
}
  • 以下为使用实例,注意括号的位置
Mat a=(Mat_<int>(2,2)<<1,2,3,4);
Mat b=(Mat_<double>(Size(2,2))<<1,2,3,4);

注意 :给出的数据类型必须是基本数据类型,如int,double。不能是CV_16F等。

7.矩阵定义(只列出常用的)

Mat::Mat() CV_NOEXCEPT;
Mat::Mat(int rows, int cols, int type);
Mat::Mat(Size size, int type);
Mat::Mat(int rows, int cols, int type, const Scalar& s);
Mat::Mat(Size size, int type, const Scalar& s);
Mat::Mat(const std::vector<int>& sizes, int type);
Mat::Mat(const std::vector<int>& sizes, int type, const Scalar& s);
Mat::Mat(const Mat& m);

void Mat::create(int rows, int cols, int type);
void Mat::create(Size size, int type);
void Mat::create(const std::vector<int>& sizes, int type);
  • 参数如下
参数 含义
rows 行数
cols 列数
type 数据类型(CV_16F)
size Size(宽(列数),高(行数))

7.1 数据类型Scalar

  • Scalar(gray)
  • Scalar(blue,green,red)

8.通过ptr与at函数遍历矩阵

8.1 Vec类型

typedef Vec<uchar, 2> Vec2b;
typedef Vec<uchar, 3> Vec3b;
typedef Vec<uchar, 4> Vec4b;
 
typedef Vec<short, 2> Vec2s;
typedef Vec<short, 3> Vec3s;
typedef Vec<short, 4> Vec4s;
 
typedef Vec<ushort, 2> Vec2w;
typedef Vec<ushort, 3> Vec3w;
typedef Vec<ushort, 4> Vec4w;
 
typedef Vec<int, 2> Vec2i;
typedef Vec<int, 3> Vec3i;
typedef Vec<int, 4> Vec4i;
typedef Vec<int, 6> Vec6i;
typedef Vec<int, 8> Vec8i;
 
typedef Vec<float, 2> Vec2f;
typedef Vec<float, 3> Vec3f;
typedef Vec<float, 4> Vec4f;
typedef Vec<float, 6> Vec6f;
 
typedef Vec<double, 2> Vec2d;
typedef Vec<double, 3> Vec3d;
typedef Vec<double, 4> Vec4d;
typedef Vec<double, 6> Vec6d;
  • 以下为实例
Mat a(Size(2560,1440),CV_8UC3);
for(int i=0;i<a.rows;i++){
      for(int j=0;j<a.cols;j++){
          a.ptr(i,j)[0]=0;
          a.ptr(i,j)[1]=0;
          a.ptr(i,j)[2]=255;
      }
}
for(int i=0;i<a.rows;i++){
      for(int j=0;j<a.cols;j++){
          a.ptr<Vec3b>(i,j)[0]=0;
          a.ptr<Vec3b>(i,j)[1]=0;
          a.ptr<Vec3b>(i,j)[2]=255;
      }
}
for(int i=0;i<a.rows;i++){
      for(int j=0;j<a.cols;j++){
          a.at<Vec3b>(i,j)[0]=0;
          a.at<Vec3b>(i,j)[1]=0;
          a.at<Vec3b>(i,j)[2]=255;
      }
}
  • 用ptr访问可以不加Vec类型,ptr访问是最快的
  • 用at访问必须加Vec类型,at访问比ptr略微慢一些

9.通过迭代器遍历矩阵(easy but very very slow)

Mat a(Size(2560,1440),CV_8UC3);
for(auto iter=a.begin<Vec3b>();iter!=a.end<Vec3b>();iter++){
      iter[0]=255;
      iter[1]=0;
      iter[2]=0;
}

本文由博客一文多发平台 OpenWrite 发布!

标签:教程,Mat,int,矩阵,typedef,OpenCV,Vec,type,CV
From: https://www.cnblogs.com/UnderTurrets/p/18360679

相关文章

  • SpringBoot整合MyBatis,入门教程,细节无敌,不能错过
    需求SpringBoot整合MyBatis。实现步骤搭建SpringBoot工程引入mybatis起步依赖、添加mysql驱动编写DataSource和MyBatis相关配置定义表和实体类编写dao和mapper文件/纯注解开发测试惨痛的教训同一个项目里,application.*文件只能有一个,如果有多个就会出现一些神奇问题......
  • idea 2023.2安装教程(含激活码)长期有效
    申明:本教程IDEA补丁、补丁均收集于网络,请勿商用,仅供个人学习使用,如有侵权,请联系作者删除。若条件允许,希望大家购买正版!idea2023.2安装教程(含激活码)长期有效idea@ActivationCode使用流程Step1第一步下载IDEA软件Step2清空IDEA以前使用过激活方式Step3开始加......
  • 视频号分销系统搭建教程,源码分享+系统部署上线指南
    目录一、视频号分销系统是什么?二、怎么搭建视频号分销系统?(一)系统设计与开发(二)测试与优化(三)部署与上线三、部分代码分享一、视频号分销系统是什么?二、怎么搭建视频号分销系统?搭建视频号分销系统是一个涉及多个技术层面的复杂过程,以下是从技术层面出发的详细步骤和......
  • 短剧CPS系统搭建全攻略:从零到一,详细教程助你快速上手
    目录一、短剧cps是什么?二、短剧cps系统搭建教程1.前端开发2.后端开发4.自动化与持续集成5.数据分析与监控三、部分代码展示 一、短剧cps是什么?短剧CPS系统是一种基于短剧推广的收益分成平台。该系统集成了短剧内容展示、用户观看、付费购买、佣金分成等功能,......
  • Polars简明基础教程七:Series 和 DataFrame 以及它们之间的转换_A
    在听完这次讲座之后,您将能够:初步认识Series和DataFrame的一些特性。在Series和DataFrame列之间进行转换。在Python的lists(列表)、dicts(字典)与Series和DataFrames之间来回转换。Series在Polars中,Series是一个非常重要的数据结构,它类似于NumPy的数组或Pa......
  • Polars简明基础教程八:Series 和 DataFrame 以及它们之间的转换_B
    在Series和DataFrame列之间进行转换我们先使用方括号从DataFrame的列中创建一个Series(    df["age"]    .head(3))请注意,Series有一个名称(age)和一个数据类型(64位浮点数)。我们还可以使用to_series从单列的DataFrame中创建一个Series(我们将在本课程的下一节中......
  • 【Three.JS零基础入门教程】第四篇:基础变换
    前期回顾:【Three.JS零基础入门教程】第一篇:搭建开发环境【Three.JS零基础入门教程】第二篇:起步案例【Three.JS零基础入门教程】第三篇:开发辅助接下来,我们通过三种基础的变换来加深对3D坐标系中坐标和单位的理解,同时也是动画的基础.分别是:移动缩放旋转效果1......
  • 华为云 CentOS 7.9安装jdk1.8教程
    1、通过yum安装:使用查找命令:yum-ylistjava*使用安装命令:yuminstall-yjava-1.8.0-openjdk.x86_64 (选择自己要安装的版本,名称必须与上面的名称一致)默认安装到:usr/lib/jvm然后查看版本:java-version 2、通过自己下载解压安装:可以选择自己要下载的具体版本,比较灵活,可......
  • 矩阵系统如何助力连锁店效益倍增
    矩阵系统如何助力连锁店效益倍增对于连锁店来说,如何快速扩大品牌影响力并使发布的视频带来更大效益是至关重要的。而我们的矩阵系统可以全面管理和解决这些问题。1、多平台内容同步:连锁店通过矩阵系统实现内容在各大短视频平台的即时同步,确保品牌信息迅速传播至广泛的受......
  • Redis Desktop Manager(Redis可视化工具)安装及使用详细教程
    一、安装包下载直接从官网下载,官网下载链接地址:Downloads-Redis二、安装步骤2.1说明RedisDesktopManager是一款简单快速、跨平台的Redis桌面管理工具,也也被称作Redis可视化工具。支持命令控制台操作,以及常用,查询key、rename、delete等操作。2.2安装步骤2.2.1双击运......