实例介绍
【实例截图】
【核心代码】
#include <cstdint> #include <fstream> #include <iostream> #include <iterator> #include <boost/endian/arithmetic.hpp> #include <boost/program_options/options_description.hpp> #include <boost/program_options/parsers.hpp> #include <boost/program_options/positional_options.hpp> #include <boost/program_options/variables_map.hpp> namespace po = boost::program_options; using namespace boost::endian; constexpr auto wh32_offset = 0x2324; constexpr auto conf_offset = 0x2414; // A struct containing various settings for camera hardware. There are // actually two entries at `conf_offset`, however, only the first one is used. // // To double frame rate, the following fields need to be halved: // active_pixel_width // active_pixel_height // pixel_array_height // output_timing // // and the fps field need to be doubled as well. struct [[gnu::packed]] configuration { little_int16_t active_pixel_width; little_int16_t active_pixel_height; little_int16_t pixel_array_width; little_int16_t pixel_array_height; little_int32_t sensor_timing; little_int32_t output_timing; std::uint8_t unknown[8]; little_float32_t fps; }; static_assert(sizeof(configuration) == 28); std::ostream& operator<<(std::ostream& out, const configuration& conf) { out << "active_pixel_width=" << conf.active_pixel_width << ' '; out << "active_pixel_height=" << conf.active_pixel_height << ' '; out << "pixel_array_width=" << conf.pixel_array_width << ' '; out << "pixel_array_height=" << conf.pixel_array_height << ' '; out << "sensor_timing=" << conf.sensor_timing << ' '; out << "output_timing=" << conf.output_timing << ' '; out << "fps=" << conf.fps; return out; } template<typename T, typename Output> auto cond_set_field(Output& dst, const po::variables_map& vm, const std::string& key) { if (vm.count(key)) { dst = vm[key].as<T>(); } } auto main(const int argc, const char * const * const argv) -> int { const po::options_description desc = [] { po::options_description desc("Options"); desc.add_options()("active-pixel-width", po::value<std::int16_t>()); desc.add_options()("active-pixel-height", po::value<std::int16_t>()); desc.add_options()("pixel-array-width", po::value<std::int16_t>()); desc.add_options()("pixel-array-height", po::value<std::int16_t>()); desc.add_options()("sensor-timing", po::value<std::int32_t>()); desc.add_options()("output-timing", po::value<std::int32_t>()); desc.add_options()("fps", po::value<float>()); desc.add_options()("input-file,i", po::value<std::string>()); desc.add_options()("output-file,o", po::value<std::string>()); return desc; }(); const po::positional_options_description pdesc = [] { po::positional_options_description pdesc; pdesc.add("input-file", 1); return pdesc; }(); const po::variables_map vm = [&] { po::variables_map vm; po::store(po::command_line_parser(argc, argv).options(desc).positional(pdesc).run(), vm); po::notify(vm); return vm; }(); const auto input_filename = [&](const std::string& key) { if (vm.count(key)) { return vm[key].as<std::string>(); } else { std::cerr << desc << std::endl; exit(EXIT_FAILURE); } }("input-file"); const configuration conf = [&] { std::ifstream input_file(input_filename); input_file.exceptions(std::ios::failbit | std::ios::badbit); input_file.seekg(conf_offset); configuration conf; input_file.read(reinterpret_cast<std::fstream::char_type*>(&conf), sizeof(conf)); return conf; }(); std::cerr << input_filename << ": " << conf << std::endl; if (vm.count("output-file")) { const configuration new_conf = [&] { configuration new_conf = conf; cond_set_field<std::int16_t>(new_conf.active_pixel_width, vm, "active-pixel-width"); cond_set_field<std::int16_t>(new_conf.active_pixel_height, vm, "active-pixel-height"); cond_set_field<std::int16_t>(new_conf.pixel_array_width, vm, "pixel-array-width"); cond_set_field<std::int16_t>(new_conf.pixel_array_height, vm, "pixel-array-height"); cond_set_field<std::int32_t>(new_conf.sensor_timing, vm, "sensor-timing"); cond_set_field<std::int32_t>(new_conf.output_timing, vm, "output-timing"); cond_set_field<float>(new_conf.fps, vm, "fps"); return new_conf; }(); const auto output_filename = vm["output-file"].as<std::string>(); std::ofstream output_file(output_filename); output_file.exceptions(std::ios::failbit | std::ios::badbit); [&] { std::ifstream input_file(input_filename); std::copy(std::istreambuf_iterator<char>(input_file), std::istreambuf_iterator<char>(), std::ostreambuf_iterator<char>(output_file)); }(); // The active pixel width and height as 32-bit integer @ wh32_offset needs to be written as well. output_file.seekp(wh32_offset); const little_int32_t active_pixel_width = static_cast<std::int32_t>(new_conf.active_pixel_width); output_file.write(reinterpret_cast<const std::fstream::char_type*>(&active_pixel_width), sizeof(active_pixel_width)); const little_int32_t active_pixel_height = static_cast<std::int32_t>(new_conf.active_pixel_height); output_file.write(reinterpret_cast<const std::fstream::char_type*>(&active_pixel_height), sizeof(active_pixel_height)); output_file.seekp(conf_offset); output_file.write(reinterpret_cast<const std::fstream::char_type*>(&new_conf), sizeof(new_conf)); std::cerr << output_filename << ": " << conf << std::endl; } return 0; }
标签:
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论