2010-02-25 17 views
-2

Je veux comparer les données au pixel avec la couleur et puis je veux trouver le contour puis prendre des points centroïdes du contour, donc j'utilise comme ça pour trouver countourdata suis-je mal à cette déclarationComment accéder à une image RGB

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

est comme ce

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++; 
     } 
    } 
} 
+0

hey, pouvez-vous mettre le code comme un "bloc de code" ... il est difficile de le lire, pour voir ce que vous voulez faire – Aishwar

+0

éventuellement dupe de sa propre question: http://stackoverflow.com/questions/2325576/how-to-access-image-data-from-a-rgb-image-3channel-image-in-opencv – erelender

+0

Oui - dupliquer de sa propre question http://stackoverflow.com/questions/2325576 et ne semble pas avoir lu la réponse fournie à la question précédente –

Répondre

1

J'utilise la structure de code suivant

/** 
* @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)); 
     } 
    } 
} 
0

Comme demandé voici mon code exact où je veux calculer centroïdes du contour Mon code exact est comme ça 1) Prenant l'image RVB comme entrée 2) x = 0, y = 0, w = largeur de trame, h = hauteur de trame. Sont les données passant

void cRecursiveCentroids :: ComputeCentroid (int x, int y, int w, int h, données IplImage *, bool splitOnUpDown, int niveau, id int, 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 

}