OpenCV分析tfboys十周年演唱会灯牌大战结果

news2025/1/18 17:27:47

前言

在Android音视频开发中,网上知识点过于零碎,自学起来难度非常大,不过音视频大牛Jhuster提出了《Android 音视频从入门到提高 - 任务列表》,结合我自己的工作学习经历,我准备写一个音视频系列blog。本文是音视频系列blog的其中一个, 也是OpenCV的一个入门blog。对应的要学习的内容是:OpenCV分析tfboys十周年演唱会灯牌大战结果(仅供学习,帝国姐妹不要讨伐我啊!!!)。


音视频系列blog

音视频系列blog: 点击此处跳转查看


目录

在这里插入图片描述


1 效果图

话不多说,先上效果图!(源代码在文章最后)
演唱会灯牌大战效果图:
在这里插入图片描述
分析结果:
在这里插入图片描述


2 OpenCV配置

OpenCV是一个开源计算机视觉与图像处理库,同时也提供了丰富的音视频处理功能,它可以用于处理、分析和操作图像、视频以及音频数据。

2.1 下载OpenCV

OpenCV下载地址:https://opencv.org/releases/,可以根据自己的电脑的配置下载合适的OpenCV,我下载的是opencv-3.4.2-vc14_vc15.exe,双击该文件进行安装。
我已经默认你们装了vs2017或者其他版本。


2.2 配置OpenCV环境变量

将 OpenCV 配置到 Windows 环境变量中,可以在任何位置轻松访问 OpenCV 库和工具。以下是将 OpenCV 配置为 Windows 环境变量的步骤:

  1. 找到 OpenCV 安装路径:

    • 在安装路径中找到D:\opencv\opencv\build\x64\vc15\bin(vs2015以前的版本以及vs2015找到vc14,我的是vs2017,所以选择vc15)。
  2. 添加系统环境变量:

    • 在 Windows 搜索栏中搜索 “环境变量”,并选择 “编辑系统环境变量”。
    • 在弹出的 “系统属性” 窗口中,点击 “环境变量” 按钮。
    • 在 “环境变量” 窗口的 “系统变量” 部分,找到 “Path” 变量,然后点击 “编辑”。
  3. 添加 OpenCV 路径:

    • 将D:\opencv\opencv\build\x64\vc15\bin添加在"Path" 变量的最后
    • 确保每个路径之间使用分号进行分隔。
  4. 保存更改:

    • 点击 “确定” 保存您所做的更改。
    • 在打开的窗口中,继续点击 “确定” 以关闭系统属性窗口。

2.3 项目中配置OpenCV

新建 Visual Studio 2017 项目:
打开 Visual Studio 2017,创建一个新的 C++ 项目。

配置项目属性:

  • 右键点击项目,在上下文菜单中选择“属性”。

  • 在属性对话框中,选择“VC++ 目录”。

  • 在“包含目录”项中,添加 OpenCV 的 include 目录的路径,我的是 D:\opencv\opencv\build\include
    在这里插入图片描述

  • 在“库目录”项中,添加 OpenCV 的 lib 目录的路径,我的是 D:\opencv\opencv\build\x64\vc15\lib
    在这里插入图片描述

链接 OpenCV 库:

  • 在属性对话框中,选择“链接器” -> “输入”。
  • 在“附加依赖项”项中,添加以下库文件:
    • opencv_worldxxx.lib,这里的 “xxx” 表示 OpenCV 的版本号。例如,如果下载的是 OpenCV 3.4.2,那么对应的库文件就是 opencv_world342.lib。
      在这里插入图片描述
  1. 修改平台:
    将vs2017平台改为x64。
    在这里插入图片描述

完成以上步骤后,项目应该能够成功地链接和使用 OpenCV 库了。可以在项目中编写和运行 OpenCV 相关的代码。


3 代码分析

先准备一张图片,比如灯牌大战.jpg放在D盘,或者其他地方。

代码整体思路:采用遍历图像的每个像素,根据人眼感知的颜色范围判断像素是否为肉眼可见的颜色,然后计算占比并输出结果。

