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

这篇具有很好参考价值的文章主要介绍了OpenCV中cv::Mat矩阵的四种遍历。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

第一种:at方法遍历

at方法遍历 单通道

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

using namespace std;
using namespace cv;

int main() {
	cv::Mat a = (cv::Mat_<uchar>(4, 4) << 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16);
	cout << a << endl;
	cout << endl;
	//at方法遍历并修改,单通道
	for (int i = 0; i < a.rows; i++) {
		for (int j = 0; j < a.cols; j++) {//j每次移动代表一个像素点的距离,即每次移动一个通道的距离
			a.at<uchar>(i, j) = i + j;
		}
	}
	//
	cout << a << endl;

	return 0;
}

运行结果
opencv 遍历mat,OpenCV基础,opencv,矩阵,计算机视觉

at方法遍历 多通道

(下面这种方式,既能遍历,又能修改)

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

using namespace std;
using namespace cv;

int main() {
	cv::Mat a(4, 4, CV_8UC3, cv::Scalar(1, 2, 3));
	cout << a << endl;
	cout << endl;
	//at方法遍历遍历并修改,三通道
	for (int i = 0; i < a.rows; i++) {
		for (int j = 0; j < a.cols; j++) {//j每次移动代表一个像素点的距离,即每次移动三个通道的距离
			cv::Vec3b temp_channel_array;//temp_channel_array临时的通道数组
			temp_channel_array[0] = 4;
			temp_channel_array[1] = 5;
			temp_channel_array[2] = 6;
			a.at<cv::Vec3b>(i, j) = temp_channel_array;
		}
	}
	cout << a << endl;

	return 0;
}

运行结果:
opencv 遍历mat,OpenCV基础,opencv,矩阵,计算机视觉
对比程序:(下面这种方式,只能遍历,不能修改)

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

using namespace std;
using namespace cv;

int main() {
	cv::Mat a(4, 4, CV_8UC3, cv::Scalar(1, 2, 3));
	cout << a << endl;
	cout << endl;
	//at方法遍历遍历,三通道
	for (int i = 0; i < a.rows; i++) {
		for (int j = 0; j < a.cols; j++) {//j每次移动代表一个像素点的距离,即每次移动三个通道的距离
			cv::Vec3b temp_channel_array= a.at<cv::Vec3b>(i, j);//temp_channel_array临时的通道数组
			temp_channel_array[0] = 4;
			temp_channel_array[1] = 5;
			temp_channel_array[2] = 6;
		}
	}
	cout << a << endl;

	return 0;
}

运行结果
opencv 遍历mat,OpenCV基础,opencv,矩阵,计算机视觉

第二种:指针ptr方法 遍历(两种写法)

第一种写法

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

using namespace std;
using namespace cv;

int main() {
	cv::Mat a(4, 4, CV_8UC3, cv::Scalar(1, 2, 3));
	cout << a << endl;
	cout << endl;
	//指针ptr方法遍历遍历,三通道
	for (int i = 0; i < a.rows; i++) {
		uchar* ptr = a.ptr<uchar>(i);//ptr表示:指向第i行中第一个像素点中第一个通道的指针?
		for (int j = 0; j < a.cols; j++) {
			*(ptr+3*j+0) = 4;//(ptr+3*j+0)表示:指向第i行第3*j列像素点中第一个通道的指针?
			*(ptr+3*j+1) = 5;//(ptr+3*j+1)表示:指向第i行第3*j列像素点中第二个通道的指针?
			*(ptr+3*j+2) = 6;//(ptr+3*j+2)表示:指向第i行第3*j列像素点中第三个通道的指针?
		}
	}
	cout << a << endl;

	return 0;
}

运行结果
opencv 遍历mat,OpenCV基础,opencv,矩阵,计算机视觉
更一般的写法:把里面的3改成矩阵的通道数 a.channels(),如下:

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

using namespace std;
using namespace cv;

int main() {
	cv::Mat a(4, 4, CV_8UC3, cv::Scalar(1, 2, 3));
	cout << a << endl;
	cout << endl;
	//指针ptr方法遍历遍历,三通道
	for (int i = 0; i < a.rows; i++) {
		uchar* ptr = a.ptr<uchar>(i);//ptr表示:指向第i行中第一个像素点中第一个通道的指针?
		for (int j = 0; j < a.cols; j++) {
			*(ptr + a.channels()*j + 0) = 4;//(ptr + a.channels()*j + 0)表示:指向第i行第a.channels()*j列像素点中第一个通道的指针?
			*(ptr + a.channels()*j + 1) = 5;//(ptr + a.channels()*j + 1)表示:指向第i行第a.channels()*j列像素点中第二个通道的指针?
			*(ptr + a.channels()*j + 2) = 6;//(ptr + a.channels()*j + 2)表示:指向第i行第a.channels()*j列像素点中第三个通道的指针?
		}
	}
	cout << a << endl;

	return 0;
}

运行结果
opencv 遍历mat,OpenCV基础,opencv,矩阵,计算机视觉
上面这种写法,是能看到目前这个指针 ptr + a.channels()*j + 0 所指向的是位于第几行第几列中的第几个通道的,下面的写法就不具备这种优势。

第二种写法

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

using namespace std;
using namespace cv;

