mans
mans

Reputation: 18168

what is the fastest way to run a method on all pixels in opencv (c++)

I have several tasks to do on each pixel in opencv. I am using a construct like this:

for(int row = 0; row < inputImage.rows; ++row)
    {
        uchar* p = inputImage.ptr(row);
        for(int col = 0; col < inputImage.cols*3; col+=3)
        {
            int blue=*(p+col);  //points to each pixel B,G,R value in turn assuming a CV_8UC3 colour image
            int green=*(p+col+1);
            int red=*(p+col+2);
            // process pixel            }

    }

This is working, but I am wondering if there is any faster way to do this? This solution doesn't use any SIMD or any paralle processing of OpenCV.

What is the best way to run a method over all pixels of an image in opencv?

Upvotes: 1

Views: 112

Answers (1)

herohuyongtao
herohuyongtao

Reputation: 50667

If the Mat is continuous, i.e. the matrix elements are stored continuously without gaps at the end of each row, which can be referred using Mat::isContinuous(), you can treat them as a long row. Thus you can do something like this:

const uchar *ptr = inputImage.ptr<uchar>(0);

for (size_t i=0; i<inputImage.rows*inputImage.cols; ++i){
    int blue  = ptr[3*i];
    int green = ptr[3*i+1];
    int red   = ptr[3*i+2];

    // process pixel 
}

As said in the documentation, this approach, while being very simple, can boost the performance of a simple element-operation by 10-20 percents, especially if the image is rather small and the operation is quite simple.

PS: For faster need, you will need to take full use of GPU to process each pixel in parallel.

Upvotes: 1

Related Questions