初学OpenCV学习记录(二)

以下内容摘自OpenCV2 计算机视觉编程手册
大多数图像处理中,我们需要遍历图像的所有像素,接下来介绍遍历循环的方式(以三通道的彩色图像为例)

存储方式

在一个彩色图像中,图像数据缓冲区的前三个字节对应图像左上角像素的三个通道值,接下来三个字节对应第一行的第二个像素块,以此类推,出于效率考虑,有些图像每行会填补一些额外像素方便一些多媒体芯片处理数据,如果没有填补像素,则图像的有效宽度等于真实宽度。

本节用到的相关参数

成员变量:

  • rows 图像的高度(像素的行数)
  • cols 图像的宽度(像素的列数)
  • step 图像的有效宽度(一行像素包含的字节数)

成员函数:

  • elemSize():返回像素的大小(字节数)
  • channels():返回图像的通道数,比如RGB图像的通道数为3
  • total():返回矩阵的像素个数

遍历图像的方法

(1)指针遍历图像

ptr()模板函数获取图像任意行的地址
代码如下:

int row=image.rows;
int col=image.cols*image.channels();
for(int i=0;i<row;++i){
	uchar* data=image.ptr<uchar>(i);     //获得第i行的首地址
	for(int j=0;j<cols;j++){
		//在这里处理每一个像素data[j]或*data
	}
}

如果图像没有进行填补时,那么每一行的像素在内存中都是连续的,则可以仅使用一个循环就完成遍历。
代码如下:

if(image.isContinuous()) //判断图像是否有填补
{
	image.reshape(1,1);
}
int row=image.rows;
int col=image.cols*image.channels();
for(int i=0;i<row;++i){
	uchar* data=image.ptr<uchar>(i);     //获得第i行的首地址
	for(int j=0;j<cols;j++){
		//在这里处理每一个像素data[j]或*data
	}
}

reshape函数在不改变内存的情况下改变矩阵的维度,参数分别为新的通道数和行数,列数会根据设置值自适应。
还有一种不推荐使用的方式代码如下:

int row=image.rows;
int col=image.cols*image.channels();
for(int i=0;i<row;++i){
	for(int j=0;j<cols;j++){
		uchar *data=image.data+i*image.step+j*image.elemSize();
		//在这里处理每一个像素*data
	}
}
(2)使用迭代器遍历图像

OpenCv为cv::Mat提供了与STL迭代器兼容的迭代器:
cv::Mat_< xxx >::iterator 或 cv::Mat_< xxx >::const_iterator
代码如下:

cv::Mat_<cv::Vec3b>::iterator it=image.begin<cv::Vec3b>();
cv::Mat_<cv::Vec3b>::iterator itend=image.end<cv::Vec3b>();
for(;it!=itend;it++){
	//在这里处理每一个像素的三个通道分别是(*it)[0] (*it)[1] (*it)[2]
}
//如果想从任意位置开始,则迭代器初始化为image.begin<cv::Vec3b>()+x x为要跳过的像素个数

说明:使用指针遍历的运行速度更快,使用迭代器遍历代码更加清晰简洁,各有好处,根据具体项目进行取舍即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,OpenCV是一个开源计算机视觉和机器学习软件库,用于开发图像和视频处理应用程序。通过使用OpenCV,您可以读取摄像头并显示实时图像,打开视频文件或摄像头文件,并获取视频的相关信息,例如帧宽度、帧高度、帧率和总帧数。 对于学习OpenCV,你可以按照以下步骤进行: 1. 安装OpenCV库:在开始学习OpenCV之前,您需要从OpenCV官方网站下载和安装OpenCV库。根据您的操作系统和编程语言选择合适的版本。 2. 学习基本概念:熟悉OpenCV的基本概念和术语,例如图像和视频的加载、显示、保存以及常用的图像处理操作,如滤波、边缘检测和特征提取等。 3. 掌握OpenCV函数和类:深入了解OpenCV提供的函数和类,例如cv::Mat用于图像和矩阵操作,cv::VideoCapture用于读取和处理视频,以及cv::imshow和cv::waitKey等用于显示图像的函数。 4. 实践项目:通过完成一些实践项目来应用您所学到的知识。例如,利用OpenCV实现人脸检测、目标追踪、图像识别等。 5. 学习资料和资源:查找和阅读OpenCV的官方文档、教程和示例代码,参与开源社区讨论和交流,加入相关的论坛和邮件列表等。 总结起来,学习OpenCV包括安装OpenCV库、学习基本概念、掌握OpenCV函数和类、实践项目以及查找和阅读相关资料和资源。通过不断实践和学习,您将能够更好地理解和应用OpenCV库来开发图像和视频处理应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值