Mat类型中的CV_8UC3、CV_32FC3以及对应的迭代器模板参数Vec3b,Vec3f的一点自己的理解

OpenCV Mat指针访问:从内存原理到高性能图像处理实战 在计算机视觉和图像处理领域,内存操作是性能优化的核心基础。理解数据在内存中的连续存储原理,是进行高效像素级处理的关键。通过直接操作内存地址,开发者可以绕过高级API的封装开销,实现数量级的性能提升,尤其在处理高清视频流、大尺寸图像或实时算法时至关重要。这种底层访问技术,如OpenCV中的ptr()方法,要求对内存布局、数据类型和字节对齐有清晰认识。其技术价值在于为密集计算、邻域操作和自定义算法提供了最大灵活性。应用场景涵盖图像滤波、特征提取、实时视频分析等。本文聚焦于OpenCV Mat的指针访问机制,深入 阅读详情

贴上一段很简单的测试代码

int main()
{
    Mat a(100,100,CV_8UC3,Scalar(366,366,366));
    MatIterator_<Vec3b> it = a.begin<Vec3b>();
    cout << int((*it)[0]) << endl;
    imshow("a",a);

    Mat b(100,100,CV_32FC3,Scalar(366,366,366));
    MatIterator_<Vec3f> itc = b.begin<Vec3f>();
    cout << (*itc)[0] << endl;
    imshow("b",b);
    waitKey(0);

    return 0;
}
输出结果如下图:


这段代码能够说明一些问题,即图片a中的CV_8UC3指的就是Mat里面的类型是uchar类型的,并且通道数是3,当我们用Scalar(366,366,366)给其赋值,输出他的B通道像素值还是255,这是由于uchar类型的范围就是在[0,255]之间决定的。

而图片b中的CV_32FC3指的就是Mat里面的类型是float类型的,并且通道数是3,当我们用Scalar(366,366,366)给其赋值,输出的B通道的像素值就是我们所赋的366,因为float类型的范围远大于366,是可以输出的,原因是一个float所占的内存也要比uchar多,uchar是一个字节,float是4个字节,所以其能表示的范围也更大。

在三通道的时候,我们用MatIterator迭代器或者Mat.at<T>方法访问像素的时候,需要根据Mat类型来选取相应的模板类型。还是以上述代码为例,当我们的Mat类型是CV_8UC3的时候,我们就要用Vec3b,而当时CV_8UC1的时候,我们直接就用uchar来访问,有人可能会有疑惑为什么依照Vec3b的规律用Vec1b来访问,事实上我们可以查看到Vec3b的定义如下:

typedef Vec<uchar, 2> Vec2b;
typedef Vec<uchar, 3> Vec3b;
typedef Vec<uchar, 4> Vec4b;
你会发现根本没有Vec1b这一说,为什么呢?当时CV_8UC3的时候表示是3个通道每个通道是uchar类型的,而当时CV_8UC1的时候,表示一个通道,其类型是uchar,既然如此,都一个通道了,直接用uchar访问不就好了?还用得着Vec1b吗?当然以后可能opencv也会提供这样的访问方式,但本质上还是一个uchar。

同理可得,可看Vec3f的定义:

typedef Vec<float, 2> Vec2f;
typedef Vec<float, 3> Vec3f;
typedef Vec<float, 4> Vec4f;
typedef Vec<float, 6> Vec6f;
同样还是没有Vec1f,原因同上,对类型为CV_32FC1访问的时候用float做模板类型即可访问,例
Mat c(100,100,CV_32FC1,Scalar(366));
MatIterator_<float> itc;


写了以上这些,希望对大家能有一些帮助,最后总结下就是用迭代器或者at方法访问图片像素的时候,一定要根据Mat图片的数据类型(uchar,int,float,double)以及通道数
(1,2,3...)来决定,否则会出现一些因为数据类型不对而难以检查出来的bug。

Python逆向爬取Tik Tok,MsToken,X-Bogus以及signature tiktok作为字节海外的自媒体平台,具有很非常大的价值,本文旨在教会大家实现Tik Tok的签名获取以及数据的最终爬取。 阅读详情

