测试代码
可以看出以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";