MATLAB去除数字视频抖动教程及实验分享

需积分: 13 0 下载量 176 浏览量 更新于2024-09-02 收藏 4KB TXT 举报
"MT代码日志.txt 是一个关于数字视频抖动去除的MATLAB实现文档,作者通过实验分享了如何处理视频抖动问题。代码包括读取和显示AVI视频帧,将帧转换为静态图像,以及使用winvideo设备进行实时视频捕获,并创建视频文件。" 在视频处理领域,抖动是一个常见的问题,它降低了视频的质量和观看体验。本文档提供的MATLAB代码主要涉及以下几个关键知识点: 1. **AVI视频读取与显示**: - `aviread` 函数用于读取指定范围内的AVI视频帧。例如,`mov=aviread('11',156:1:176);` 从'11'这个文件中读取第156到176帧的数据到变量`mov`。 - `movie` 函数用于播放这些帧,如 `movie(mov);` 显示视频。 2. **图像转换与保存**: - 使用 `size` 函数获取视频帧的尺寸,例如 `temp=size(mov);` 获取视频帧的大小。 - `imwrite` 函数将每一帧的像素数据(cdata)保存为jpg图像,`strtemp=strcat(int2str(i),'.','jpg');` 创建保存的文件名,然后 `imwrite(mov(i).cdata(:,:,:),strtemp);` 进行保存。 3. **实时视频捕获**: - `videoinput` 函数用于从摄像头或视频源捕获视频流。在示例中,`vid=videoinput('winvideo',1);` 初始化winvideo设备。 - `set` 函数用来设置视频输入设备的属性,如改变颜色空间从RGB到灰度,`set(vid,'ReturnedColorSpace','grayscale');` 4. **视频捕获参数调整**: - `imaqhwinfo` 函数获取硬件信息,`cam_info=imaqhwinfo('winvideo');` 可以获取摄像头的相关信息。 - 设定捕获的视频格式,如 `'YUY2_640x480'`,并使用 `preview` 函数预览视频流。 - `getsnapshot` 函数用于获取当前帧,`frame=getsnapshot(vid);` 获取并显示当前帧。 5. **创建视频文件**: - `MakeVideo` 函数(未在给出的片段中定义)可能用于将捕获的帧合并成新的视频文件,参数包括视频输入对象、文件名、帧数和帧率。 - `set` 函数设置视频输入设备的触发模式,如 `set(vid,'TriggerRepeat',Inf);` 设置无限重复触发,`set(vid,'FramesPerTrigger',1);` 每次触发只捕获一帧。 这些MATLAB代码展示了基本的视频处理流程,包括视频读取、帧处理、保存和实时捕获,对于理解视频处理的原理和实践非常有帮助。虽然作者并非专业人士,但这些内容对于爱好者或初学者来说是很好的学习材料。

#ifndef MYSPDLOG_H #define MYSPDLOG_H #include <fstream> #include <iostream> #define SPDLOG_HEADER_ONLY #define SPDLOG_ACTIVE_LEVEL SPDLOG_LEVEL_DEBUG #include "spdlog/spdlog.h" #include "spdlog/logger.h" #include "spdlog/sinks/basic_file_sink.h" #include "spdlog/sinks/rotating_file_sink.h" #include "spdlog/sinks/stdout_color_sinks.h" #include "spdlog/sinks/daily_file_sink.h" class MySpdlog { public: static MySpdlog*getInstace() { static MySpdlog MySpdlogStatic; return &MySpdlogStatic; } int init() { std::string formatStr="%Y-%m-%dT%H:%M:%S.%e[%l][%s:%#][%!]%v"; // auto myLogger1 = std::make_shared<spdlog::sinks::rotating_file_sink_mt>("spdlog", "logs/myspdlog.log", 1024 * 1024 * 10, 10); // auto myLogger1 = std::make_shared<spdlog::sinks::daily_file_sink>("spdlog", "logs/log.txt", 0, 0); auto myLogger1 = spdlog::daily_logger_mt("spdlog", "logs/log.txt", 0, 0); // myLogger1 = spdlog::rotating_logger_mt("spdlog", "logs/myspdlog.log", 1024 * 1024 * 10, 10); spdlog::set_default_logger(myLogger1); myLogger1->set_level(spdlog::level::debug); myLogger1->set_pattern(formatStr); myLogger2 = spdlog::stdout_color_mt("baseLogger2"); spdlog::set_default_logger(myLogger2); myLogger2->set_level(spdlog::level::debug); myLogger2->set_pattern(formatStr); return 0; } void uninit() { } std::shared_ptr<spdlog::logger> myLogger1; std::shared_ptr<spdlog::logger> myLogger2; private: MySpdlog() {} ~MySpdlog() {} }; #define SPLOG_INIT() MySpdlog::getInstace()->init() #define SPLOG_UNINIT() MySpdlog::getInstace()->uninit() #define SPLOG_DEBUG(...) do {SPDLOG_LOGGER_DEBUG(MySpdlog::getInstace()->myLogger1, __VA_ARGS__);\ SPDLOG_LOGGER_DEBUG(MySpdlog::getInstace()->myLogger2, __VA_ARGS__);}while(0) #define SPLOG_INFO(...) do {SPDLOG_LOGGER_INFO(MySpdlog::getInstace()->myLogger1, __VA_ARGS__);\ SPDLOG_LOGGER_INFO(MySpdlog::getInstace()->myLogger2, __VA_ARGS__);}while(0) #define SPLOG_ERROR(...) do {SPDLOG_LOGGER_ERROR(MySpdlog::getInstace()->myLogger1, __VA_ARGS__);\ SPDLOG_LOGGER_ERROR(MySpdlog::getInstace()->myLogger2, __VA_ARGS__);}while(0) #define SPDLOG_CLRAR(a) do{std::fstream fout((a),std::ios::out|std::ios::trunc);fout.close();}while(0); #endif // MYSPDLOG_H运行之后调用SPLOG_INFO时报错

152 浏览量