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.
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
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