matlab打开视频文件并提取颜色数据

2023-11-15

目标:实现加载任意视频文件,并按帧取指定图像区域的某颜色值代表该区域的颜色值。

1. 加载视频文件

加载视频文件使用函数VideoReader,输入为文件夹路径,返回为一个VideoReader对象,具体使用方法见创建对象以读取视频文件 - MATLAB - MathWorks 中国

vidObj = VideoReader('FIR_032.MOV');
width = vidObj.Width;
height = vidObj.Heigh;

2. 对调用VideoReader的调用内置函数,按照顺序读取每一帧。 

while hasFrame(vidObj)
    vidFrame = readFrame(vidObj);
    imshow(vidFrame)
    pause(0.01)
end

 vidFrame即3d数据,也就是一幅图像。

3.1 计算vidFrame指定区域的颜色均值

将h*w*3的输入3维矩阵img,转化为高度h*w,宽度3的矩阵,然后计算列均值mean(:,1)即img的平均颜色。

FL = vidFrame(1:height,1:width,:);
FL = img(1:height/2,1:width/2,:);
RGB = MeanRGB(img);

function rgb = meanRGB(img) 
    h = size(img,1);
    w = size(img,2);
    rimg = reshape(img,[h*w,3]);
    rgb = uint8(mean(double(rimg),1));
end

除此之外,还提供以下以某个颜色值代表整个区域颜色值的方法:

3.2 颜色最大值

