码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-09-14 11:59:40      阅读:1000      评论:0      收藏:0      [点我收藏+]

标签:

一般来说,如果是遍历数据的话用指针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

技术分享

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

标签:

原文地址:http://www.cnblogs.com/qq552048250/p/4806658.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!