002-OpenCV4(C++)认识图像对象-Mat并以六种方式创建Mat,以及获取图像宽 高 通道 深度 类型,运用数组和指针遍历与访问像素

opencv 三 Mat的基本操作2(图像读取保存、颜色空间、裁剪、缩放、旋转) Opencv中对彩色图的操作同样可以应用于灰度图和二值图,彩色图与灰度图直接的区别在于颜色类型空间类型的不同,这里以彩为操作示例。RGB、BGR、LAB、HSV是常见的3通道(CV_8UC3、CV_32FC3)彩色图类型,灰度图通常是一个通道的图像,二值图的数据类型与灰度图是一样的(CV_8UC1)。 阅读详情

.什么是Mat

图像文件的内存数据对象,通俗说就是在OpenCV当中用来把imread读取进来的图像存储起来结构在内存当中大致分为两块,一块是头部,存储一些原数据的信息,这些原数据的信息包括图像的宽高位数深度等等另一块是数据部分,就是他的像素数据。我们一般比较感兴趣的就是寻找他的像素数据,我们想改变图像上的信息我们就要改变像素数据。

当我们把读取一个图像数据之后,我们把他赋值给另外一个Mat对象,这两个Mat对象都指向同一个Date Block,他的数据部分并没有改变,但当我们拷贝或者克隆Mat对象,他就会完完全全创建一个新的Mat对象。

.获取图像 宽 高 通道 深度 类型

#include<opencv2/opencv.hpp>
#include<iostream>

using namespace cv;
using namespace std;

int  main(int argc, char**argv) {
	Mat src = imread("D:/images/flower.png");//读取图片
	if (src.empty()) {
		printf("Could not find image file");
		return -1;
	}
	namedWindow("002-Demo", WINDOW_AUTOSIZE);//创建自适应窗口
	imshow("002-Demo", src);
	int width = src.cols;//获取宽
	int height = src.rows;//获取高
	int dim = src.channels();//获取通道
	int d = src.depth();//获取深度
	int t = src.type();//获取类型
	cout << "width:" << width<<endl << "height:" << height << endl << "dim:" << dim <<endl << "depth:" << d << endl << "type:" <<t<<endl;//输出
	waitKey(0);
	destroyAllWindows();
	return 0;
}

 运行结果如下

 .图像类型与结构信息

.Mat对象创建(六种方式)

方式一

//create one
    Mat t1 = Mat(256, 256, CV_8UC3);
//第一个参数表示图像高,第二个参数表示图像宽,第三个参数表示通道类型
    t1 = Scalar(0,255,255);//给图像上色

方式二

//create two
	Mat t2 = Mat(Size(256, 256), CV_8UC3);
	t2 = Scalar(0, 255, 255);

方式三

//create three
	Mat t3 = Mat::zeros(Size(256, 256), CV_8UC3);//zeros:表示创建所有通道全为0的

方式四和五

    Mat t4 = src;
	Mat t4 = src.clone();//克隆图像
	src.copyTo(t5);//复制图像

方式六

Mat t6 = Mat::zeros(src.size(), src.type());//创建一个和src一样尺寸和类型的像素为0的图像

遍历与访问像素(两种方式)

方法一:基于数组遍历方式

//visit each pixel
	int ch = src.channels();
	for (int row = 0; row < height; row++) {
		for (int col = 0; col < width; col++) {
			if (ch == 3) {
				Vec3b pixel = src.at<Vec3b>(row, col);
				int blue = pixel[0];
				int green = pixel[1];
				int red = pixel[2];
				src.at<Vec3b>(row, col)[0] = 255 - blue;
				src.at<Vec3b>(row, col)[1] = 255 - green;
				src.at<Vec3b>(row, col)[2] = 255 - red;
			}
			if (ch == 1) {
				int pv = src.at<uchar>(row, col);
				src.at<uchar>(row, col) = (255 - pv);
			}
		}
	}
	imshow("pixel-demo", src);

运行结果 数组遍历方式将原图相反图显示了出来

 方法二:基于指针遍历方式

Mat result = Mat::zeros(src.size(), src.type());
	for (int row = 0; row < height; row++) {
		uchar*curr_row = src.ptr<uchar>(row);//获取当前行指针
		uchar*result_row = result.ptr<uchar>(row);
		for (int col = 0; col < width; col++) {
			if (dim == 3) {
				
				int blue = *curr_row++;
				int green = *curr_row++;
				int red = *curr_row++;
				*result_row++ = blue;
				*result_row++ = green;
				*result_row++ = red;
			}
			if (dim == 1) {
				int pv = *curr_row++;
				*result_row++ = pv;
			}
		}
	}
	imshow("pixel-demo", result);

