2010-07-20 35 views
2

Je tente d'effectuer une détection de front de passage à zéro sur une image dans OpenCV. Je brouille et utilise le cvLaplace() puis le redimensionne à partir de (0, max). Ma question est: Comment puis-je accéder aux valeurs de pixels dans cette image de manière à identifier correctement les valeurs négatives? L'utilisation de la fonction fournie par OpenCV (cvPtr2D) renvoie des caractères non signés. Des idées ou des commentaires?Accès aux valeurs de pixels négatifs OpenCV

Merci

Répondre

7

pixels sont stockés en interne comme IPL_DEPTH_8U, ce qui signifie 8 bits unsigned char, allant de 0 à 255. Mais vous pouvez aussi les emballer comme IPL_DEPTH_16S (Nombre entier signé) et même IPL_DEPTH_32F (simple précision flottante numéro de point).

cvConvertScale() fera probablement le travail! Mais si vous voulez convertir manuellement: OpenCV need to convert IPL_DEPTH_32S to IPL_DEPTH_32F

L'idée de base est de créer une nouvelle image avec cvCreateImage() et le format dont vous avez besoin qu'ils soient, puis utilisez cvConvertScale() pour copier les données d'origine au nouveau format . À la fin, votre code pourrait ressembler à quelque chose comme ceci:

IplImage* img = cvLoadImage("file.png", CV_LOAD_IMAGE_ UNCHANGED); 
// then retrieve size of loaded image to create the new one 

IplImage* new_img = cvCreateImage(img_size, IPL_DEPTH_16S, 1); 

cvConvertScale(img, new_img, 1/255.0, -128); 

Je pense que cela répond à la question du fil.

Répondre à votre commentaire, vous pouvez accéder aux informations de pixel comme ceci:

IplImage* pRGBImg = cvLoadImage(input_file.c_str(), CV_LOAD_IMAGE_UNCHANGED); 
int width = pRGBImg->width; 
int height = pRGBImg->height; 
int bpp = pRGBImg->nChannels; 
for (int i=0; i < width*height*bpp; i+=bpp) 
{ 
    if (!(i % (width*bpp))) // print empty line for better readability 
     std::cout << std::endl; 

    std::cout << std::dec << "R:" << (int) pRGBImg->imageData[i] << 
          " G:" << (int) pRGBImg->imageData[i+1] << 
          " B:" << (int) pRGBImg->imageData[i+2] << " "; 
} 

Ne pas oublier de voter et marquer cette réponse acceptée dans le cas où il l'a fait.

+0

Merci pour la réponse! Une idée de comment j'accéderais à ces pixels sans utiliser cvPtr2D()? J'essaie d'y accéder manuellement en utilisant (float *) (new_img-> imageData + x * new_img-> widthStep + y), où x -> new_img-> height et y -> width. Mais n'ont pas eu de succès. – bluth

+0

J'ai édité ma réponse pour pouvoir ajouter du code et répondre à votre commentaire. N'oubliez pas de voter si cela vous a aidé. =) – karlphillip