下面是代码的步骤:

  1. 导入库:

    #include <opencv2/opencv.hpp>
    #include <iostream>
    

    这部分代码导入了 OpenCV 库和 C++ 的输入输出流库。

  2. 主函数:

    int main() {
        // 读取图像
        cv::Mat image = cv::imread("D:\\灯牌大战.jpg");
    
        if (image.empty()) {
            std::cout << "Error loading image." << std::endl;
            return -1;
        }
    

    在主函数中,首先使用 OpenCV 的 imread 函数读取一张图像。如果图像读取失败,将输出错误信息并返回 -1。

  3. 计算颜色占比:

        // 计算每个颜色通道的像素数
        int totalPixels = image.rows * image.cols;
    
        int visibleBluePixels = 0;
        int visibleGreenPixels = 0;
        int visibleRedPixels = 0;
    
        // 遍历图像像素,计算肉眼可见的颜色占比
        for (int row = 0; row < image.rows; ++row) {
            for (int col = 0; col < image.cols; ++col) {
                cv::Vec3b pixel = image.at<cv::Vec3b>(row, col);
    
                // 根据人眼感知的颜色范围,判断像素是否为肉眼可见的颜色
                if (pixel[2] > 50 && pixel[2] > pixel[1] && pixel[2] > pixel[0]) {  // 判断红色
                    visibleRedPixels++;
                } else if (pixel[1] > 50 && pixel[1] > pixel[0] && pixel[1] > pixel[2]) {  // 判断绿色
                    visibleGreenPixels++;
                } else if (pixel[0] > 50 && pixel[0] > pixel[1] && pixel[0] > pixel[2]) {  // 判断蓝色
                    visibleBluePixels++;
                }
            }
        }
    

    这部分代码计算图像中每个颜色通道的像素数,并使用嵌套循环遍历图像的每个像素。对于每个像素,它会根据人眼感知的颜色范围判断是否为肉眼可见的颜色,然后将相应的计数器增加。

  4. 计算占比并输出结果:

              // 计算占比
        double visibleBluePercentage = static_cast<double>(visibleBluePixels) / totalPixels * 100;
        double visibleGreenPercentage = static_cast<double>(visibleGreenPixels) / totalPixels * 100;
        double visibleRedPercentage = static_cast<double>(visibleRedPixels) / totalPixels * 100;
    
        // 打印结果
        std::cout << "易烊千玺(红色): " << visibleRedPercentage << "%" << std::endl;
        std::cout << "王俊凯(蓝色): " << std::fixed << std::setprecision(2) << visibleBluePercentage << "%" << std::endl;
        std::cout << "王源(绿色): " << visibleGreenPercentage << "%" << std::endl;
    
        return 0;
    }
    

    这部分代码计算肉眼可见的蓝色、绿色和红色的占比,然后输出结果到标准输出。

总结来说,这段代码读取一张图像,遍历图像中的每个像素,根据人眼感知的颜色范围判断像素是否为肉眼可见的颜色,然后计算占比并输出结果。效果图在最上面。


4 源代码

源代码:(欢迎star)
OpenCV分析tfboys十周年演唱会灯牌大战结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/884298.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【代码质量】认知复杂度(COGNITIVE COMPLEXITY)一种衡量可理解性的新方法

白皮书地址 摘要&#xff1a;圈复杂度最初是作为“可测试性和模块控制流的“可维护性”。虽然它擅长于衡量前者&#xff0c;但它的数学模型不能产生一个令人满意的值来衡量后者。本文描述一种打破数学度量模型的新度量模型来评估代码&#xff0c;以弥补圈复杂度的缺点&#xf…

【科研论文配图绘制】task1 掌握科研绘图的基本知识

【科研论文配图绘制】task1 掌握科研绘图的基本知识 写在最前 8月份Datawhale组队学习&#xff0c;写下该博客记录学习内容 1.科研论文配图的分类与构成 2.科研论文配图的格式和尺寸 3.科研论文配图中的字体和字号设置 4.科研论文配图的版式设计、结构布局和颜色搭配 占个…

【校招VIP】CSS校招考点之选择器优先级

考点介绍&#xff1a; 选择器是CSS的基础&#xff0c;也是校招中的高频考点&#xff0c;特别是复合选择器的执行优先级&#xff0c;同时也是实战中样式不生效的跟踪依据。 因为选择器的种类较多&#xff0c;很难直接记忆&#xff0c;可以考虑选择一个相对值&#xff0c;比如id类…

day4 IO模型

IO多路复用 1.select函数 服务器&#xff1a; 客户端 poll函数 客户端&#xff1a;

《Java-SE-第三十八章》之注解

前言 在你立足处深挖下去,就会有泉水涌出!别管蒙昧者们叫嚷:“下边永远是地狱!” 博客主页&#xff1a;KC老衲爱尼姑的博客主页 博主的github&#xff0c;平常所写代码皆在于此 共勉&#xff1a;talk is cheap, show me the code 作者是爪哇岛的新手&#xff0c;水平很有限&…

每日记--前端解决方案--el-select下拉样式-el-option内容过长-鼠标悬停到文字不修改光标样式-设置透明

文章目录 el-select下拉样式el-select中el-option内容过长解决办法鼠标悬停到文字不修改光标样式设置透明 el-select下拉样式 element-ui自带样式设置popper-class el-select中el-option内容过长解决办法 问题&#xff1a;像这样选项太长了&#xff0c;不好看 解决&#xf…

关于Linux文件系统只读问题的修改笔记

1.问题 2. 原因 系统异常关机或者代码修改错误导致硬盘挂载出现问题开启只读模式&#xff0c;但是重启有时候可以解决。 3.解决方法 1. mount查看那个挂载的硬盘出现问题(ro标识只读) mount | grep ro2.找到硬盘&#xff0c;重新挂载即可 sudo mount -o remount,rw /sys/f…

