Click here to Skip to main content
Rate this: bad
good
Please Sign up or sign in to vote.
See more: C++ OpenCV
I want to partition an image into 2X2 blocks,find the mean of each block and write the mean into a new image.(image size is 320X240) But i am getting error while doing the following operation. can you please help me out. Thanks for any solutions.
 
CvMat *mat = cvCreateMat(240,320,CV_8UC3 );
cvConvert( image, mat );
meanimg= cvCreateImage(cvSize(image->width/2,image->height/2,IPL_DEPTH_8U, 3);
 
for(int k =0; k < 240; k+=2)
{
    for(int l = 0; l < 320; l+=2 )
    {
        int mean=0;
        double p1;
        CvScalar out;
        
        for(int x=k; x<=k+1; x++)
        {
            for(int y=l; y<=l+1; y++)
            {
                p1 = cvmGet(mat,y,x);
                mean = mean + p1;
            }
        }
        mean=mean/4;
        out = cvRealScalar(mean);
        cvSet2D(meanimg,l/2,k/2,out);
    }
}
Posted 27-Apr-12 20:20pm
zarunz335
Edited 27-Apr-12 22:03pm
v2
Comments
nv3 at 28-Apr-12 4:07am
   
Which error do you get?

1 solution

Rate this: bad
good
Please Sign up or sign in to vote.

Solution 1

Ok, you pasted that same question on April 20. It would have been better to ask your follow-up question by using the "Improve Question" button to the original one. See my answer there, which is Solution 2, which does the entire job in just one line.
 
If you want to do the operation by, just for exercise, here are a couple of hints regarding your code above:
 
- You first convert your original image (named "image") to a matrix (named "mat"), I guess just for accessing the pixel values. You can access the pixels of an image directly in OpenCV, so that step is not necessary.
 
- Your image seems to have 3 channels, in other words, it's a color image. Was that intended? That is probably where you are getting stuck.
 
- I would reverse the rolls of x an y, because now x is row number and y is column number, which is just the opposite way that you normally would define x and y.
 
- The cvmGet call must fail, because your matrix has three channels per cell. cvmGet can only operate on single channel matrices as it returns a single value of type double.
 
- If you have a 3-channel image, you need to put another loop inside the innermost one that loops over all three channels and the calculate the mean value for each of these channels.
 
I would access the pixel of a 3-channel image like this:
    // put these outside the loops
    int step       = image->widthStep;
    int channels   = image->nChannels; // or set to a constant 3
    uchar* data    = (uchar*) image->imageData;
 
    // that goes into your inner loop
    blueValue  = data[y*step+x*channels+0];
    greenValue = data[y*step+x*channels+1];
    redValue   = data[y*step+x*channels+2];
 
Hope that gets you a step further.
  Permalink  

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



Advertise | Privacy | Mobile
Web02 | 2.8.1411022.1 | Last Updated 28 Apr 2012
Copyright © CodeProject, 1999-2014
All Rights Reserved. Terms of Service
Layout: fixed | fluid

CodeProject, 503-250 Ferrand Drive Toronto Ontario, M3C 3G8 Canada +1 416-849-8900 x 100