tags:

views:

222

answers:

3

I want the data at pixel to be compared with the colour and then i want to find contour then take centroid points of the contour ,so i am using like this to find countourdata am i wrong at this statement

int pos = i * w * Channels + j; //channels is 3 as rgb 
        // if any data exists
        if (data->imageData[pos]>0)

Code is like this

for (int i = x; i < x+h; i++) //height of frame pixels
{
    for (int j = y; j < y+w; j++)//width of frame pixels
    {
        int pos = i * w * Channels + j; //channels is 3 as rgb 
        // if any data exists
        if (data->imageData[pos]>0) //Taking data (here is the problem how to take)
        {
            xPos += j;
            yPos += i;
            nPix++;
        }
    }
}
A: 

Here is some code to access RGB data of a pixel in an image

IplImage* img=cvLoadImage(fileName);
CvScalar s;
s=cvGet2D(img,i,j); // get the (i,j) pixel value
s.val[0]=111; // B-channel
s.val[1]=111; // G-channel
s.val[2]=111; // R-channel
cvSet2D(img,i,j,s); // set the (i,j) pixel value

Source (modified a little): http://www.cs.iit.edu/~agam/cs512/lect-notes/opencv-intro/opencv-intro.html#SECTION00053000000000000000

aip.cd.aish
+1  A: 

I use the following code structure

/** 
 * @brief Calculate greeness from an RGB image
 *
 * Performs the greeness pixelwise transform on the input image.
 * Greeness is defined as
 * Greeness = 255*G/sqrt(R^2+G^2+B^2)
 * The function assumes that the resolution of the two images are identical.
 *
 * @param imSrc Input RGB image.
 * @param imDst Output grayscale (greeness) image.
 */
void rgbToGreeness( IplImage *imSrc , IplImage* imDst) {
    // Allocate variables
    int tmp_pix;
    uchar * _SrcPtr, * _DstPtr;

    // Iterate over the image line by line
    for(int y = 0 ; y < imSrc->height ; y++ )
    {
        // Locate pointers to the first data element in the current line
        _SrcPtr = ( uchar* )( imSrc->imageData + y * imSrc->widthStep );
        _DstPtr = ( uchar* )( imDst->imageData + y * imDst->widthStep );

        // Iterate over the elements in the current line
        for( int x = 0 ; x < imSrc->width ; x++ )
        {
            //2*G-B-R - Excessive green
            tmp_pix = (int) (255*_SrcPtr[3*x+1]/pow(pow((float)_SrcPtr[3*x],2) + pow((float)_SrcPtr[3*x+1], 2) + pow((float)_SrcPtr[3*x+2], 2), (float) 0.5));

            //If value is larger than 255, set it to 255 and lower than 0 set it to 0
            _DstPtr[x] = (uchar) ( ( tmp_pix < 0 ) ? 0 : ( ( tmp_pix > 255 ) ? 255 : tmp_pix ) );
        }
    }
}
midtiby
A: 

As requested here is my exact code where i want to calculate centroids from contour My exact code is like this 1) Taking RGB image as input 2) x=0,y=0,w=width of frame,h=height of frame.are the data passing

void cRecursiveCentroids::ComputeCentroid(int x, int y, int w, int h, IplImage *data, bool splitOnUpDown, int level, int id, int addToId){

if (level == m_Levels-1 ) return;
int Channels = data->nChannels; // Number of channels
    std::cout << "Channels: " << Channels << "\n"; 

int xPos = 0;
int yPos = 0;
int nPix = 0;


for (int i = x; i < x+h; i++)                      //Tracing the contour 
{
    for (int j = y; j < y+w; j++)
    {
            int pos = i * m_Wid * Channels + j; // Here may be the error i am thinking
                    // if any data exists 
        if (data->imageData[pos]>0)
        {
            xPos += j;
                            //std::cout << "xPos: " << xPos << "\n";
                            yPos += i;
                           // std::cout << "yPos: " << yPos << "\n"; 
            nPix++;
            }
    }
}

Check = nPix;

if (nPix > 0){                                           // Calculating Position 

    xPos = (int)((float)xPos / (float)nPix);
    yPos = (int)((float)yPos / (float)nPix);
    int num = ( id + addToId ) > 16 ? 16 : (id+addToId);
    m_Cent[num].posx    = xPos;
    m_Cent[num].posy    = yPos;
    m_Cent[num].level   = level;

            splitOnUpDown = !splitOnUpDown;
    level = level+1;
    if (splitOnUpDown)                   //Recursive calling for centroids
    {
        id *= 2;
        ComputeCentroid(x,y,w,(yPos - y), data,  splitOnUpDown, level, id, addToId);
        ComputeCentroid(x,yPos,w,h-(yPos-y),  data,  splitOnUpDown, level, id+1, addToId);
    } else {
        id *= 2;
        ComputeCentroid(x,y,(xPos-x),h,  data,  splitOnUpDown, level, id, addToId);
        ComputeCentroid(xPos,y,w - (xPos-x),h,   data,  splitOnUpDown, level, id+1, addToId);
    }

}

DrawCentroidPoints();                               //Draw Centroid Points

}

smile