半导体市场震荡,硅晶圆价格下修成焦点 | 百能云芯

半导体市场状况不容乐观&#xff0c;原本被半导体晶圆制造厂视为稳定业绩的长期合同开始面临松动。行业内传出&#xff0c;国内重要的晶圆代工大厂已向日本硅晶圆供应商提出要求降低明年合同价格的请求&#xff0c;以共同应对困境&#xff0c;双方目前正处于激烈的博弈中。鉴于…

测试相关Liunx基础知识

Linux的历史和安装 基本常识 Liunx目录结果 常见

1€滤波器(1 Euro Filter)使用介绍

怎么调整欧拉角x、y、z的抖动问题&#xff1f;

python+django+mysql项目实践四(信息修改+用户登陆)

python项目实践 环境说明: Pycharm 开发环境 Django 前端 MySQL 数据库 Navicat 数据库管理 用户信息修改 修改用户信息需要显示原内容,进行修改 通过url传递编号 urls views 修改内容需要用数据库的更新,用update进行更新,用filter进行选择 输入参数多nid,传递要修…

数据结构--有向⽆环图 描述表达式

数据结构–有向⽆环图 描述表达式 有向⽆环图 \color{red}有向⽆环图 有向⽆环图&#xff1a;若⼀个有向图中 不存在环 \color{red}不存在环 不存在环&#xff0c;则称为有向⽆环图&#xff0c;简称 D A G 图 \color{red}DAG图 DAG图&#xff08;Directed Acyclic Graph&#x…

2021年09月 C/C++(二级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题&#xff1a;字符统计 给定一个由a-z这26个字符组成的字符串&#xff0c;统计其中哪个字符出现的次数最多。 输入 输入包含一行&#xff0c;一个字符串&#xff0c;长度不超过1000。 输出 输出一行&#xff0c;包括出现次数最多的字符和该字符出现的次数&#xff0c;中间以…

autodock后的pdbqt文件怎么通过网站分析?

首先需要在pymol中打开这个docking后的分子 然后再打开受体&#xff0c; 注意&#xff1a;顺序不要反&#xff0c;顺序反了会导致网址分析错误 最后导出为pdb就可以了放在网站上用了 网址&#xff1a;https://plip-tool.biotec.tu-dresden.de/plip-web/plip/index

RK3568KK操作手册

一&#xff0e;烧录MCU 板子不用上电&#xff0c;接上烧录器 打开 HOPE3000 For e-Link 烧录软件。选择文件&#xff0c;选择要烧录的固件&#xff1a;HT66F2030.MTP 选择3V 点击下载&#xff0c; 点击所有 烧录成功如图所示&#xff1a; 二&#xff0e;接上电源&am…

什么是自动化测试?如何做自动化测试?

前面介绍了功能测试和接口测试&#xff0c;在介绍接口测试时提到了实现API自动化。那具体什么是自动化&#xff0c;为什么要做自动化&#xff0c;这里我们集中总结。 一. 什么是自动化&#xff1f; 顾名思义&#xff0c;自动化测试是相对人工测试而言的&#xff0c;它是指把人…

易云维®医院后勤一站式服务平台实现对医院人、物、设备进行信息化管理

传统后勤移动系统的缺陷 使用的门槛和成本高。在国内只有一些大医院开展及应用&#xff0c;由于传统移动运维系统需要定制软件、结合专用平板使用&#xff0c;导致整体项目价格昂贵&#xff0c;故一般采购医院配置的平板少&#xff0c;从而影响记录实时互动追踪的效果&#xf…

如何克服预测性维护中IT和OT的融合挑战?

预测性维护&#xff08;Predictive Maintenance&#xff0c;简称PdM&#xff09;在现代制造业中扮演着关键角色&#xff0c;通过实时数据分析和资产监控&#xff0c;帮助企业预测设备故障&#xff0c;优化维护计划&#xff0c;并提高生产效率。然而&#xff0c;PdM的成功实施面…

无法解析的外部符号cusolverDnCreate

问题&#xff1a; 无法解析的外部符号cusolverDnCreate 解决方案 那么就在启动项目-》属性-》连接器-》输入-》附加依赖项&#xff1a;加&#xff1a; cublas.lib cublas_device.lib cuda.lib cudadevrt.lib cudart.lib cudart_static.lib cufft.lib cufftw.lib curand.lib …

Flink 流式读写文件、文件夹

文章目录 一、flink 流式读取文件夹、文件二、flink 写入文件系统——StreamFileSink三、查看完整代码 一、flink 流式读取文件夹、文件 Apache Flink针对文件系统实现了一个可重置的source连接器&#xff0c;将文件看作流来读取数据。如下面的例子所示&#xff1a; StreamExe…