标签:
一般来说,如果是遍历数据的话用指针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; }
标签:
原文地址:http://www.cnblogs.com/qq552048250/p/4806658.html