int main() {
	cv::Mat a(4, 4, CV_8UC3, cv::Scalar(1, 2, 3));
	cout << a << endl;
	cout << endl;
	//指针ptr方法遍历遍历,三通道
	for (int i = 0; i < a.rows; i++) {
		uchar* ptr = a.ptr<uchar>(i);//ptr表示:指向第i行中第一个像素点中第一个通道的指针?
		for (int j = 0; j < a.cols*a.channels(); j++) {//a.cols*a.channels()表示:矩阵中,第i行中所有的通道数。ptr指针每次仅移动一个通道的距离
			*(ptr + j) = 4;
			//ptr[j] = 4;//或者这样也行,等价的写法
		}
	}
	cout << a << endl;

	return 0;
}

运行结果
opencv 遍历mat,OpenCV基础,opencv,矩阵,计算机视觉
上面这种写法,感觉是看不到目前这个指针 ptr+j 所指向的是位于第几行第几列中的第几个通道的,感觉不是很明了。

第三种:使用迭代器遍历

暂无文章来源地址https://www.toymoban.com/news/detail-534250.html

第四种:直接使用 矩阵元素的地址定位 方式遍历

暂无

到了这里,关于OpenCV中cv::Mat矩阵的四种遍历的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • opencv学习(9):cv::Scalar、cv::Mat::zeros

            cv::Scalar是opencv的一个结构体,其定义如下:(c++中的结构体如下,可以存放1~4个数值。)         表示图像颜色时,单通道图像用下标[0]即可,三通道图像用下标[0]、[1]、[2]分别表示B、G、R通道         其中:                 白色:rgb(255,255,255)  

    2024年02月08日
    浏览(38)
  • [OpenCV][C++编程] cv::mat的定义与赋值

    可以通过在/目录下直接搜索opencv,确定opencv所在的目录: lopencv_core 是opencv的核心, -lopencv_highgui包含读取图像和显示图像的函数 -lopencv_imgproc包含图像处理函数(非机器学习方法),例如线性滤波,边缘检测、膨胀腐蚀、检测直线、仿射变换等等。 -lopencv_ml包含机器学习算法

    2024年02月09日
    浏览(35)
  • 【OpenCV】Mat矩阵解析 Mat类赋值,单/双/三通道 Mat赋值

    OpenCV Mat类详解

    2024年02月04日
    浏览(26)
  • OpenCV - cv::Mat与unsigned char*数组或者float*数组相互转换,cv::Mat与std::vector的相互转换

    通常情况下,在同一个opencv项目传递cv::Mat可直接通过const cv::Mat img这种方式传递,但是如果需要进行跨语言传递,比如C++传递到C#或者C#传递到C++,那么通常这种情况下需要将cv::Mat转换为内存指针比如unsigned char指针或者float指针进行传递。 1.1 cv::Mat转换为unsigned char 数组、un

    2024年02月13日
    浏览(40)
  • 【opencv之cv::Mat数据深拷贝和浅拷贝探讨】

    很多时候写程序除了一个强大的架构,细节也很重要,俗话说的话细节决定成败嘛,在使用cv::Mat做图片处理的时候发现,这个数据类型存在深拷贝和浅拷贝的情况,遂想一探究竟。 假设这里原图数据为matSrc : copy方法 结果 matA = matSrc 浅拷贝 matB(matSrc ) 浅拷贝 matC = matSrc .cl

    2024年02月13日
    浏览(22)
  • jni-Android Bitmap与OpenCV cv::Mat互转

    在封装so库的时候,底层c++代码的实现使用了OpenCV对图片进行操作,而Android中从摄像头中获取到的图片数据类型是Bitmap数据类型的,所以这里就避免不了做数据类型的转换。转换的方案主要有两种, 一种是封装的JNI接口方法直接接收cv::Mat数据类型的参数, 第二种是JNI方法的

    2024年02月01日
    浏览(29)
  • opencv03-Mat矩阵API的使用

    构造方法(具体介绍看API文档) 成员方法 成员方法 create

    2024年02月14日
    浏览(40)
  • 【OpenCV】 基础入门(一)初识 Mat 类 | 通过 Mat 类显示图像

    🚀 个人简介:CSDN「 博客新星 」TOP 10 , C/C++ 领域新星创作者 💟 作    者: 锡兰_CC ❣️ 📝 专    栏: 【OpenCV • c++】计算机视觉 🌈 若有帮助,还请 关注➕点赞➕收藏 ,不行的话我再努努力💪💪💪

    2024年04月16日
    浏览(24)
  • C# - Opencv应用(2) 之矩阵Mat使用[矩阵创建、图像显示、像素读取与赋值]

    C# - Opencv应用(2) 之矩阵Mat使用[矩阵创建、图像显示、像素读取与赋值] 矩阵创建 图像显示与保存 像素读取与赋值 新建sample02项目,配置opencv4相关包,新建 .cs 进行测试 两种常用的图像遍历方式 灰度图操作 三通道图操作 完整代码

    2024年02月03日
    浏览(32)
  • 在IOS上YUV NV21格式的CVPixelBufferRef转opencv的RGB格式cv::Mat的方法

    因为业务需要,要做这样一个转换。目前写了两种转换方法。 在iphonex真机上运行,一种方法需要24ms一帧,CPU占用率85%,另一种需要17ms一帧,CPU占用率140%。下面就来详细说说。 转换思路是CVPixelBufferRef-UIImage-cv::Mat的路线。 直接上方法: 先是CVPixelBufferRef-UIImage的方法 然后是

    2024年02月12日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包