opencv MAT遍历的效率比较

本文探讨了Matlab中使用ptr、data和at三种方式修改矩阵像素时的效率对比,指出虽然at方法灵活但效率较低,而data模式(首指针)通常被认为更高效,但实际结果与预期不符,引发了关于行指针ptr效率的疑问。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

测试代码                

可以看出以data计一份时间,

则ptr需要3份时间,at需要2份时间的

效率比例。

(备注:印象中应该ptr比at效率更高,这怎么不对呢)

at方法的优势,就是可指定任意元素取值,比较方便。

data是首指针模式,step跳跃,效率更高。

ptr是行指针,按理应该也有不错效率的,但是结果不是。

				if (1) {
					Mat matNew = mat.clone();		//遍历每个像素,进行修改指定值。
                //判断ptr和data,at三种模式的效率,其中at是最低效率。
					etimer.restart();

					for (int i = 0; i < matNew.rows; i++) {
						uchar* pData = matNew.data + i * matNew.step;
						for (int k = 0; k < matNew.cols; k++) {
							if (pData[0] < 20 && pData[1] < 20 && pData[2] < 20) {
								pData[2] = 250;		//只更改红色
								pData[2] = pData[0];
							}
							pData += 3;
						}
					}
					qDebug() << "data " << etimer.elapsed() << "ms";

					for (int i = 0; i < matNew.rows; i++) {
						Vec3b* ptrH = matNew.ptr<Vec3b>(i);
						for (int k = 0; k < matNew.cols; k++) {
							Vec3b tmp = ptrH[k];
							if (tmp[0] < 20 && tmp[1] < 20 && tmp[2] < 20) {
								tmp[2] = 250;
								tmp[2] = tmp[0];
							}
						}
					}
					qDebug() << " ptr " << etimer.restart() << "ms";

					for (int i = 0; i < matNew.rows; i++) {
						for (int k = 0; k < matNew.cols; k++) {
							Vec3b& tmp = matNew.at<Vec3b>(i, k);
							if (tmp[0] < 20 && tmp[1] < 20 && tmp[2] < 20) {
								tmp[2] = 250;
							}
						}
					}
					qDebug() << "  at " << etimer.restart() << "ms";

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值