三种方法分别问:
指针访问:void colorReduce_ptr(cv::Mat &inputImage, cv::Mat &outputImage, int div);
迭代器访问:void colorReduce_iterator(cv::Mat &inputImage, cv::Mat &outputImage, int div);
动态地址计算:void colorReduce_at(cv::Mat &inputImage, cv::Mat &outputImage, int div);
代码实例:
#include <opencv2/core.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/videoio.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>
using namespace std;
using namespace cv;
void colorReduce_ptr( Mat &inputImage, Mat &outputImage, int div );
void colorReduce_iterator( Mat &inputImage, Mat &outputImage, int div );
void colorReduce_at( Mat &inputImage, Mat &outputImage, int div );
void colorReduce_ptr( Mat &inputImage, Mat &outputImage, int div )
{
outputImage = inputImage.clone( );
int rowNumber = outputImage.rows;
int colNumber = outputImage.cols*outputImage.channels( );
for(size_t i = 0; i < rowNumber; i++)
{
uchar* data = outputImage.ptr<uchar>( i );
for(size_t j = 0; j < colNumber; j++)
{
data[j] = data[j] / div*div + div / 2;
}
}
}
void colorReduce_iterator( Mat &inputImage, Mat &outputImage, int div )
{
outputImage = inputImage.clone( );
Mat_< Vec3b>::iterator it = outputImage.begin< Vec3b>( );
Mat_< Vec3b>::iterator it_end = outputImage.end< Vec3b>( );
for(; it != it_end; ++it)
{
(*it)[0] = (*it)[0] / div*div + div / 2;
(*it)[1] = (*it)[1] / div*div + div / 2;
(*it)[2] = (*it)[2] / div*div + div / 2;
}
}
void colorReduce_at( Mat &inputImage, Mat &outputImage, int div )
{
outputImage = inputImage.clone( );
int rowNumber = outputImage.rows;
int colNumber = outputImage.cols;
for(size_t i = 0; i < rowNumber; i++)
{
for(size_t j = 0; j < colNumber; j++)
{
for(size_t px = 0; px < 3; px++)
{
outputImage.at< Vec3b>( i, j )[px] = outputImage.at< Vec3b>( i, j )[px] / div * div + div / 2;
}
}
}
}
int main( int argc, char** argv[] )
{
Mat srcImg = imread( "11.jpg" );
imshow( "srcImg", srcImg );
Mat dstImg;
dstImg.create( srcImg.rows, srcImg.cols, srcImg.type( ) );
double timeStart;
timeStart = static_cast<double>( getTickCount( ));
colorReduce_ptr( srcImg, dstImg, 32 );
timeStart = ((double) getTickCount( ) - timeStart) / getTickFrequency( );
cout << "ptr方法运行时间为:" << timeStart << "秒" << endl;
timeStart = static_cast<double>( getTickCount( ));
colorReduce_iterator( srcImg, dstImg, 32 );
timeStart = ((double) getTickCount( ) - timeStart) / getTickFrequency( );
cout << "iterator方法运行时间为:" << timeStart << "秒" << endl;
timeStart = static_cast<double>( getTickCount( ));
colorReduce_at( srcImg, dstImg, 32 );
timeStart = ((double) getTickCount( ) - timeStart) / getTickFrequency( );
cout << "at方法运行时间为:" << timeStart << "秒" << endl;
imshow( "dstImg", dstImg );
waitKey( 0 );
}
结果展示: