登录 用户中心() [退出] 后台管理 注册
   
您的位置: 首页 >> 程序员学前班[不再更新,只读] >> 主题: How to convert an OpenCV IplImage to an SDL_Surface?     [回主站]     [分站链接]
标题
How to convert an OpenCV IplImage to an SDL_Surface?
clq
浏览(0) + 2010-05-20 17:24:05 发表 编辑

关键字:

http://stackoverflow.com/questions/393954/how-to-convert-an-opencv-iplimage-to-an-sdl-surface

--------------------------------------------------

Hey all,

I'm trying to write a program which takes an SDL_Surface, converts it to an IplImage, uses the cvBlobsLib to find blobs, paints the blobs as spots back over the image, then converts the output IplImage back to an SDL_Surface.

I'm almost done: only converting the IplImage back to an SDL_Surface hasn't been done yet. This IplImage has 3 image channels and is 8 bits per pixel. I think I have two calls I can use:

SDL_Surface *SDL_CreateRGBSurface(Uint32 flags, int width, int height, int depth, Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask);
SDL_Surface
*SDL_CreateRGBSurfaceFrom(void *pixels, int width, int height, int depth, int pitch, Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask);

I'm currently trying with SDL_CreateRGBsurfaceFrom. I have no idea, however, what the correct values of pitch, Rmask, Gmask and Bmask are. (Amask is 0, because there is no alpha channel.)

Could anybody help me out by explaining how to do this?

Thanks!

Edit: For example, this is code I tried to use:

SDL_Surface *ipl_to_surface (IplImage *opencvimg)
{
   
int pitch = opencvimg->nChannels*opencvimg->width;
    printf
("Depth %d, nChannels %d, pitch %d\n", opencvimg->depth,
                    opencvimg
->nChannels, pitch);
    SDL_Surface
*surface = SDL_CreateRGBSurfaceFrom((void*)opencvimg->imageData,
                    opencvimg
->width,
                    opencvimg
->height,
                    opencvimg
->depth,
                    pitch
,
                   
0x0000ff, 0x00ff00, 0xff0000, 0
                   
);
   
return surface;
}

(SDL Documentation writes "Pitch is the size of the scanline of the surface, in bytes, i.e. widthInPixels*bytesPerPixel.") This outputs "Depth 8, nChannels 3, pitch 1920" and displays a completely red image. I think a solution would be to convert my 8-bits image to 24-bits (1 byte per channel), but I don't know how to do that. Any ideas?

--------------------------------------------------
Your image is 8 bits per pixel with 3 channels? Did you mean 24 bits per pixel, since that's what the RGB masks you specified seems to suggest? – codelogic Dec 26 '08 at 19:50

No, it's the other way around: the RGB masks I specified are wrong. The image is really 8 bits per pixel with 3 channels. I'm going to try this code now: paster.dazjorz.com/?p=3705 – dazjorz Dec 26 '08 at 19:52

Yeah your best bet would be to convert it to 24 bit or 32 bit since I don't think SDL handles non-standard bit depths too well. – codelogic Dec 26 '08 at 19:56

