Перейти к содержимому
Compvision.ru
Chemist

ImageData

Recommended Posts

Я так понимаю что в этом параметре расположены значения RGB каждого пикселя? Но не пойму как к ним добраться. Разясните?

Есть пример из книги:


// Пример 3-11. Установка "S" и "V" частей HSV изображения в 255.


void saturate_sv( IplImage* img ) {


  for( int y=0; y<img->height; y++ ) {


    uchar* ptr = (uchar*) (


      img->imageData + y * img->widthStep // Получаем указатель на начало строки 'y'


    );


    for( int x=0; x<img->width; x++ ) {


      ptr[3*x+1] = 255; // Устанваливаем S и V в 255


      ptr[3*x+2] = 255;


    }


  }


}

Не понимаю вот эти строки: uchar* ptr = (uchar*) (img->imageData + y * img->widthStep // Получаем указатель на начало строки 'y'

ptr[3*x+1] = 255; // Устанваливаем S и V в 255

ptr[3*x+2] = 255;

/////////////////////

т.е. ptr - это массив? и каждая его ячейка несет какойто определенный параметр?

п.с. в коде плоховато разбираюсь (

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

ptr[3*x] //H

ptr[3*x+1]//S

ptr[3*x+2]//V

ptr это указатель на массив в котором всё лежит как HSVHSV...HSV

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

ptr[3*x] //H

ptr[3*x+1]//S

ptr[3*x+2]//V

ptr это указатель на массив в котором всё лежит как HSVHSV...HSV

с 3-ой вроде то же понятно, так как используется 3-х канальное изображение.

А вот как задавать нужный пиксель?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

uchar* ptr = (uchar*) (img->imageData + y * img->widthStep);
// Получаем указатель на начало строки 'y' и топаем по ней через 3 ступеньки
 for( int x=0; x<img->width; x++ ) {

ptr[3*x+1] = 255; // Устанваливаем S и V в 255

ptr[3*x+2] = 255;

}[/code]

Нарисуйте на листочке в клетку эту раскладку, и все будет понятно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Не получается подобрать красный цвет, использую вот такой код:


for(x = 0; x<frame->width; x++){

			for (y = 0; y<frame->height; y++){

				if  (((ptr[3*x+y*frame->widthStep] > this->hScrollBar1->Value-10) && (ptr[3*x+y*frame->widthStep] < this->hScrollBar1->Value+10))

		&& ((ptr[3*x+1+y*frame->widthStep] > this->hScrollBar2->Value-10) && (ptr[3*x+1+y*frame->widthStep] < this->hScrollBar2->Value+10))

		&& ((ptr[3*x+2+y*frame->widthStep] > this->hScrollBar3->Value-10) && (ptr[3*x+2+y*frame->widthStep] < this->hScrollBar3->Value+10))) {

				ptr[3*x+y*frame->widthStep]   = 255; //H

				ptr[3*x+1+y*frame->widthStep] = 255; //S

				ptr[3*x+2+y*frame->widthStep] = 255; //V

			} else {

                ptr[3*x+y*frame->widthStep]   = 0;

				ptr[3*x+1+y*frame->widthStep] = 0; 

				ptr[3*x+2+y*frame->widthStep] = 0; 

				}

			}

		}

Для простоты подбора использую вот такую картинку:

post-6283-0-50186400-1360567552_thumb.pn

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

про HSV уже гуглил, видел модели и прочее.

не пойму в каких пределах опрашивать: от 0 до 255 все или H:0-360, S:0-1, V:0-1?

ptr[3*x+y*frame->widthStep] //H

ptr[3*x+1+y*frame->widthStep] //S

ptr[3*x+2+y*frame->widthStep] //V

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

все оказалось проще )

ptr[3*x+y*frame->widthStep] // Синий

ptr[3*x+1+y*frame->widthStep] // Зеленый

ptr[3*x+2+y*frame->widthStep] // Красный

вот такое условие для нахождение красного цвета у меня получилось:


if      ((ptr[3*x+y*frame->widthStep] < 40)

	&& (ptr[3*x+1+y*frame->widthStep] < 30)

	&& (ptr[3*x+2+y*frame->widthStep] > 150)) 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

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

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×