相关推荐

知识图谱-Neo4j-开始构建知识图谱-01

关系(Relationships):连接两个节点,具有方向(→ 或 ←)和类型(Type),可附加属性。 属性(Properties):键值对,存储节点或关系的详细信息(如 , )。 (2) Cypher 查询语言 直观语法:通过模式匹配直接描述图结构。 高效遍历:支持复杂关系路径查询(如最短路径、模式匹配)。 3. 核心优势 (1) 原生图存储 物理存储优化:数据以图结构直接存储,避免传统数据库的“表连接”开销。 高效遍历:通过指针直接访问相邻节点,时间复杂度接近 O(1)。 (2) 高性

寓教于乐。教己助人 1万+

Opencv 创建图像时,CV_8UC1,CV_32FC3等参数的含义

转载链接:http://blog.youkuaiyun.com/maweifei/article/details/51221259 CV_bit_depth>(S|U|F)Cnumber_of_channels> 1--bit_depth---比特数---代表8bite,16bites,32bites,64bites---举个例子吧--比如说,如 如果你现在创建了一个存储--灰

zuqiutxy的博客 3万+

从Android到鸿蒙:UI框架迁移的实战指南与最佳实践

本文为Android开发者提供了将应用UI框架迁移至鸿蒙系统的实战指南。文章深入对比了Android命令式编程与鸿蒙ArkUI声明式编程的核心差异,详细讲解了从环境配置、布局迁移(如RecyclerView转List)、逻辑处理到多设备适配与性能优化的全流程最佳实践,帮助开发者高效完成迁移工作。

weixin_29208077的博客 433

OpenCV 中 CV_8UC1,CV_32FC3,CV_32S等参数的含义

CV_8UC1:8位无符号整数单通道图像(灰度图像)。CV_32FC3:32位浮点数三通道图像(彩色图像,每个通道有浮点数值)。CV_32S:32位有符号整数单通道图像(通常用于特定类型的数据,如深度图)。这些参数在创建图像、读取图像、处理图像时非常重要,因为它们决定了图像的存储方式和可处理的数据类型。

u013798595的博客 2792

什么事LLVM和Clang?Clang与GCC有什么区别?Clang如何使用?

这个问题主要讲Xcode编译器的认知,在学习iOS之前有必要学习一下Objective-C的编译环境。 在了解LLVM和Clang之前,先得了解一下什么是编译器。 编译器是一种计算机程序,它将某种编程语言(高级编程语言)写成的源代码转换成另一种编程语言(低级编程语言)。一个现代编译器的主要工作流程为:源代码->预处理器->编译器->目标代码->链接器->可执行程序...

Welcome~ 9723

适航规章、标准,书籍资料下载汇总(更新中)

