opencv MAT遍历的效率比较

测试代码                

可以看出以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";

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值