OpenCV几种访问cv::Mat数据的方法

一般来说,如果是遍历数据的话用指针ptr比用at要快。特别是在debug版本下。因为debug中,OpenCV会对at中的坐标检查是否有溢出,这是非常耗时的。

 

代码如下

#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <iostream>


int main()
{
    char *srcName="e://vedio//001.jpg";
    char *dstName="e://vedio//001dst.jpg";

    cv::Mat src=cv::imread(srcName,cv::IMREAD_COLOR);
    cv::Mat dst=src.clone();

    int nChannels=src.channels();
    int nTimes=1000;
    
    double t=cv::getTickCount();
    for(int i=0;i<nTimes;i++)
    {
        for(int r=0;r<src.rows;r++)
        {
            for(int c=0;c<src.cols;c++)
            {
                dst.at<cv::Vec3b>(r,c)=cv::Vec3b(src.at<cv::Vec3b>(r,c)[0]/2,src.at<cv::Vec3b>(r,c)[1]/2,src.at<cv::Vec3b>(r,c)[2]/2);;
            }
        }
    }
    t=(cv::getTickCount()-t)/cv::getTickFrequency();
    std::cout<<"第1种方法消耗的时间为"<<t<<""<<std::endl;
    
    uchar *input,*output;
    t=cv::getTickCount();
    for(int i=0;i<nTimes;i++)
    {
        for(int r=0;r<src.rows;r++)
        {
            input=src.ptr<uchar>(r);
            output=src.ptr<uchar>(r);
            for(int c=0;c<src.cols*nChannels;c++)
            {
                output[c]=input[c]/2;
            }
        }
    }
    t=(cv::getTickCount()-t)/cv::getTickFrequency();
    std::cout<<"第2种方法消耗的时间为"<<t<<""<<std::endl;

    
    t=cv::getTickCount();
    for(int i=0;i<nTimes;i++)
    {
        for(int r=0;r<src.rows;r++)
        {
            input=src.ptr<uchar>(r);
            output=src.ptr<uchar>(r);
            for(int c=0;c<src.cols*nChannels;c++)
            {
                *output++=*input++/2;
            }
        }
    }
    t=(cv::getTickCount()-t)/cv::getTickFrequency();
    std::cout<<"第3种方法消耗的时间为"<<t<<""<<std::endl;


    int nRows=src.rows;
    int nCols=src.cols;
    if(src.isContinuous())
    {
        nCols*=nRows;
        nRows=1;
    }
    t=cv::getTickCount();
    for(int i=0;i<nTimes;i++)
    {
        for(int r=0;r<nRows;r++)
        {
            input=src.ptr<uchar>(r);
            output=src.ptr<uchar>(r);
            for(int c=0;c<nCols*nChannels;c++)
            {
                *output++=*input++/2;
            }
        }
    }
    t=(cv::getTickCount()-t)/cv::getTickFrequency();
    std::cout<<"第4种方法消耗的时间为"<<t<<""<<std::endl;

    return 0;





    

}
View Code

转载于:https://www.cnblogs.com/qq552048250/p/4806658.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值