OpenCV访问像素的三种方法

三种方法分别问:

指针访问: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 );
}

结果展示:

猜你喜欢

转载自blog.csdn.net/tuwenqi2013/article/details/83043381