查看: 3793|回复: 17

如何在osg中显示摄像机的采集图像

[复制链接]

该用户从未签到

发表于 2010-10-30 14:18:05 | 显示全部楼层 |阅读模式
我想基本的原理应该是将摄像机获取的图像转换成osg::Image,然后再动态修改的贴图。动态修改是不是在渲染状态集的回调中来进行呢?

该用户从未签到

发表于 2010-10-30 14:57:57 | 显示全部楼层
OSGART

该用户从未签到

 楼主| 发表于 2010-10-30 16:04:35 | 显示全部楼层
osgART我在别的工程中用过,总体感觉还是没有OpenCV的视频功能好。所以我打算用OpenCV来实现视频采集和处理!
IplImage转osg::Image,我知道。

该用户从未签到

发表于 2010-11-1 08:36:39 | 显示全部楼层
OSG可以使用ffmpeg轻松实现视频采集,在Linux下只要osgviewer /dev/... -e ffmpeg就可以了;在Windows下的实现我刚刚提交了自己的更改,正式加入核心后也可以在Windows下将摄像头数据作为动画纹理读入

该用户从未签到

 楼主| 发表于 2010-11-1 08:49:52 | 显示全部楼层
希望新的功能能早日发布,不过眼下我就想解决这个问题。不知道我在渲染状态集的回调中更新的思路是否正确呢?
1、IplImage 转 osg::Image  
2、texture->setImage(image.get());
3、stateset->setTextureAttributeAndModes(0,texture.get(),osg::StateAttribute::ON);

该用户从未签到

发表于 2010-11-1 09:39:48 | 显示全部楼层
您可以参考osgdb_gif中GifStream类的写法,实现纹理图像的实时更替

该用户从未签到

 楼主| 发表于 2010-11-1 10:08:07 | 显示全部楼层
我只看到了设置图像,这个函数只是动态修改了自身的。也就是说,用这个方法不用回调,而是在另一个线程里修该Image的属性就可以了。
setImage(_s,_t,_r,_internalTextureFormat,_pixelFormat,_dataType,
                image,osg::Image::NO_DELETE,1);

至于实现动态贴图的方法,应该就和我先前想的一样吧!Array的方法的确更高段。

该用户从未签到

 楼主| 发表于 2010-11-1 11:22:10 | 显示全部楼层
我的想法得到证实了,是对的,哈哈!

该用户从未签到

 楼主| 发表于 2010-11-1 12:35:38 | 显示全部楼层
不过又衍生出一个问题:
全屏播放的时候,FPS是59~60(和显示器的刷新一致),但是当切换成窗口模式时就变成十几帧每秒了。这个情况只要是开始捕捉视频就会出现。全屏时很正常,当全屏状态下切换个对话框在上方显示也会使帧率降低。不知道为什么?

该用户从未签到

发表于 2010-11-1 14:54:45 | 显示全部楼层
没有看到更多的信息,我无法判断什么

该用户从未签到

 楼主| 发表于 2010-11-1 15:11:31 | 显示全部楼层
我观察了一下,全屏的时候CPU占用率一直保持很高,Viewer的状态显示Update的数据是0.3左右;
退出全屏后CPU占用了就变很低,Update的数值变成了300~400. 不知道是不是osg的自身机制。

该用户从未签到

 楼主| 发表于 2010-11-1 15:22:02 | 显示全部楼层
本帖最后由 aaa696 于 2010-11-1 15:24 编辑

终于知道原因了,贴图的大小问题!
加了这句造成的,呵呵。
texture->setResizeNonPowerOfTwoHint(false);

但是不明白的是,为什么在全屏显示的时候不会受影响!

该用户从未签到

发表于 2013-5-21 19:37:25 | 显示全部楼层
aaa696 发表于 2010-11-1 08:49
希望新的功能能早日发布,不过眼下我就想解决这个问题。不知道我在渲染状态集的回调中更新的思路是否正确呢 ...

你好,我是OSG新手,想问下怎样能够把IplImage转osg::Image呢?尤其是那个纹理格式,不知道怎么设置。。。。
之后必须得设置2、texture->setImage(image.get()); 和3、stateset->setTextureAttributeAndModes(0,texture.get(),osg::StateAttribute::ON); 是怎么回事?谢谢大牛

该用户从未签到

发表于 2013-5-22 08:07:27 | 显示全部楼层
aixiche 发表于 2013-5-21 19:37
你好,我是OSG新手,想问下怎样能够把IplImage转osg::Image呢?尤其是那个纹理格式,不知道怎么设置。。。 ...

将IplImage 中的 data 和 像素信息 设置给 osg::Image

该用户从未签到

发表于 2013-5-22 09:25:23 | 显示全部楼层
liuzhiyu123 发表于 2013-5-22 08:07
将IplImage 中的 data 和 像素信息 设置给 osg::Image

哈哈,非常感谢您能回答我哈,你说的步骤我知道,但是在传给osg::image的时候不是有个GLint internalTextureformat(图像作为纹理使用时,纹理所需的格式),这个一直不知道怎么设置啊。
还有那个AllocationMode mode(销毁图像时的工作方式),书上说可以选择USE_NEW_DELETE或者NO_DELETE,但是我在编代码的时候,这个下面老是有红线。。。。不知道什么问题。

该用户从未签到

发表于 2013-5-22 09:35:16 | 显示全部楼层
aixiche 发表于 2013-5-22 09:25
哈哈,非常感谢您能回答我哈,你说的步骤我知道,但是在传给osg::image的时候不是有个GLint internalText ...

就是纹理中颜色的分量
internalFormat
                    Specifies the number of color components in the texture.
                    Must be one of base internal formats given in Table 1,
                    one of the sized internal formats given in Table 2, or one
                    of the compressed internal formats given in Table 3, below.

http://www.opengl.org/sdk/docs/man/xhtml/glTexImage2D.xml
               

该用户从未签到

发表于 2013-5-22 09:42:25 | 显示全部楼层
liuzhiyu123 发表于 2013-5-22 09:35
就是纹理中颜色的分量
internalFormat
                    Specifies the number of color component ...

嘿嘿,懂了,后面的问题也找到出错的地方了,谢谢大牛啊

该用户从未签到

发表于 2013-5-22 09:44:37 | 显示全部楼层
aixiche 发表于 2013-5-22 09:42
嘿嘿,懂了,后面的问题也找到出错的地方了,谢谢大牛啊

void Image::deallocateData()
{
    if (_data) {
        if (_allocationMode==USE_NEW_DELETE) delete [] _data;
        else if (_allocationMode==USE_MALLOC_FREE) ::free(_data);
        _data = 0;
    }
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表