序言

在一个项目中,需要输出osg仿真的图像结果,但是直接借用源码中的ScreenCaptureHandler无法实现咋指定目录下输出,且输出图像名称无法修改,默认使用按键的响应方式无法满足项目需求,在参考相关源码和帖子的基础上,以及方方的大力帮助下,有了下面的内容。
与现有网上大量内容相比,其只给出了代码,没有给出如何使用,让和我一样的超级菜鸟一头雾水。所以有了下面的内容。

a.h文件定义如下:
#pragma once#ifndef A_H
#define A_H#include <string>
#include <osgDB/WriteFile>
#include <osgViewer/ViewerEventHandlers>class CScreenCapture : public osgViewer::ScreenCaptureHandler
{
public:int il;class  WriteToImageFile : public osgViewer::ScreenCaptureHandler::CaptureOperation{public:enum SavePolicy{OVERWRITE,SEQUENTIAL_NUMBER};WriteToImageFile(const std::string& filename, const std::string& extension, SavePolicy savePolicy = SEQUENTIAL_NUMBER) {_filename = filename;_extension = extension;_savePolicy = savePolicy;ik = 0;}virtual void operator()(const osg::Image& image, const unsigned int context_id)//仿函数实现图片保存{if (!_filename.empty()){std::string patch = _filename+"_"+std::to_string(ik)+"." + _extension;osgDB::writeImageFile(image, patch); ik++;}}void setFileName(const std::string &filename){_filename = filename;}void setSavePolicy(SavePolicy savePolicy) { _savePolicy = savePolicy; }SavePolicy getSavePolicy() const { return _savePolicy; }protected:WriteToImageFile& operator = (const WriteToImageFile&) { return *this; }std::string _filename;std::string _extension;SavePolicy _savePolicy;std::vector<unsigned int> _contextSaveCounter;int ik;};CScreenCapture(CaptureOperation* defaultOperation = 0, int numFrames = 1);virtual bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa);//void setFileName();
};#endif
//https://blog.csdn.net/xjujun/article/details/38986301
a.cpp如下:
/****************************************************************************
*
*
*
****************************************************************************///#include "stdafx.h"
#include "a.h"CScreenCapture::CScreenCapture(CaptureOperation* defaultOperation /*= 0*/, int numFrames/* = 1*/):
ScreenCaptureHandler( defaultOperation, numFrames )
{il = 0;
}bool CScreenCapture::handle( const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa )
{osgViewer::ViewerBase* viewer = dynamic_cast<osgViewer::View*>(&aa)->getViewerBase();if (!viewer) return false;switch(ea.getEventType()){case (osgGA::GUIEventAdapter::FRAME):{  addCallbackToViewer(*viewer);if (getFramesToCapture() == 0){setFramesToCapture(1);}break;}default:break;}return false;
}//void CScreenCapture::setFileName()
//{
//  CScreenCapture::WriteToImageFile* wtf =  dynamic_cast<CScreenCapture::WriteToImageFile*>(getCaptureOperation());
//  //wtf->setFileName("11111111.jpg");
//  //wtf->setSavePolicy(wtf->SEQUENTIAL_NUMBER);
//  wtf->setFileName(std::to_string(il) + ".jpg");
//}
用法:
....std::string path = "./1/IR123456789.jpg";osg::ref_ptr<CScreenCapture::WriteToImageFile> wfi = new CScreenCapture::WriteToImageFile(osgDB::getNameLessExtension(path),osgDB::getFileExtension(path)); osg::ref_ptr<CScreenCapture >cs = new CScreenCapture(wfi.get());viewer.addEventHandler(cs.get());
//外部控制时,使用  viewer.removeEventHandler(cs.get());//此处未测试
....
参考资料:
  1. https://blog.csdn.net/xjujun/article/details/38986301
  2. osg源码: D:\OSG\OSG_3.4.0\src\applications\present3D\present3D.cpp [line624]
// add the screen capture handlerstd::string screenCaptureFilename = "screen_shot.jpg";while(arguments.read("--screenshot", screenCaptureFilename)) {}osg::ref_ptr<osgViewer::ScreenCaptureHandler::WriteToFile> writeFile = new osgViewer::ScreenCaptureHandler::WriteToFile(osgDB::getNameLessExtension(screenCaptureFilename),osgDB::getFileExtension(screenCaptureFilename) );osg::ref_ptr<osgViewer::ScreenCaptureHandler> screenCaptureHandler = new osgViewer::ScreenCaptureHandler(writeFile.get());screenCaptureHandler->setKeyEventTakeScreenShot('m');//osgGA::GUIEventAdapter::KEY_Print);screenCaptureHandler->setKeyEventToggleContinuousCapture('M');viewer.addEventHandler(screenCaptureHandler.get());

http://www.taodudu.cc/news/show-1639487.html

相关文章:

  • C++相对路径下新建文件夹
  • OpenCV图像处理(14)—— 图像转视频
  • OpenCV图像处理(18)——文件夹下所有图像转灰度(14-15综合)
  • OpenCV图像处理(17)—— 各种二值化对比
  • 真正的研发之路(1)
  • (2)Mac安装Parallels无法上网
  • C++ Licence认证用于项目开发和设备认证
  • (1)鼠标单独移动两个actor
  • (6)通过输入参数(测量数据)构建三维体模型
  • (4)建立一个标准尺寸的平面,并对其进行着色贴图、拉伸一定的厚度
  • (5)通过输入参数(测量数据)构建二维体模型(01)
  • (3)通过输入参数(测量数据)构建三维体模型(02)
  • (8)VTK 鼠标左右键控制模型旋转
  • (2)通过输入参数(测量数据)构建三维体模型(01)
  • (01)VTK读取OBJ格式模型
  • (02)vtk 绘制模型的外轮廓线 模型轮廓线
  • (03)两个模型的交集、并集、差集
  • (04)VTK移动模型,判断是否相交
  • (05)vtk通过多边形构建矩形,并拉伸成立方体,两个立方体独立操作
  • (06)vtk修改默认鼠标操作,实现鼠标按键控制模型旋转
  • who i am !
  • (01)OpenGL es中只在指定区域渲染view
  • (01)C++之设计模式演变
  • C++设计模式(全网最通俗易懂的设计模式进阶)
  • c++工程模式+配置文件+动态调用类
  • 读书感悟之,从术到道
  • 因果否?
  • (01)数据库及相关
  • avg最多用多少列 mysql_40斤一桶水,最多用多少克磷酸二氢钾?打几次增产效果最好...
  • 用单片机测量流体流速的_旋进旋涡流量计的测量原理及优点

OSG仿真案例(10)——osg仿真录屏抓取图像,自定义修改路径,程序控制(而不是按键控制)...相关推荐

  1. Macbook windows 10系统下录屏软件无法录制系统声音的问题

    Macbook Windows 10系统下录屏软件无法录制系统声音的问题 问题原因 Virtual Audio Cable 下载与安装 以Obs-Studio为例进行测试 录屏完成 参考教程链接 问题 ...

  2. 网页怎么算切屏_十种切屏抓取方法(图形)

    屏幕截取招招看!教你十种屏幕抓取方法(图形) 说起屏幕截图,相信大家都不会陌生:随意翻翻每期的<电 脑报> ,哪篇不是图文并茂 ? 但是对于刚刚接触电脑的朋友来说, 对如何进行抓图还摸不着 ...

  3. 用HyperSnap实现滚屏抓取多屏网页

    用HyperSnap实现滚屏抓取多屏网页 你完全不必耐心的看完所有内容,这里想说明的无非是以下2点: 1. 滚屏内容抓取:在HyperSnap的Active Window(ctrl+shift+w)抓 ...

  4. ios 10 开发-录屏直播 ReplayKit Live 与 Broadcast UI/Upload Extension

    在 iOS 8 及以前,第三方 App 如果想要全局录屏,只能使用私有 API,详见非越狱后台录屏. 升级到 iOS 9 后,官方新增了 ReplayKit,并且禁用了录屏的私有 API.Replay ...

  5. 安卓10自带录屏_手把手教你安卓手机怎么录屏,收下这份屏幕录制指南

    原标题:手把手教你安卓手机怎么录屏,收下这份屏幕录制指南 记得前两年安卓手机大部分还不支持系统录屏功能的时候,小编有多羡慕使用苹果手机的人.但是近年来安卓系统的功能也在不断发展完善,大部分的安卓手机都 ...

  6. 安卓10自带录屏_手机自带的录屏功能真是太强大了,完全秒杀第三方工具

    1.iphone录屏 很多人说找不到苹果手机的屏幕录制功能在哪里,然后傻傻地去下载一些第三方录屏工具.今天小编就来告诉你,它到底在哪里!之所以找不到它,是因为它是默认隐藏的功能,要设置一下,才能直接在 ...

  7. 安卓10自带录屏_谷歌终于在Android 11版里原生支持屏幕录像功能(即录屏)和长截图功能...

    在谷歌面向开发者们推出 Android 11 开发者预览版后,关于新版本的越来越多的新增功能正在被逐渐发掘出来. 例如最新被发掘出来的新功能是谷歌终于添加所有用户期待已久的屏幕录像功能,同时还支持进行 ...

  8. python代码案例详解-我用Python抓取了7000 多本电子书案例详解

    安装 安装很简单,只要执行: pip install requests-html 就可以了. 分析页面结构 通过浏览器审查元素可以发现这个电子书网站是用 WordPress 搭建的,首页列表元素很简单 ...

  9. 动态加载子节点_简易数据分析 10 | Web Scraper 翻页—抓取「滚动加载」类型网页...

    这是简易数据分析系列的第 10 篇文章. 原文首发于博客园:简易数据分析 10. 友情提示:这一篇文章的内容较多,信息量比较大,希望大家学习的时候多看几遍. 我们在刷朋友圈刷微博的时候,总会强调一个『 ...

最新文章

  1. WiredTiger引擎编译 及 LT_PREREQ(2.2.6)问题解决
  2. 突然挂了!Redis缓存都在内存中,这下完了!
  3. 【笔记】shellcode相关整理
  4. ScheduledExecutorService
  5. Jquery 获取日期date()对象,jquerydate
  6. 还在犹豫是否迁移.NET5?这几个项目已经上线了!
  7. 二维分类教案_幼儿园中班数学教案中班数学教案二维排序——师乐汇幼儿教师教育网...
  8. 一文带你解读Volcano架构设计与原理
  9. Occluded Pedestrian Detection Through Guided Attention in CNNs 论文总结
  10. 转载:图解SSL/TLS协议
  11. FISCO BCOS 最大tps 每秒出块个数 tx_count_limit 区块容量 控制台设置参数 区块大小
  12. dms系统与mysql_DMS管理MYSQL数据库登陆不了。
  13. 网页服务器阿帕奇怎么启动服务,阿帕奇服务器使用教程
  14. Robust PCA——Inexect ALM
  15. C语言:计算班级平均数
  16. Python之温度转换
  17. 一个Java菜鸟的学习之道~~~
  18. OSPF NBMA网络
  19. 天视通摄像头设置教程_天视通摄像头设置教程_直播教程 | 使用虎牙伴侣背景消除,来点新鲜的直播玩法!......
  20. 每日一算法7--35选7彩票程序

热门文章

  1. [工具] PicGo + smms 构建图床
  2. [Python] 切片函数:silce()
  3. CELL_TYPE_STRING cannot be resovled or is not a field
  4. cad计算机制图论文,机械制图论文范文
  5. shell 免杀aspx_记一次aspx网站渗透
  6. Python3 多线程(连接池)操作MySQL插入数据
  7. Django关联数据库时报错TypeError: __init__() missing 1 required positional argument: 'on_delete'...
  8. Kettle资源库-元数据
  9. 数据库系统实现 第一章 DBMS实现概述
  10. MyEclipse开启Jquery智能提示