see question at stackoverflow.com/questions/394488/… too... :( – dazjorz Dec 27 '08 at 0:02

Ok. So now I've got a 32-bit 3-channel image, which I need to convert to SDL_Surface. – dazjorz Dec 27 '08 at 20:26
--------------------------------------------------

Ok, I got it working!

I think I was confused by the fact that an OpenCV depth of 8 means a pixel has 8 bits per channel, so in a 3-channel image, a pixel has 24 bits. So when converting that to the SDL meaning of depth, we get 8 * 3 = 24 bits.

The image was 24 bits after all, which SDL supports. So converting the image to SDL is as simple as:

SDL_Surface *surface = SDL_CreateRGBSurfaceFrom((void*)opencvimg->imageData,
                opencvimg
->width,
                opencvimg
->height,
                opencvimg
->depth*opencvimg->nChannels,
                opencvimg
->widthStep,
               
0xff0000, 0x00ff00, 0x0000ff, 0
               
);
return surface;

Sorry for the confusion, I hope this helps anybody searching for the same answer.

Other links of interest: http://www.libsdl.org/cgi/docwiki.cgi/Pixel_Access
And the complete subroutine at: http://paster.dazjorz.com/?p=3714



clq
2010-5-20 17:31:58 发表 编辑

SDL

3分
摘要纠错编辑摘要

SDL(Simple DirectMedia Layer)是一个自由的跨平台的多媒体开发包,适用于游戏、游戏SDK、演示软件、模拟器、MPEG播放器和其他应用软件。 用途广泛。

SDL-SDL是什么?

    

SDL(Simple DirectMedia Layer)是一个自由的跨平台的多媒 体开发包,适用于游戏、游戏SDK、演示软件、模拟器、 MPEG播放器和其他应用软件。
它被广泛的用于许多著名的游戏。最著名的游戏是赢得LINUX组游戏开发大奖的 文明:权利的召唤(Civilization: Call To Power)。
SDL的作者是Sam Lantinga, Loki Entertainment Software的主力程序员(Lead Programmer)。
SDLSDL


SDL-SDL有哪些功能?

    

SDL-·视频

    

设置8bpp或更高的任意色彩深度的视频模式。如果某个模式硬件不支持,可以选择转化为另一模式。
直接写入线性的图像帧缓 冲(framebuffer)。
用颜色键值(colorkey)或者alpha混合属性创建surface。
Surface的 blit能自动的转化为目标格式。blit是优化过的,并能使用硬件加速。x86平台上有针对MMX优化过的blit。
硬件加速的blit和 fill(填充)操作,如果硬件支持的话。

 

·事件


提供以下事件:
应用程序的visibility发生改变
键盘 输入
鼠标输入
用户要求的退出
每种事件都能通过SDL_EventState()关闭或者打开。
事件经由用户指定 的过滤函数再被加入到内部的事件队列。
线程安全的事件队列。

 

· 音频


设置8位和16位的音频,单声道或者立体声,如果格式硬件不支持,可以选择转 换。
由独立的线程执行音频部分,并提供用户回调(callback)机制。
设计上考虑到了客户定制的软混音器,但实际上在例程中就包 含了一个完整的音频/音乐输出库。

 

·CD音频

完整的CD音频控制API

 

·线程


简单的线程创建API
用于同步的简单的二进制信号量 (semaphores)
 

·定时器

读取已流逝的毫秒数。
等待指定的毫秒数。
设置一个10毫秒精度的 周期性定时器。

 

·字节序


侦测当前系统的字节序
快速转换数据的函数
读写指定字节序 的数据

SDL-SDL支持哪些系统平台?

    


·Linux
视频显示使用X11,利用XFree86 DGA扩展的优势,全屏显示使用新的w MTRR加速。
声音 使用OSS API。
使用clone()系统调用和SysV IPC,或者glibc-2.1的pthreads实现线程。
·Win32
有两个版本,一个是适合所有基于Win32的系统的安全版本,另一个是基于DirectX的高性能版本。
安全版本的视频显示采用 GDI。高性能版本采用DirectDraw,并支持硬件加速。
安全版本的音频回放采用waveOut API。高性能版本采用DirectSound
·BeOS
视频显示采用BWindow。
音频回放采用 BSoundPlayer API。
·非正式的移植版本,进展中
Solaris, IRIX, FreeBSD
MacOS

----------------------------------------------------------------------------------------------------------------------------------

SDL内置了调用OpenGL的函数。

通过使用SDL_image、SDL_ttf、SDL_mixer、 SDL_net等外部扩展库,可以轻松实现JPG、PNG、TIFF图像的加载使用,TrueType字体的使用,MP3文件的使用、网络相关的使用等。

SDL也有其他语言的包装,可以在这里查看http://www.libsdl.org/languages.php
SDL 用C语言写成,但是可以很容易在C++下 面工作,并且SDL绑定了许多其它的语言,这其中就包括Ada, C#, Eiffel, Erlang, Euphoria, Guile, Haskell, Java, Lisp, Lua, ML, Objective C, Pascal, Perl, PHP, Pike, Pliant, Python, Ruby, and Smalltalk。
包装得比较好的是python语言的pygame。不过仍然建议你 熟悉c/c++环境下的SDL后再使用,会得心应手许多。

SDL-SDL的版权

    


最后,我们来了解一下SDL的版权问题,SDL在GNU LGPL 2(一个国际上的开源组织)下发布,这个版本允许你将SDL以动态链接库(dynamic library)的形式免费地用于商业游戏软件的开发。



总数:1 页次:1/1 首页 尾页  
总数:1 页次:1/1 首页 尾页  


所在合集/目录



发表评论:
文本/html模式切换 插入图片 文本/html模式切换


附件:



NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.

Copyright © 2005-2020 clq, All Rights Reserved
版权所有
桂ICP备15002303号-1