Ogre利用OpenCV实现视频纹理
来源:互联网 发布:中小型企业网络构建 编辑:程序博客网 时间:2024/06/04 18:31
原文写于2011年
http://blog.csdn.net/zhuxiaoyang2000/article/details/6758407
由于Ogre自身没有实现视频纹理,我们需要自己想办法读取视频并显示到某个物体上。网上已有人通过TheoraVideoPlugin实现视频播放,但需要编译libogg等几个第三方库,其自身带的Demo也不完善,不便于利用。由于最近在搞OpenCV,就想到是不是可以通过OpenCV来读取视频,并将每帧图片转化为Ogre可读的Buffer,然后将其显示到实体上。Google之后发现,已经有人有类似的想法,但给出的答案没有处理好图片的RGB问题,总是报错。经过几个小时的修改,我已经成功实现了Ogre的视频纹理。
(1)首先当然要有OpenCV库(include文件、lib文件、dll文件),可以自己编译或下载已经编译好的版本。我采用的是OpenCV 2.0。
需要的lib文件是cv200.lib,cxcore200.lib和highgui200.lib(根据OpenCV的版本不同,文件的名称也会不同)及相应的dll文件。
(2)读取视频文件
- IplImage* mVideoFrame;
- CvCapture* mVideoCapture;
- mVideoCapture = cvCreateFileCapture("..\\media\\xxx.avi");
(3)创建视频帧的图片及其相应的材质文件
这里要特别注意的就是OpenCV的IplImage的图片数据中RGB的存储顺序,它默认的存储顺序是BGR。故在设置TexturePtr时我们也应该注意其图片格式,否则会出现各种诡异的错误。这里我们添加了A通道,图片格式为PF_B8G8R8A8。
- void createVideoTexture()
- {
- mVideoFrame = cvQueryFrame(mVideoCapture);
- if(!mVideoFrame)
- {
- return;
- }
- // Implementing a video texture
- Ogre::TexturePtr texture = Ogre::TextureManager::getSingleton().createManual(
- "VideoTexture", // name
- Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
- Ogre::TEX_TYPE_2D, // type
- mVideoFrame->width, // width
- mVideoFrame->height, // height
- 0, // number of mipmaps
- Ogre::PF_B8G8R8A8, // pixel format
- Ogre::TU_DYNAMIC_WRITE_ONLY_DISCARDABLE // usage, for textures updated very often
- );
- // Get the pixel buffer
- Ogre::HardwarePixelBufferSharedPtr pixelBuffer = texture->getBuffer();
- // Lock the pixel buffer and get a pixel box
- unsigned char* buffer = static_cast<unsigned char*>(
- pixelBuffer->lock(0, mVideoFrame->width*mVideoFrame->height*4, Ogre::HardwareBuffer::HBL_DISCARD) );
- for(int y = 0; y < mVideoFrame->height; ++y)
- {
- for(int x = 0; x < mVideoFrame->width; ++x)
- {
- buffer[ ((y*mVideoFrame->width)+x)*4 + 0 ] = mVideoFrame->imageData[ ((y*mVideoFrame->width)+x)*3 + 0 ]; // B
- buffer[ ((y*mVideoFrame->width)+x)*4 + 1 ] = mVideoFrame->imageData[ ((y*mVideoFrame->width)+x)*3 + 1 ]; // G
- buffer[ ((y*mVideoFrame->width)+x)*4 + 2 ] = mVideoFrame->imageData[ ((y*mVideoFrame->width)+x)*3 + 2 ]; // R
- buffer[ ((y*mVideoFrame->width)+x)*4 + 3 ] = 255; // A
- }
- }
- // Unlock the pixel buffer
- pixelBuffer->unlock();
- // Create a materail using the texture
- Ogre::MaterialPtr material = Ogre::MaterialManager::getSingleton().create(
- "VideoTextureMaterial", // name
- Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
- material->getTechnique(0)->getPass(0)->createTextureUnitState("VideoTexture");
- material->getTechnique(0)->getPass(0)->setDepthCheckEnabled(false);
- material->getTechnique(0)->getPass(0)->setDepthWriteEnabled(false);
- material->getTechnique(0)->getPass(0)->setLightingEnabled(false);
- }
- Ogre::Rectangle2D* mVideoScreen = new Ogre::Rectangle2D(true);
- mVideoScreen->setCorners(-0.5f, 1.0f, 0.5f, -1.0f);
- mVideoScreen->setBoundingBox(Ogre::AxisAlignedBox(-100000.0f * Ogre::Vector3::UNIT_SCALE, 100000.0f * Ogre::Vector3::UNIT_SCALE));
- mVideoScreen->setMaterial( material->getName() );
- // Attach it to a SceneNode
- Ogre::SceneNode* videoScreenNode = mSceneMgr->getRootSceneNode()->createChildSceneNode("VideoScreenNode");
- videoScreenNode->attachObject(mVideoScreen);
方法和(3)差不多,这里就不赘述了。
实现效果如下:
源代码可在http://download.csdn.net/detail/zhuxiaoyang2000/3582906找到。
- Ogre利用OpenCV实现视频纹理
- Ogre利用OpenCV实现视频纹理
- Ogre中使用Opencv加载视频作为纹理贴图
- Ogre中使用Opencv加载视频作为纹理贴图
- 利用OpenCV实现图像纹理特征提取
- Ogre 利用 pixel buffer 绘制纹理
- MFC中利用OpenCV实现视频播放
- 利用opencv读取图片将其作为opengl的纹理图片的实现方法
- 利用opencv读取图片将其作为opengl的纹理图片的实现方法
- 利用opencv读取图片将其作为opengl的纹理图片的实现方法
- 利用opencv读取图片将其作为opengl的纹理图片的实现方法
- MFC中利用多线程实现opencv视频窗口多画面
- 利用OpenCV的VideoCapture类实现视频/摄像头读操作
- 利用OpenCV的VideoWriter类实现视频的写操作
- 【VS开发】【视频开发】利用ffmpeg+opencv实现画中画
- Ogre中实现 几何面正反面不同纹理贴图
- Ogre中实现 几何面正反面不同纹理贴图
- 利用opencv给视频截图
- JDBC为什么要使用PreparedStatement而不是Statement
- 计算机科学概论(第11版) 1.6节 问题与练习答案
- OMAPL138学习----cmem加载问题
- svn
- 九度1005Graduate Admission
- Ogre利用OpenCV实现视频纹理
- java设计模式(行为型)之解析器模式
- CI框架(九)CI中site_url()和base_url()的区别
- try catch finally的执行顺序
- u-boot移植(三)
- 获取新浪微博滚动加载内容
- C#之三个数排序and求平均值+按值传递与按引用传递
- AJAX初级应用——DOM的应用
- JavaBean