运行结果 指针遍历方式将原图复制了一遍

opencv(c++)核心模块core------mat矩阵的遍历5种方式 1.指针数组方式 2.ptr方式 3.at方式 4.内存连续法 5.迭代器遍历法 阅读详情

相关推荐

OpenCV4(C++) —— Mat类

在python的opencv中,也就是导入:import cv2。使用的是numpy和内置ndarray来存储和处理图像数据。而对于C++的opencv是没有ndarray的,也没有numpy库,而是使用cv::Mat类来表示图像数据与进行处理的。python是一种动态类型语言,无需显示的指定变量的类型。直接使用imread返回的就是ndarray对象,后续使用numpy库可以直接对其进行相关图像操作。import cv2C++是一种静态类型语言,任何变量都需要显示地指定一个数据类型。

qq_43199575的博客 4242

Flink SQL client相关资料收集

执行外部的sql https://blog.youkuaiyun.com/qq_26502245/article/details/107520111 https://blog.youkuaiyun.com/qq_31866793/article/details/108975103 TableEnvironment 使用相关 https://blog.youkuaiyun.com/weixin_43970890/article/details/102502887

328

MATLAB实现数字图像相关DIC的亚像素形变测量

数字图像相关(DIC)是一种基于图像灰度纹理的非接触式全场形变测量技术,其核心在于通过匹配变形前后图像中同一物理点的坐标偏移,实现亚像素级位移反演。原理上依赖散斑图案稳定性、多尺度金字塔搜索与双三次插值精化,技术价值体现在无需传感器贴片、支持复杂边界与动态过程监测。典型应用于材料力学实验、结构健康监测及微电子可靠性测试等场景。本文聚焦MATLAB平台下的DIC工程落地,详解子区尺寸选择、NCC相关准则、相机标定与散斑质量控制等关键实践要素,覆盖从图像预处理到应变云图生成的完整链路。

weixin_32612263的博客 220

Opencv C++入门学习 二、Mat创建图像(矩阵),获取图像信息,感兴趣区域(Rect)

其中数据类型有很多种,常用的应该有:CV_8U:8位无符号型(0~255),即灰度图像;CV_8UC3:三通道8位无符号型,这里三通道指B(蓝)G(绿)R(红),与matlab中的RGB正好相反。对于灰度图像:可以直接给出初始值,也可以使用Scalar();

CV_X.Wang的博客 927

ROS2+Gazebo工业级无人机仓库巡检仿真系统

ROS2与Gazebo是构建机器人仿真验证体系的核心技术组合:ROS2提供确定性DDS通信、节点生命周期管理与QoS分级保障,支撑多传感器时间同步与工业级可靠性;Gazebo则通过高保真物理引擎、可配置传感器噪声模型及SDF分层材质系统,实现光照、反射、遮挡等真实仓储环境要素的可控建模。其技术价值在于将现场不确定性前置为可复现的仿真变量,显著降低实机调试风险与交付成本。典型应用场景包括智能仓储AGV协同巡检、冷链货位OCR识别鲁棒性验证、窄巷道路径规划算法压测等。本文聚焦于基于ROS2 Humble与Gaz

weixin_29045585的博客 320

基于ProXmoX VE的虚拟化家庭服务器(篇一)—ProXmoX VE 安装及基础配置

ProxmoxVE是一款套开源的虚拟化管理软件,用户可通过网页的方式来管理服务器上使用kvm以及lxc技术运行的虚拟机。同时提供了一些先进功能的支持,如集群、HA等。PVE虽然是开源,却是由一个商业公司在运营、更新以及维护。...

隔壁老瓦的专栏 6321

OpenCV中cv::Mat矩阵的四种遍历

OpenCV中cv::Mat矩阵的四种遍历方式

weixin_45580017的博客 4160

RoboMaster机甲大师赛备赛:如何用STM32+CAN总线精准控制四个大疆3508电机?

本文详细介绍了在RoboMaster机甲大师赛中,如何利用STM32和CAN总线技术精准控制四台大疆3508电机。从硬件架构设计、多电机ID分配、数据解析到同步控制算法,全面解析了构建高响应、低延迟底盘驱动系统的关键技术,助力参赛队伍提升机器人运动性能。

weixin_28684825的博客 134

OpenCV Mat遍历的方法

