Все, что нужно вашей функции edit
, - это принять другой аргумент, который изменит отредактированный элемент:
edit :: Int -> (a -> a) -> [a] -> Maybe [a]
edit 0 f (a:as) = Just (f a : as)
edit n (a:as) = do
let x = n - 1
y <- x `seq` edit x f as
return (a:y)
edit _ [] = Nothing
Хорошо, я получил его работа!
Я думаю, что был смущен тем, что глубина OpenCV 8 означает, что пиксель имеет 8 битов за канал, таким образом, в изображении с 3 каналами, пиксель имеет 24 бита. Таким образом, при преобразовании этого в значение SDL глубины, мы добираемся 8 * 3 = 24
биты.
Изображение составляло 24 бита, в конце концов, которые поддерживает SDL. Так преобразование изображения к SDL так же просто как:
SDL_Surface *surface = SDL_CreateRGBSurfaceFrom((void*)opencvimg->imageData,
opencvimg->width,
opencvimg->height,
opencvimg->depth*opencvimg->nChannels,
opencvimg->widthStep,
0xff0000, 0x00ff00, 0x0000ff, 0
);
return surface;
Извините за беспорядок я надеюсь, что это помогает кому-либо ищущему тот же ответ.
Другие интересные ссылки: http://www.libsdl.org/cgi/docwiki.cgi/Pixel_Access
И полная подпрограмма в: http://paster.dazjorz.com/?p=3714
First of all: Thanks!!
Second: It works perfectly with 3 Channel images but I want to display a Single-Channel-IplImage
so there we go:
SDL_Surface *single_channel_ipl_to_surface (IplImage *opencvimg)
{
SDL_Surface *surface = SDL_CreateRGBSurfaceFrom((void*)opencvimg->imageData,
opencvimg->width,
opencvimg->height,
opencvimg->depth*opencvimg->nChannels,
opencvimg->widthStep,
0xffffff, 0xffffff, 0xffffff,0);
return surface;
}