Accès aux pixels dans OpenCV 2.2
Salut je veux utiliser opencv pour me dire les valeurs des pixels d'une image blanche et vierge donc la sortie ressemblerait à ceci
10001
00040
11110
00100
Voici mon code actuel, mais je ne sais pas comment accéder aux résultats de l'appel CV_GET_CURRENT
.. toute aide ?
IplImage readpix(IplImage* m_image) {
cout << "Image width : " << m_image->width << "n";
cout << "Image height : " << m_image->height << "n";
cout << "-----------------------------------------n";
CvPixelPosition8u position;
CV_INIT_PIXEL_POS(position, (unsigned char*)(m_image->imageData), m_image->widthStep, cvSize(m_image->width, m_image->height), 0, 0, m_image->origin);
for(int y = 0; y < m_image->height; ++y) // FOR EACH ROW
{
for(int x = 0; x < m_image->width; ++x) // FOR EACH COL
{
CV_MOVE_TO(position, x, y, 1);
unsigned char colour = *CV_GET_CURRENT(position, 1);
// I want print 1 for a black pixel or 0 for a white pixel
// so i want goes here
}
cout << " n"; //END OF ROW
}
}
3 réponses
dans opencv 2.2, j'utiliserais l'interface C++.
cv::Mat in = /* your image goes here,
assuming single-channel image with 8bits per pixel */
for(int row = 0; row < in.rows; ++row) {
unsigned char* inp = in.ptr<unsigned char>(row);
for (int col = 0; col < in.cols; ++col) {
if (*inp++ == 0) {
std::cout << '1';
} else {
std::cout << '0';
}
std::cout << std::endl;
}
}
D'IplImage a une variable char* imageData
- c'est juste un tampon de tous les pixels. Pour le lire correctement, vous devez connaître votre format de l'image. Par exemple,pour l'image RGB888,3 premières barres dans le tableau imageData représenteront les valeurs r, g, b du premier pixel à la première rangée. Si vous connaissez le format d'image - vous pouvez lire les données correctement. Le format de l'Image peut être restauré en lisant d'autres valeurs de la structure de L'image:
http://opencv.willowgarage.com/documentation/basic_structures.html
je pense Aussi qu'il est plus efficace d'écrire la boucle comme ceci:
uchar r,g,b;
for (int y = 0; y < cvFrame->height; y++)
{
uchar *ptr = (uchar*) (cvFrame_->imageData + y*cvFrame_->widthStep);
for (int x = 0; x < cvFrame_->width; x++)
{
r = ptr[3*x];
g = ptr[3*x + 1];
b = ptr[3*x + 2];
}
}
ce code est pour RGB888 image
IplImage est l'ancien format des images. Vous devez utiliser le nouveau format, CvMat, qui peut stocker des matrices arbitraires. Une image n'est qu'une matrice, après tout.
vous pouvez alors accéder aux pixels en utilisant la fonction cvget2 , qui renvoie une CvScalar.