以下是一些收集到的适航相关的资料,分享给大家。(如果没有你想要的资料,请留言,等找到会及时更新!

qq_41854911的博客 2541

OpenCvSharp:MatType与C#数据类型对应关系

OpenCvSharp的MatType类型与C#数据类型对照表

图南堂 2257

不同IP网段的PLC进行S7通信(PUT_GET)的具体步骤

不同IP网段的PLC进行S7通信(PUT_GET)的具体步骤 一般情况下,我们使用西门子的S7通信时都是将网络中的PLC的IP设置在同一网段,那么如果涉及到旧项目改造时,不方便修改IP地址,只能进行2个网段通信时,可以参考以下步骤: 准备条件: 2个路由器 CPU 1212C 主动连接 CPU 314C-2PN/DP 被动连接 网络搭建如下图所示: S7-1212C一侧 建立S7主动连接 ,IP地址:192.168.5.40,编写get/put 通信程序 S7-300 IP地址:192.168.0

Robot_PLC_HMI_Automation 2万+

opencv mat图片的CV_8UC3转格式显示到UE的texture2d

项目需要使用相机采图实时显示到界面,使用的相机居然只能输出3通道的图,然而UE4的texture2D也是坑,居然不支持3通道图的初始化和数据拷贝,使用下面的方式可以实现转换,但是效率太低,导致游戏的整体帧率大幅度下降。这里的FrameTexture可以在FrameTexture大小变化的时候才创建一次,其他时候只需要修改数据块就可以了,同样可以优化程序。除此之外,相机居然还改不了输出的图片分辨率,没办法还得自己来,我不需要那么大分辨率,所以把图片分辨率该小就可以提升一点性能。

u012505629的博客 1571

LVGL iPhone Duo 开合过渡

环境:LVGL 9.x(需要软件模糊),窗口建议 1280×800。界面文案英文(默认 Montserrat 无 CJK)。

摸鱼专家 147

SAP自动化-ME51N批量创建采购申请

2、需要管理员授权RZ11脚本录制回放功能。1、仅限于正对SAP日常工作的批量处理。3、数据模板按实际需求更新。物料编码,工厂,数量。

小九啥也不会 529

[opencv4]Mat的用法和CV_8UC3的参数解释

目录 完整Demo: 参数解释 完整Demo: https://github.com/youhengchan/learn_opencv4/tree/master/02-Mat 参数解释 https://docs.opencv.org/master/d6/d6d/tutorial_mat_the_basic_image_container.html 官网的tutorial中...

... 4629

第 2 章:PassThrough 直通滤波

通过设置某个维度(如 x、y、z 或 rgb)的取值范围,仅保留该范围内的点,从而达到**点云裁剪(裁边)**或过滤异常值的目的。所有在该范围之外的点会被移除(可选是否保留);点云中包含背景、地面或传感器噪声,需要过滤;通过 z 轴过滤,只保留桌面上方的物体;多轴组合过滤(如同时过滤 x、y、z);可用于地面剔除、车载点云预处理等场景。不支持一次过滤多个字段,可多次调用;仅处理某一层或某一区域的点云数据。原始点云中包含地面、墙面、背景等;在区域裁剪、前景提取中广泛使用;设定一个轴(如z轴);

yumeiguo的博客 336

C++ OpenCV实战指南:从环境搭建到深度学习部署

计算机视觉作为人工智能的核心分支,通过算法让机器“看懂”图像与视频,其原理涉及图像处理、模式识别和机器学习。这项技术能高效提取并分析视觉信息,在自动驾驶、工业检测和增强现实等领域具有极高价值。OpenCV作为开源计算机视觉库,提供了丰富的算法实现,而C++凭借其高性能和精细的内存控制,成为工业级视觉系统的首选。本文聚焦C++与OpenCV的工程实践,详细解析了开发环境配置、核心数据结构cv::Mat的操作、特征提取与目标检测等关键模块,并深入探讨了性能优化和现代C++特性结合等工程化议题,为开发者构建高效、

350

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

OpenCVSharp学习笔记(2)--Mat基本图像容器

OpenCVSharp Mat基本图像容器

图南堂 1632

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

CV_8UC1,CV_8UC2,CV_8UC3 Vec2b Vec3b Vec4b 含义

在OpenCv中,使用Mat存图像,有专门的数据类型 一般的图像文件格式使用的是 Unsigned 8bits吧,CvMat矩阵对应的参数类型就是 CV_8UC1,CV_8UC2,CV_8UC3。 其中 U代表 Unsigned 无符号、C代表CvMat 后面的数字代表通道数 (最后的1、2、3表示通道数,譬如RGB3通道就用CV_8UC3) 而float 是32位的,对应CvMat数据结...

ding_programmer的博客 6874

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

CV_8U和CV_32F与CV_8UC3和CV_32FC3区别

标题 opencv 中常用数据类型的区别以及数据类型的转换 8代表8bit 每一个像素点在内存空间占用8bit S–代表—signed int—有符号整形 U–代表–unsigned int–无符号整形 F–代表–float---------单精度浮点型 同时注意 CV_8U 代表的是单通道图像,数据范围是{0-255} CV_32F代表的图像是单通道图像,数据范围是{0.0 - 1.0} imshow在显示图像时均会映射到{0-255}之间 CV_8U显示的就是0-255但要注意,在显示CV_32F类

qq_43422995的博客 6505

CV_8UC1,CV_8UC2,CV_8UC3, CV_32FC3, CV_64FC3等区别

一般的图像文件格式是Unsigned 8bits, 在CvMat矩阵对应的参数类型就是CV_8UC1,CV_8UC2,CV_8UC3(最后的1、2、3表示通道数,如RGB是3通道,对应CV_8UC3)。 而float 是32位的,对应CvMat参数:CV_32FC1,CV_32FC2,CV_32FC3。 double是64bits,对应CvMat参数:CV_64FC1,CV_64FC2,CV_64FC3等。 ...

是鲤鱼啊 4515

【opencv】CV_8UC1,CV_32FC3等参数的含义

示例: CV_<bit_depth>(S|U|F)C<number_of_channels> bit_depth 比特数---代表8bite,16bites,32bites,64bites---举个例子吧--比如说, 如果你现在创建了一个存储--灰度图片的Mat对象,这个图像的大小为宽100,高100,那么,现在这张灰度图片中有10000个像素点,它每一...

sidemap的博客 1060

Opencv 中 CV_8UC1,CV_32FC3等参数的含义

出处 经常会在代码中看到如下一下参数,他们是什么意思呢 #define CV_8UC1 CV_MAKETYPE(CV_8U,1) #define CV_8UC2 CV_MAKETYPE(CV_8U,2) #define CV_8UC3 CV_MAKETYPE(CV_8U,3) #define CV_8UC4 CV_MAKETYPE(CV_8U,4) #define CV_8UC(n) CV_MAK...

wmdshhzsmile的博客 1万+

【Opencv】中CV_8UC1、CV_32FC3 等参数的含义

参考:https://blog.youkuaiyun.com/maweifei/article/details/51221259 # 示例: img_ = cv::Mat::zeros(pic_height_, pic_width_, CV_8UC1); Mat不但是一个非常有用的图像容器类,同时也是一个通用的矩阵类。 Mat矩阵(图像容器)创建时CV_8UC1、CV_8UC2等参数格式详解: CV_<bit_depth>(S|U|F)C<number_of_channels>.

lemonxiaoxiao的博客 1746

OpenCV中易错点:理解OpenCV中的数据类型 CV_8UC3 等

OpenCV中易错点:理解OpenCV中的数据类型 CV_8UC3 等

weixin_45580017的博客 3331

opencv入门笔记at的用法

#include   #include      using namespace std;   using namespace cv;      int main(){          Mat image(600,800,CV_8UC1);       Mat image2(600,800,CV_8UC3);       for (int i = 0; i      {  

Visionfuture的博客 7941

opencv——Mat对象depth(CV_8UC3、CV_32F等)

目录Mat对象构成Mat常用成员bit_depthCV_8|32|64S|U|FCMat对象创建方法imshow显示图像的映射 Mat对象构成 class CV_EXPORTS Mat { public: /*..很多方法..*/ /*............*/ int flags;/*flags指定图像的颜色空间 flags > 0 3通道的彩色图像 flags = 0 灰度图像 flags < 0 不作改变

路人coder 5270

CV_8UC1,CV_8UC2,CV_8UC3

图像文件格式使用的是 Unsigned 8bits吧,CvMat矩阵对应的参数类型是CV_8UC1,CV_8UC2,CV_8UC3。 (CV_8UC3,8表示无符号int8位,3通道) 而float 是32位的,对应CvMat数据结构参数就是:CV_32FC1,CV_32FC2,CV_32FC3... double是64bits,对应CvMat数据结构参数:CV_64FC1,CV_64FC2,C...

Loong Cheng的博客 2282

【OpenCV教程】OpenCV中的数据类型

【OpenCV教程】OpenCV中的数据类型

在这里你甚至能学算卦,快进来看看 3454
上一篇: qt this does not seem to be a debug build setting
下一篇: 仿射变换
熊彬程的博客
博客等级 码龄11年 208粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值