OpenCV像素遍历常用的是三种方法:ptr指针,迭代器(iterator)以及动态地址at。 动态地址at不适合用于像素遍历,速度太慢了,比较适合随机访问的方式; 使用Mat的ptr指针进行图像遍历更加高效, 特别的:一般图像行与行之间往往存储是不连续的,但是有些图像可以是连续的,Mat提供了一个检测图像是否连续的函数isContinuous()。当图像连通时,我们就可以把图像完全展开,看成是一行进行处理。 因此最高效的遍历方法如下: void image_copy(cv::Mat &amp

AI吃大瓜的博客 6646

新手也能搞定!用ADS 2023从零设计一个超宽带Wilkinson功分器(附完整版图)

本文详细介绍了如何使用ADS 2023从零开始设计超宽带Wilkinson功分器,涵盖介质板参数设置、微带线计算优化、版图生成验证等关键步骤。通过实例演示和常见问题排查,帮助射频工程新手快速掌握功分器设计技巧,提升设计效率。

weixin_42692935的博客 476

ROS机器人里程计模型

3.5 移动机器人系统模型 相信大家的机器人平台STM32端底层控制和机器人urdf建模都已经顺利完成了,在正式开始ros端编写机器人启动功能包之前,我们还不得不学习一些必要的理论知识。别担心数学不好,这里基本都是高中数学。下面我们开始,Are you ready? 没准备好也开始了。 3.5.1 常用坐标系系统模型 在移动机器人技术研究中,最为常用的坐标系统是笛卡尔坐标系统。而在SLAM算法研究中,有如下几个比较常见的笛卡尔坐标系统,它们分别为机器人坐标系XR YR OR 、传感器坐标系XS YS OS

「小白学移动机器人」一个专注分享移动机器人相关知识的公众号! 1万+

【OpenCV C++学习】1、Mat像素操作(ptr指针遍历)

自学OpenCV的一点小笔记

qq_54003651的博客 2567

Windows 下 Claude Code Desktop 安装与使用全记录:从零到一的保姆级图文教程

本文主要介绍了Windows 下 Claude Code 安装全记录:从零到一的保姆级图文教程,希望能对学习使用 Claude Code 的同学们有所帮助。 文章目录 1. 背景 2. 安装Claude Code Desktop 3. 配置第三方API 4. 日常使用

weixin_43178406的博客 8万+

OpenCV 2.2 的学习笔记(二)

继续上一个工程,实现一些有关图像的其他简单的功能: 1、获取图像的大小: cv::Mat image = cv::imread("img.jpg"); image.size().width 与 image.size().height 就是图像的宽与高。 2、检查图像中的信息: if (!image.data) // error occurred ... 3、反

myas0735的专栏 912

环境仿真软件:MIKE 21_(9).MIKE21水生植物模块介绍

MIKE21支持多种水生植物的模拟,用户需要在配置文件中定义植物种类及其特性。</</</</</</</</</假设我们需要定义一种新的水生植物“水葫芦”(Water Hyacinth),并将其特性写入配置文件。# 创建XML根元素# 定义新的植物种类# 生成XML文件假设我们需要分析仿真的水流速度变化,并绘制水流速度随时间变化的图。# 读取NetCDF文件# 获取水流速度数据# 获取时间数据# 绘制水流速度随时间变化的图plt.xlabel('时间 (天)')

kkchenjj的博客 727

Windows 11 WSL2环境下OpenClaw部署的兼容性问题分析与解决方案研究

本文研究了OpenClaw在Windows 11 WSL2环境下的部署方案。WSL2通过无缝集成Linux与Windows系统,为OpenClaw提供了良好的运行环境,支持GPU加速和跨平台开发。文章详细分析了硬件配置要求(推荐8核CPU/16GB内存/NVMe SSD)、系统选择(Windows 11 Pro+Ubuntu 22.04)以及部署步骤,包括WSL2启用、Linux发行版安装、Python/Node.js/Redis等依赖配置。通过优化.wslconfig文件参数(如内存分

博客 2279

OpenCV Mat类型的遍历与访问

1、指针遍历 uchar *data1 = M.ptr<uchar>(0);只有“()”需要uchar类型的指针接收 uchar data2 = M.ptr<uchar>(1)[2]; uchar data3 = M.ptr<uchar>(2)[3]; 注意: 1.图像的指针是从(0,0)位置开始,并且“()”代表行,“【】”代表列;因此“(0)”是第一行,“【1】”是第二列。 2.由于mat中存储的像素数据是uchar或vec3d格式,.........

qq_44771627的博客 4242

滤波电路Multisim电路仿真实验汇总——硬件工程师笔记

本文系统介绍了滤波电路的基础知识及其应用。首先按频率选择性和实现方式对滤波电路进行分类,详细阐述了低通、高通、带通、带阻滤波器以及无源、有源滤波器的特点。接着重点分析了桥式整流电容滤波、电感滤波、LC滤波和CRπ型滤波四种典型电路的工作原理、应用场景及设计要点。通过理论公式和实际案例,指导如何选择滤波元件参数,考虑寄生效应,并通过仿真验证设计效果。最后提供了硬件工程师笔试面试相关的技术资源链接,包括器件知识、电路仿真及企业真题解析等内容。本文可作为电子电路设计领域工程技术人员的学习参考资料。

XU157303764的博客 2166

OpenCV(c++) 笔记一 :图像的读取与保存、修改、Mat常用函数、掩膜

理解并不是很深刻的笔记,做给自己看的。记录常用的API,一些常用的函数和方法来便于回忆与复习。本笔记内容均来自B站视频教学,需要一定的C(C++)语言基础。 图像处理的本质是对图像上的每个像素点进行相应的数学处理,以此达到预期的效果。 图像的读取和显示、保存 Mat src = imread("地址",IMREAD_COLOR); if (src.empty()) { printf("...

qq_43425914的博客 2828

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

C++ 高效的遍历opencv Mat像素

文章目录前言一、直接获取Mat对象的data数据的指针代码如下:耗时如下:二、再看看行优先和列优先遍历的耗时行优先代码如下:耗时如下:列优先代码如下:耗时如下:三、总结 前言 在文章https://blog.youkuaiyun.com/weixin_44901043/article/details/120047996?spm=1001.2014.3001.5502 中,从内存存储上,分析了行优先遍历和列优先遍历方式效率差别,得出行优先遍历的方式比列优先效率快的结论。在该文中,采用的是Mat对象提供的at()函数通过

weixin_44901043的博客 5494

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

C++学习笔记——Mat类详解及元素的遍历方法

全文部分引自:http://blog.youkuaiyun.com/xiaowei_cqu/article/details/7771760 Mat的常见属性data uchar型的指针。Mat类分为了两个部分:矩阵头和 指向矩阵部分的指针,data就是指向矩阵数据的指针 dims 矩阵的维度,例如5*6矩阵是二维矩阵,则dims=2,三维矩阵dims=3 rows 矩阵的行数 cols 矩

不忘初心 方得始终 2715

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Opencv:通过Mat遍历图像的5种方法

结论:直接地址访问连续地址>ptr>直接地址访问不连续地址>at>迭代器。

weixin_52286793的博客 1290

c++获取图像的长宽 opencv_OpenCV Mat对象 - 获取数据长度

In OpenCV, I'm able to capture frames using VideoCapture in C++, however, when I try to get the data from a frame and calculate length, it just returns me 0.Below is my sample code:VideoCapture cap(0)...

weixin_35089891的博客 3099

【OPencv】计算图像大小

OPenCV计算图像大小 data: uchar类型的指针,指向Mat数据矩阵的首地址。可以理解为标示一个房屋的门牌号; dims: Mat矩阵的维度,若Mat是一个二维矩阵,则dims=2,三维则dims=3,大多数情况下处理的都是二维矩阵,是一 个平面上的矩阵。 可以理解为房屋是一个一层的平房,三维或更多维的则是多层楼房; rows: Mat矩阵的行数。可理解为房屋内房间行数; col

qq_44513198的博客 1171

【笔记】Opencv Mat 图像处理基本操作

1. 图片加载、灰度图、显示和保存 cv::Mat img = cv::imread("01.jpg"); //cv::Mat img = cv::imread("01.jpg", 0); //以灰度图读入 cv::cvtColor(img, img, cv::COLOR_BGR2GRAY); cv::imshow("img_show", img); cv::waitKey(); cv::imwrite("save.jpg", img); 2. 图片宽、高、通道模式、平均..

nyist_yangguang的博客 2741

OpenCV-C++对图像像素的四种遍历操作

OpenCV-C++对图像像素的四种遍历操作

昊虹AI笔记 3804
上一篇: 001-OpenCV(C++)图像文件加载显示保存与创建窗口
下一篇: 003-OpenCV(C++)加减乘除,利用加法调整图像亮度,调整图像亮度与对比度
AlexanderMiao
博客等级 码龄5年 7粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值