多通道图像遍历

方法一:普通遍历

for(int y = 0;y < height; y++)//行			
	{
		for(int x = 0; x < width; x++)//列
		{
			Scalar pix = srcImg.at<Vec3b>(y,x);
			int channle0 = pix[0];
			int channle1 = pix[1];
			int channle2 = pix[2];
		}
	}	

方法二:行指针,比较高效

<pre name="code" class="cpp">for(int y = 0;y < height; y++)//行			
{
	Vec3b *pSrcData = srcImg.ptr<Vec3b>(y);//每一行的指针
	for(int x = 0; x < width; x++)//列
	{
		int channle0 = pSrcData[x][0];
		int channle1 = pSrcData[x][1];
		int channle2 = pSrcData[x][2];
	}
}
 

 方法三:行指针,比方法二高效 

for(int y = 0;y < height; y++)//行			
	{
		uchar *pSrcData = srcImg.ptr<uchar>(y);//每一行的指针
		for(int x = 0; x < width; x++)//列
		{
			int channle0 = pSrcData[x*channel];
			int channle1 = pSrcData[x*channel+1];
			int channle2 = pSrcData[x*channel+2];
		}
	}

在每一行数据元素之间在内存里是连续存储的,因为图像在OpenCV里的存储机制问题,行与行之间可能有空白单元。

方法四:数据指针。高效

uchar *pSrcData = srcImg.data;//每一行的指针
	for(int y = 0;y < height; y++)//行			
	{
		for(int x = 0; x < width; x++)//列
		{
			int channle0 = pSrcData[y*width*channel+x*channel];
			int channle1 = pSrcData[y*width*channel+x*channel+1];
			int channle2 = pSrcData[y*width*channel+x*channel+2];
		}
	}
一般来说图像行与行之间往往存储是不连续的,但是有些图像可以是连续的,Mat提供了一个检测图像是否连续的函数isContinuous()。当图像连通时,我们就可以把图像完全展开,看成是一行。


经过测试,时间分别是:

方法一:296

方法二:47

方法三:0

方法四:31

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值