注意,在此处为了更好的效果,并非对rgb三个通道分别取最大值(这样基本结果为#ffffff),而是看作一个整体取最大值,即计算r^2+g^2+b^2最大的颜色值。

同理转化为高度h*w,宽度3的矩阵,用sum(X.^2,2)计算每行所有元素的平方值和,取max得到对应的索引index,并转换维原始三维矩阵下的索引[X,Y]。

function rgb = maxRGB(img) 
    h = size(img,1);
    w = size(img,2);
    rimg = reshape(img,[h*w,3]);
    value = sum(double(rimg).^2,2);
    [~,index] = max(value);
    x = mod(index, h);
    if x == 0
        x = h;
    end
    y = ceil(index / h);
    rgb = img(x,y,:);
    rgb = reshape(rgb, [1,3]);
%    if max(rgb) < 140
%        rgb= [0,0,0];
%    end
end

3.3 第三个四分位(排序后75%位置的颜色)

总体思路和3.2相似,不过将max换为prctile(x,75)

function rgb = quantileRGB(img) 
    h = size(img,1);
    w = size(img,2);
    rimg = reshape(img,[h*w,3]);
    value = sum(double(rimg).^2,2);
    quavlaue = prctile(value,75);
    %存在误差导致可能find(quavlaue==value)结果为空,因此修改为绝对差小于100
    index = find(abs(quavlaue-value) < 100, 1);
    x = mod(index, h);
    if x == 0
        x = h;
    end
    y = ceil(index / h);
    rgb = img(x,y,:);
    rgb = reshape(rgb, [1,3]);
end

3.4 指定位置颜色(例如最中心)

转化为二维矩阵后取行数的一半即原始中心区域。

function rgb = selectRGB(img) 
    h = size(img,1);
    w = size(img,2);
    rimg = reshape(img,[h*w,3]);
    rgb = rimg(h*w/2,:);
end

4. 得到rgb后进行处理,保存。

完整实例:

vidObj = VideoReader('FIR_032.MOV');
width = vidObj.Width / 2;
height = vidObj.Height / 2;
i = 0;
data = zeros(vidObj.NumFrames + 2, 18);
while hasFrame(vidObj)
    vidFrame = readFrame(vidObj);
    i = i + 1;
    img = vidFrame;
    FL = img(1:height,1:width,:);
    FR = img(1:height,width + 1:2 * width,:);
    RL = img(height +1 :2 * height,1:width,:);
    RR = img(height +1 :2 * height,width + 1:2 * width,:);   
    newdata = zeros(1,18);
    newdata(1:12) = [meanRGB(FL), meanRGB(FR), meanRGB(RL),meanRGB(RR)];
    newdata(17) = 1;
    data(i + 1,:) = newdata;
end
% vidObj = VideoReader('Fireworks Display At Night.MP4');
% width = vidObj.Width / 2;
% height = vidObj.Height / 2;
% i = 0;
% data = zeros(vidObj.NumFrames + 1, 18);
% while hasFrame(vidObj)
%     vidFrame = readFrame(vidObj);
%     i = i + 1;
%     img = vidFrame(:,:,:);
%     FL = img(1:height,1:width,:);
%     FR = img(1:height,width + 1:2 * width,:);
%     RL = img(height +1 :2 * height,1:width,:);
%     RR = img(height +1 :2 * height,width + 1:2 * width,:);   
%     newdata = zeros(1,18);
%     newdata(1:12) = [quantileRGB(FL), quantileRGB(FR), quantileRGB(RL),quantileRGB(RR)];
%     for j = 1 : 4
%         if (max(newdata((j - 1) * 3 + 1: j * 3)) > 200)
%             newdata(12 + j) = 1;
%         end
%     end
% 
%     data(i + 1,:) = newdata;
% end
function rgb = selectRGB(img) 
    h = size(img,1);
    w = size(img,2);
    rimg = reshape(img,[h*w,3]);
    rgb = rimg(h*w/2,:);
end
function rgb = meanRGB(img) 
    h = size(img,1);
    w = size(img,2);
    rimg = reshape(img,[h*w,3]);
    rgb = uint8(mean(double(rimg),1));
    if rgb(2) > rgb(1)
        rgb(2) = rgb(3);
    end
end
function rgb = quantileRGB(img) 
    h = size(img,1);
    w = size(img,2);
    rimg = reshape(img,[h*w,3]);
    value = sum(double(rimg).^2,2);
    quavlaue = prctile(value,75);
    index = find(abs(quavlaue-value) < 100, 1);
    x = mod(index, h);
    if x == 0
        x = h;
    end
    y = ceil(index / h);
    rgb = img(x,y,:);
    rgb = reshape(rgb, [1,3]);
end
function rgb = maxRGB(img) 
    h = size(img,1);
    w = size(img,2);
    rimg = reshape(img,[h*w,3]);
    value = sum(double(rimg).^2,2);
    [~,index] = max(value);
    x = mod(index, h);
    if x == 0
        x = h;
    end
    y = ceil(index / h);
    rgb = img(x,y,:);
    rgb = reshape(rgb, [1,3]);
    if max(rgb) < 140
        rgb= [0,0,0];
    end
end

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

matlab打开视频文件并提取颜色数据 的相关文章

  • 图像分析-光纤识别

    我是图像分析新手 您知道如何以仅获取纤维的方式对该图像进行二值化吗 我尝试过不同的阈值技术等 但没有成功 我不介意应该使用什么工具 但我更喜欢 NET or Matlab PS 我不知道该把答案放在哪里 所以我把它放在StackOverfl
  • 如何将条形图的 XtickLabels 向左移动?

    我目前正在尝试创建频率直方图 为此 我必须创建一个条形图 条形图之间没有空格 然而 这集中于XTickLabels在酒吧的中间 由于它是一个直方图 我希望数值位于每个条形之间的线上 以便它可以直观地指示间隔 本质上 我需要将所有刻度标签移至
  • 如何在Matlab中自定义轮廓线?

    我正在准备一个等高线图 我应该在其中突出显示特定级别的等高线 例如 我的轮廓线值位于 1 和 1 之间 我想突出显示与值 0 相对应的线 我尝试使用以下过程来执行此操作 M c contourf longitude latitude del
  • 在 MATLAB 中使用 FFT 的频率响应

    这是场景 使用频谱分析仪 我有输入值和输出值 样本数是32000采样率为2000样本 秒 输入是正弦波50 hz 输入为电流 输出为压力 单位 psi 我如何使用 MATLAB 根据这些数据计算频率响应 使用 MATLAB 中的 FFT 函
  • 两个 y 轴与相同的 x 轴[重复]

    这个问题在这里已经有答案了 可能的重复 在单个图中绘制 4 条曲线 具有 3 个 y 轴 https stackoverflow com questions 1719048 plotting 4 curves in a single plo
  • Matlab中转换数据类型的有效方法(double vs. im2double)

    我想将真彩色图像转换为双精度 据我所知有两种方法可以做到这一点 double rgb img im2double rgb img 哪一种效率更高 谢谢 他们都是不同的 im2double将图像的范围转换为0 1如果数据类型是uint8 or
  • MATLAB - 如何将子图一起缩放?

    我在一张图中有多个子图 每个图的 X 轴是相同的变量 时间 每个图上的 Y 轴都不同 无论是它所代表的内容还是数据的大小 我想要一种同时放大所有图的时间尺度的方法 理想情况下 可以在其中一张图上使用矩形缩放工具 并让其他图相应地更改其 X
  • 句柄类和值类的区别

    我有一些 C 背景 想使用 Matlab 中的类 句柄和值类有什么区别 我知道如果我想定义一个带有重载运算符 例如 和 的矩阵类 我会使用值类 然而 有时 当我选择一个手柄类时 事情似乎只对我有用 MathWorks 提供了一些有关其用途的
  • Matlab:保存后翻转图例顺序和图例重叠图

    我正在尝试根据以下内容反转我的图例条目顺序matlab条形图中图例颜色的逆序 https stackoverflow com questions 31178005 reverse ordering of legend colors in m
  • 在 MATLAB 中重命名文件

    我正在尝试以编程方式重命名工作目录中的文件a temp txt to b hello txt 您建议如何这样做 MATLAB中有一个简单的文件重命名函数吗 我认为您正在寻找 MOVEFILE
  • 如何找到在matlab中重复的矩阵的每一行的索引?

    我想找到矩阵中所有有重复项的行的索引 例如 A 1 2 3 4 1 2 3 4 2 3 4 5 1 2 3 4 6 5 4 3 要返回的向量将是 1 2 4 很多类似的问题建议使用unique函数 我已经尝试过 但我能得到的最接近我想要的功
  • 如何在 Matlab 中对数组应用低通或高通滤波器?

    有没有一种简单的方法可以将低通或高通滤波器应用于 MATLAB 中的数组 我对 MATLAB 的强大功能 或数学的复杂性 有点不知所措 需要一个简单的函数或一些指导 因为我无法从文档或网络搜索中找到答案 看着那 这filter http w
  • 什么是 ANN 中的纪元以及它如何转换为 MATLAB 中的代码?

    我试图理解 并可视化 训练人工神经网络的时代到底是什么 我们有一个包含约 7000 个产品的训练集 其中有 10 个特征 输入 这些产品必须根据这 10 个输入分为 7 个类别 我们的 ANN 有 10 个输入 这些输入进入由 10 个神经
  • MATLAB 教程中的 SIFT 实现

    我正在寻找 MATLAB 中的一些基本 SIFT 实现 我需要从第一原则来写它 另外 我正在寻找一些可以解释程序中发生的事情的内容 Vedali 的代码和 David Lowe 的代码超出了我的理解范围 如果您是 Matlab 用户 您一定
  • 使用符号求解器仅求解某些变量

    我正在尝试在 MATLAB 中求解包含 3 个变量和 5 个常量的方程组 是否可以使用solve求解三个变量 同时保持常量为符号而不用数值替换它们 当您使用SOLVE http www mathworks com access helpde
  • 如何找到平面和 3d 矩阵之间的交平面

    如果我有一堆图像并且尺寸如下 size M 256 256 124 我有 3 个点 它们的坐标是 coor a 100 100 124 coor b 256 156 0 coor c 156 256 0 如何创建 M 与这 3 个点定义的平
  • MATLAB - 冲浪图数据结构

    我用两种不同的方法进行了计算 对于这些计算 我改变了 2 个参数 x 和 y 最后 我计算了每种变体的两种方法之间的 误差 现在我想根据结果创建 3D 曲面图 x gt on x axis y gt on y axis Error gt o
  • 如何在 MATLAB 中绘制 3D 曲面图?

    我有一个像这样的数据集 0 1 0 2 0 3 0 4 1 10 11 12 13 2 11 12 13 14 3 12 13 14 15 4 13 14 15 16 我想在 matlab 中绘制 3D 曲面图 使列标题位于 y 轴 行标题
  • 有效地绘制大时间序列(matplotlib)

    我正在尝试使用 matplotlib 在同一轴上绘制三个时间序列 每个时间序列有 10 6 个数据点 虽然生成图形没有问题 但 PDF 输出很大 在查看器中打开速度非常慢 除了以栅格化格式工作或仅绘制时间序列的子集之外 还有其他方法可以获得
  • “Desort”向量(撤消排序)

    在Matlab中 sort返回排序后的向量和索引向量 显示哪个向量元素已移动到以下位置 v ix sort u Here v是一个包含所有元素的向量u 但已排序 ix是一个向量 显示每个元素的原始位置v in u 使用 Matlab 的语法

随机推荐

  • elasticsearch 配置 之 discovery.zen.ping.unicast.hosts

    discovery zen ping unicast hosts 192 168 1 12 192 168 1 12 9201 192 168 1 12 9202 192 168 1 13 192 168 1 14 注 端口非9200的节点
  • C语言的运算符及优先级

    C语言的运算符包括单目运算符 双目运算符 三目运算符 优先级如下 第1优先级 各种括括号 如 等 成员运算符 第2优先级 所有单目运算符 如 等 第3优先级 算数运算符 乘法运算符 除法运算符 求余运算符 第4优先级 算数运算符 加法运算符
  • githubC++ 技术方向基础知识总结

    简介 面向 C C 技术方向校招求职者 初学者的基础知识总结 包括语言 程序库 数据结构 算法 系统 网络 链接装载库等知识及面试经验 招聘 内推等信息 github 传送门
  • spring学习笔记(十二)Spring注入内部Bean

    Java 中在类内部定义的类称为内部类 同理在 Bean 中定义的 Bean 称为内部 Bean 注入内部 Bean 使用
  • 带你深入了解NPM——NPM初学者指南

    前段时间 我们邀请了我们 城内 葡萄城 资深开发工程师刘涛为大家分享了一次干货满满的关于Electron线上公开课 在课程过程中有不少同学对于NPM的概念和用法有一些疑问 所以这次我们希望通过这篇文章来解答各位同学的问题 另外在介绍的基础上
  • 2021-11-09

    今天是我写博客的第一天 在这里我想先说一说的对于C语言的看法以及我对于我自己的看法 开通这个博客 最主要的是为了记录我对于C语言学习的不断进步过程以及积累过程 我深知想要学好一门一门新的学科是很艰难的 但是我也知道C语言对于现代发展又是及其
  • uniapp 使用echarts

    uniapp 如何使用 echarts 图标 1 引入 文件 主要这三个文件 2 在使用到的页面 注册使用 3 html 结构 ec 对应绑定的是 data 中的 ec 效果图 全部代码
  • STM32 RT-Thread 系统分析(3)-线程管理之线程切换(系统移植基础篇二)

    线程管理之线程切换 前言 基本信息 前言说明 rt hw context switch to 函数 关键代码分析 还原MSP值 复位序列 LDR r0 SCB VTOR LDR r0 r0 startup stm32f103xg S文件内容
  • 面向对象的设计思想

    面向对象的设计思想 OO思想 Object Oriented 1 看到一个需求的时候不应该直接写代码 应该先考虑有哪些类 2 考虑类的时候 类一定是一类事务的描述 不能太局限 3 考虑类的时候需要考虑主要的类 也就是需要和业务 动作 事件紧
  • 编写程序,对输入的一个整数,按相反顺序输出该数。例如,输入为 3578, 输出为 8753。...

    编写程序 对输入的一个整数 按相反顺序输出该数 例如 输入为 3578 输出为 8753 package HomeWork08 import java util Scanner public class HomeWork08 public
  • NIFI使用InvokeHTTP发送http请求

    说明 这里介绍四种平时常用的http请求方法 GET POST PUT DELETE 在官方的介绍文档中关于InvokeHTTP处理器的描述是这么说的 An HTTP client processor which can interact
  • HDU - 1020 Encoding

    Given a string containing only A Z we could encode it using the following method Each sub string containing k same chara
  • IDEA 安装插件IDE Eval Reset

    IDE Eval Reset是什么 idea eval reset是Jetbrains的插件 官方良心产品 会允许我们试用30天 可以借此重新刷新idea正版程序的使用期限 哈哈哈 爽到没朋友 具体操作 1 点击intelliJ IDEA
  • [开源协议]58种开源协议及分类

    转载自 http www opensource org licenses alphabetical 更多关于具体协议内容请看其链接 Licenses that are popular and widely used or with stro
  • Linux、Ubuntu下安装yaml, 关于Import Error: No module named yaml

    pip install pyyaml 如果不行的话 就 conda install yaml 最后 gt gt gt import yaml 没有报错就成功了
  • mingw64镜像网站

    mingw64镜像网站 http files 1f0 de mingw
  • UIBOT的简单使用

    最近项目上使用到一个新的技术软件 刚一阶段使用结束 用来记录下 首先我们了解下UIbot 这里我直接放上下载社区版本的官方地址 来也科技RPA AI智能自动化平台 助力政企实现智能时代的人机协同 首先需要用邮箱注册 然后直接安装社区版本 这
  • 【毕设教程】FCM模糊聚类算法

    文章目录 0 前言 1 如何理解模糊聚类 2 模糊C means聚类算法 3 FCM算法原理 4 Python FCM支持 4 1 安装相关库 4 2 skfuzzy cmeans函数说明 4 3 代码实现 4 4 运行结果 5 FCM算法
  • C++stringstream的简单介绍以及使用

    在C语言中 如果想要将一个整形变量的数据转化为字符串格式可以使用以下两种方式 1 itoa 函数 2sprint 函数 但是两个函数在转化时 都得需要先给出保存结果的空间 那空间要给多大呢 就不太好界定 而且转化格式不匹配时 可能还会得到错
  • matlab打开视频文件并提取颜色数据

    目标 实现加载任意视频文件 并按帧取指定图像区域的某颜色值代表该区域的颜色值 1 加载视频文件 加载视频文件使用函数VideoReader 输入为文件夹路径 返回为一个VideoReader对象 具体使用方法见创建对象以读取视频文件 MAT