Использование функции cvGet2D OpenCV - PullRequest
4 голосов
/ 26 февраля 2011

Я пытаюсь получить информацию из изображения, используя функцию cvGet2D в OpenCV.

Я создал массив из 10 IplImage указателей:

IplImage *imageArray[10];  

и я сохраняю 10 изображений с моей веб-камеры:

imageArray[numPicture] = cvQueryFrame(capture);  

когда я вызываю функцию:

info = cvGet2D(imageArray[0], 250, 100);  

, где info:

CvScalar info;  

Я получил ошибку:

Ошибка OpenCV: неверный аргумент (нераспознанный или неподдерживаемый тип массива) в cvPtr2D, файл /build/buildd/opencv-2.1.0/src/cxcore/cxarray.cpp, строка 1824
прекращение вызова после создания экземпляра 'cv :: Exception'
what (): /build/buildd/opencv-2.1.0/src/cxcore/cxarray.cpp:1824: ошибка: (-5) нераспознанный или неподдерживаемый тип массива в функции cvPtr2D

Если я использую функцию cvLoadImage для инициализации указателя IplImage, а затем передаю его в функцию cvGet2D, код работает правильно:

IplImage* imagen = cvLoadImage("test0.jpg");
info = cvGet2D(imagen, 250, 100);  

однако, я хочу использовать информацию, уже сохраненную в моем массиве.

Знаете, как я могу это решить?

Ответы [ 3 ]

12 голосов
/ 10 декабря 2012

Хотя это очень поздний ответ, но я думаю, что кто-то может все еще искать решение с CvGet2D. Вот оно.

Для CvGet2D нам нужно сначала передать аргументы в порядке Y, а затем X.

Пример:

CvScalar s = cvGet2D(img, Y, X);

Он не упоминается нигде в документации, но вы найдете его только внутри core.h / core_c.h. Попробуйте перейти к объявлению CvGet2D(), и над прототипами функций есть несколько комментариев, объясняющих это.

9 голосов
/ 27 февраля 2011

Да, сообщение верное.

Если вы хотите сохранить значение в пикселях, вам нужно сделать что-то вроде этого.

int value = 0;
value = ((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels +0];
cout << "pixel value for Blue Channel and (i,j) coordinates: " << value << endl;

Подводя итог, для построения или хранения данных необходимо создать целочисленное значение (значение в пикселях варьируется от 0 до 255). Но если вы хотите проверить только значение пикселя (например, в замыкании if или в чем-то подобном), вы можете получить прямой доступ к значению пикселя без использования целочисленного значения.

Я думаю, это немного странно, когда вы начинаете, но когда вы работаете с ним 2 или 3 раза, вы будете работать без затруднений.

1 голос
/ 26 февраля 2011

Извините, cvGet2D - не лучший способ получить значение в пикселях.Я знаю, что это самый короткий и понятный способ, потому что вы в одной строке кода и зная координаты получаете значение в пикселях.

Я предлагаю вам этот вариант.Когда вы увидите этот код, вы поймете, что он такой сложный, но более эффективный.

int main()
{
// Acquire the image (I'm reading it from a file);
IplImage* img = cvLoadImage("image.bmp",1);

int i,j,k;
// Variables to store image properties
int height,width,step,channels;
uchar *data;
// Variables to store the number of white pixels and a flag
int WhiteCount,bWhite;

// Acquire image unfo
height    = img->height;
width     = img->width;
step      = img->widthStep;
channels  = img->nChannels;
data      = (uchar *)img->imageData;

// Begin
WhiteCount = 0;
for(i=0;i<height;i++) 
{
  for(j=0;j<width;j++) 
  { // Go through each channel of the image (R,G, and B) to see if it's equal to 255
    bWhite = 0;
    for(k=0;k<channels;k++)
    {       // This checks if the pixel's kth channel is 255 - it can be faster.
            if (data[i*step+j*channels+k]==255) bWhite = 1;
            else 
            {
                    bWhite = 0;
                    break;
            }
    }
    if(bWhite == 1) WhiteCount++;
  }
}           

printf("Percentage: %f%%",100.0*WhiteCount/(height*width));

return 0;

Этот код считает белые пиксели и дает вам восприятие белых пикселей на изображении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...