Intereting Posts
Вызов к сбою malloc в сеансе gdb неосуществимая модификация и доступ к указателю Механизм управления общим доступом к памяти для процессов, созданных MPI EOF в командной строке Windows не завершает входной stream Выполнение конвейера командной строки в C с fork () и exec () Компиляция программы C для предыдущей версии OS X PATH_MAX не объявляется при компиляции на Ubuntu 10.04 free (): недействительный следующий размер (нормальный) на fclose. Но не тогда, когда Valgrind запускает Приведение целочисленного числа в Float с использованием бит-манипуляции прерывает некоторые целые числа в C Производить циклы без команды cmp в GCC Почему мы не можем изменять каталоги через системный вызов system () в Linux? Является ли размер целого или любых других типов данных в C зависимым от базовой архитектуры? Как определить, какой день является первым в неделю в текущей локали в C Почему не нажимать enter, чтобы вернуть ‘\ n’ в getch ()? Перемотать файл, создать динамическую структуру

Как получить доступ к изображениям Данные из изображения RGB (3-канальное изображение) в opencv

Я пытаюсь взять imageData изображения в этом, где w = ширина изображения и h = высота изображения

for (int i = x; i < x+h; i++) //height of frame pixels { for (int j = y; j imageData[pos]>0) //Taking data (here is the problem how to take) { xPos += j; yPos += i; nPix++; } } } 

jeff7 дает вам ссылку на очень старую версию OpenCV. OpenCV 2.0 имеет новую C ++-оболочку, которая намного лучше, чем shell C ++, упомянутая в ссылке. Я рекомендую вам прочитать ссылку на C ++ для OpenCV для получения информации о том, как обращаться к отдельным пикселям.

Еще одно замечание: вы должны иметь внешний контур, представляющий собой цикл в направлении y (по вертикали), а внутренний цикл – это петля в направлении x. OpenCV находится в C / C ++ и сохраняет значения в строке major.

См. Хорошее объяснение здесь по нескольким методам доступа к пикселям в IplImage в OpenCV.

Из кода, который вы указали, ваша проблема заключается в вашей переменной позиции, вам нужно что-то вроде int pos = i*w*Channels + j*Channels , тогда вы можете получить доступ к RGB-пикселам в

unsigned char r = data->imageData[pos];

unsigned char g = data->imageData[pos+1];

unsigned char b = data->imageData[pos+2];

(предполагая RGB, но на некоторых платформах я думаю, что он может быть сохранен BGR).

В этом посте есть исходный код, который показывает, что вы пытаетесь выполнить:

Доступ к отрицательным значениям пикселей OpenCV

 uchar* colorImgPtr; for(int i=0; iwidth; i++){ for(int j=0; jheight; j++){ colorImgPtr = (uchar *)(colorImg->imageData) + (j*colorImg->widthStep + i-colorImg->nChannels) for(int channel = 0; channel < colorImg->nChannels; channel++){ //colorImgPtr[channel] here you have each value for each pixel for each channel } } } 

Существует немало способов сделать это (ссылка, представленная jeff7, очень полезна).

Мой предпочтительный метод доступа к данным изображения – это метод cvPtr2D . Вам нужно что-то вроде:

 for(int x = 0; x < width; ++x) { for(int y = 0; y < height; ++y) { uchar* ptr = cvPtr2D(img, y, x, NULL); // blue channel can now be accessed with ptr[0] // green channel can now be accessed with ptr[1] // red channel can now be accessed with ptr[2] } } 

(img - IplImage* в приведенном выше коде)

Не уверен, что это самый эффективный способ сделать это и т. Д., Но я считаю, что это самый простой и простой способ сделать это.

Здесь вы можете найти документацию по этому методу.