Mat类型遍历图像的三种方法

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;

int main()
{
    Mat src = imread("C:/Users/ChangShuang/Pictures/Lena.jpg");
    imshow("Src", src);
    int nr = src.rows;
    int nl = src.cols;
    //Mat的方法at<>()
    double duration1;
    duration1 = static_cast<double>(getTickCount());
    for (int i = 0;i < nr;i++) {
        for (int j = 0;j < nl;j++) {
            src.at<Vec3b>(j, i)[0] = 0;
            src.at<Vec3b>(j, i)[1] = 0;
            src.at<Vec3b>(j, i)[2] = 0;
        }
    }
    duration1 = static_cast<double>(getTickCount()) - duration1;
    duration1 /= getTickFrequency();
    cout << "duration1 = " << duration1 << endl;
    //使用迭代器
    Mat_<Vec3b>::iterator begin = src.begin<Vec3b>();
    Mat_<Vec3b>::iterator end = src.end<Vec3b>();
    double duration2;
    duration2 = static_cast<double>(getTickCount());
    for (;begin != end;begin++) {
        (*begin)[0] = 0;
        (*begin)[1] = 0;
        (*begin)[2] = 0;
    }
    duration2 = static_cast<double>(getTickCount()) - duration2;
    duration2 /= getTickFrequency();
    cout << "duration2 = " << duration2 << endl;
    //使用指针
    double duration3;
    duration3 = static_cast<double>(getTickCount());
    for (int i = 0;i < nr;i++) {
        Vec3b* ptr = src.ptr<Vec3b>(i);
        for (int j = 0;j < nl;j++) {
            (*ptr)[0] = 0;
            (*ptr)[1] = 0;
            (*ptr)[2] = 0;
            ptr++;
        }
    }
    duration3 = static_cast<double>(getTickCount()) - duration3;
    duration3 /= getTickFrequency();
    cout << "duration3 = " << duration3 << endl;
    //使用指针 获取类型为uchar
    double duration4;
    duration4 = static_cast<double>(getTickCount());
    //判断图像是否连续
    if (src.isContinuous()) {
        nl = nr*nl;
        nr = 1;
    }

    for (int i = 0;i < nr;i++) {
        uchar* ptr = src.ptr<uchar>(i);
        for (int j = 0;j < nl;j++) {
            (*ptr++) = 0;
            (*ptr++) = 0;
            (*ptr++) = 0;
        }
    }
    duration4 = static_cast<double>(getTickCount()) - duration4;
    duration4 /= getTickFrequency();
    cout << "duration3 = " << duration4 << endl;

    waitKey(0);
    return 0;
}

测试结果:
这里写图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值