Я следую учебнику по окалина где вы загружаете и отображаете изображения как cinder::gl::Texture
объекты. Этот класс не имеет convert2Grayscale
метод, так
возможно ли реализовать что-то подобное самостоятельно? Есть ли у меня доступ к отдельным пикселям где я мог бы подать заявку простой алгоритм? (Доступ к пикселям на самом деле важнее, так как я хочу использовать это для другого проекта)
Каждый пиксель представлен трехмерным вектором [R, G, B] Где R — значение в [0,1] красного канала, G — значение в [0,1] зеленого канала, а B — значение в [0,1] синего канала. Самый простой способ превратить трехмерный пиксель RGB в скаляр Y, который будет представлять интенсивность света в [0,1] (то есть в оттенках серого), это использовать следующую формулу:
Y = .2126 * R ^ гамма + .7152 * G ^ гамма + .0722 * B ^ гамма
Где гамма в большинстве систем равна 2,2
Теперь, когда речь идет о доступе к пикселям изображения в cinder, вам придется загрузить свое изображение на объект Surface. Поверхностные объекты в cinder имеют интерфейсные функции для доступа к отдельным пикселям. Посмотрите этот удивительный урок о том, как это сделать: http://www.creativeapplications.net/tutorials/images-in-cinder-tutorials-cinder/
Более простой подход, как показано вПривет, Синдеручебники на сайте Cinder:
Используйте этот объект Channel для инициализации объекта Surface, который можно использовать в вашем draw()
метод, что-то вроде:
void MyApp :: setup ()
{
Url url( "http://libcinder.org/media/tutorial/paris.jpg" );
mChannel = Channel32f( loadImage( loadUrl( url ) ) );
mTexture = mChannel;
mDrawImage = true;
}
void TutorialApp :: draw ()
{
gl::clear( Color( 0, 0, 0 ), true );
if( mDrawImage )
{
mTexture.enableAndBind();
gl::draw( mTexture, getWindowBounds() );
}
}