(OpenCV) 基础demo

文章目录

  • 前言
  • Demo
    • 图片
    • 录制
    • 播放
    • 人脸识别
  • END

前言

OpenCV - Open Computer Vision Library

OpenCV的名声想必不用多说了。

本文介绍4个基础使用demo。分别为,显示图片,录制视频,播放视频和一个基于开源算法库的人脸识别小demo。

只要环境配好,修改一下目标的资源就可以直接运行。

Demo

图片

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

void cv_image() {
    /// 资源路径
    const char *const resPath = "./myLogo.jpg";
    /// 打开图片的窗口名称
    const char *const windowName = "image-test";
    /// 窗口延时时间 毫秒
    const int windowDelayTime = 5000;

    cv::Mat img = cv::imread(resPath);
    if (img.empty()) {
        std::cout << "image is empty" << std::endl;
        return ;
    }
    
    /// 设置窗口名称和自适应
    cv::namedWindow(windowName, cv::WINDOW_AUTOSIZE);
    /// 将图片与窗口绑定
    cv::imshow(windowName, img);
    /// 等待键盘输入 or 延时
    cv::waitKey(windowDelayTime);
    /// 销毁窗口
    cv::destroyWindow(windowName);
}

录制

注意,这里的有部分参数会根据OpenCV3,4的版本问题而有一定差异。

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

void cv_recordVideo() {
    const char *const save_path = "./test.avi";

    const char *const windowName = "camera-test";
    const int waitKeyTime = 10;

    /// 设备的cameraID,一般笔记本自带的就是id=0
    int camera_id = 0;

    cv::VideoCapture cap;
    if (false == cap.open(camera_id)) {
        std::cout << "camera open failed!" << std::endl;
        return;
    }

    /// 视频的长宽
    const int width = cap.get(cv::CAP_PROP_FRAME_WIDTH);
    const int height = cap.get(cv::CAP_PROP_FRAME_HEIGHT);

    /// 1. 路径
    /// 2. 编码格式
    /// 3. 帧率
    /// 4. 尺寸
    cv::VideoWriter output_video;
    //! 第二个参数,在opencv3,4不同
#if CV_VERSION_MAJOR >= 4
    auto fourcc = cv::VideoWriter::fourcc('M', 'J', 'P', 'G');
#else
    auto fourcc = CV_FOURCC('M', 'J', 'P', 'G'),
#endif
    output_video.open(save_path, fourcc, 30.0, cv::Size(width, height));

    for (cv::Mat frame;;) {
        cap >> frame;
        if (frame.empty()) {
            break;
        }

        cv::imshow(windowName, frame);
        /// 保存
        output_video.write(frame);
        
		/// 按下esc键退出
        if (27 == cv::waitKey(waitKeyTime)) {
            break;
        }
    } // while (1)
}

播放

注意,因为音视频各种编解码问题,此函数这样的写法并不能让所有的视频文件都能正常解析。

但至少保证,上面一个demo录制下来的视频可以播放。

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

void cv_showVideo() {
    const char *const resPath = "./test.avi";
    
    const char *const windowName = "video-test";
    const int windowDelayTime = 200;

    cv::VideoCapture cap;
    /// 根据当前pc对该文件的解码能力而定
    if (false == cap.open(resPath)) {
        std::cout << "open failed!" << std::endl;
        return;
    }

    cv::namedWindow(windowName, cv::WINDOW_AUTOSIZE);

    /// 视频的本质就是一张张的图片
    for (cv::Mat frame;;) {
        cap >> frame;
        /// 播放完毕
        if (frame.empty()) {
            break;
        }
        cv::imshow(windowName, frame);

        /// 按下esc键退出
        if (27 == cv::waitKey(windowDelayTime)) {
            break;
        }
    } // while (1)
}

人脸识别

开源人脸识别算法库:opencv/data/haarcascades/haarcascade_frontalface_alt.xml at master · opencv/opencv · GitHub

opencv/data/haarcascades at master · opencv/opencv · GitHub

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

void cv_faceRecognition() {
    const char *const windowName = "camera-test";
    const int waitKeyTime = 10;

    /// opencv 的一个开源人脸识别库
    const char *const face_model_path = "./haarcascade_frontalface_alt.xml";
    /// 设备的cameraID,一般笔记本自带的就是id=0
    int camera_id = 0;

    /// 加载算法文件
    cv::CascadeClassifier face_model;
    if (false == face_model.load(face_model_path)) {
        std::cout << "face_model load failed!\n" << std::endl;
        return;
    }

    cv::VideoCapture cap;
    if (false == cap.open(camera_id)) {
        std::cout << "camera open failed!" << std::endl;
        return;
    }

    for (cv::Mat frame;;) {
        cap >> frame;
        if (frame.empty()) {
            break;
        }

        std::vector<cv::Rect> faces;
        face_model.detectMultiScale(frame, faces, 1.1, 2,
                                    0 | cv::CASCADE_SCALE_IMAGE,
                                    cv::Size(30, 30));
		/// 绘制人脸
        for (size_t i = 0; i < faces.size(); i++) {
            /// 点坐标
            cv::Point center(faces[i].x + faces[i].width / 2,
                             faces[i].y + faces[i].height / 2);
            /// 画图
            ellipse(frame, center,
                    cv::Size(faces[i].width / 2, faces[i].height / 2), 0, 0,
                    360, cv::Scalar(255, 0, 255), 4, 8, 0);
        }

        cv::imshow(windowName, frame);

        /// 按下esc键退出
        if (27 == cv::waitKey(waitKeyTime)) {
            break;
        }
    } // while (1)
}



END

参考资料:

CMake编译OpenCV: Qt配置OpenCV教程,亲测已试过(详细版)_Wi~的博客-CSDN博客

demo: c++ opencv 显示摄像头-人脸检测_哔哩哔哩_bilibili

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

利用Django路由项的别名(name)对路由进行反向解析

在Django的函数path()中&#xff0c;可以给一条路由进行命名&#xff0c;然后在视图函数或模板HTML文件中进行调用&#xff0c;这样的好处是&#xff1a;只要路由的name不变&#xff0c;那么修改了URL具体的路由&#xff0c;也不用去更改视图函数或模板HTML中的相关代码&#x…

LNMP服务搭建

目录 一、安装Nginx 1.关闭防火墙和安全机制 2.安装依赖包 3.创建运行用户 4.编译安装并安装 5.优化路径 6. 添加 Nginx 系统服务 7.赋权并重启服务 二、安装Mysql数据库 1、安装Mysql环境依赖包 2.创建运行用户 3.编译安装 4.修改mysql 配置文件 5.更改mysql安装目录和…

Linux服务器同步Windows目录同步-rsync

前言 最近需要&#xff0c;Linux的服务器同步Windows的一个目录。查了下&#xff0c;大概有三种方法&#xff1a;网盘同步&#xff1b;rsync同步&#xff1b;挂载目录。 网盘同步&#xff0c;可以选择搭建一个Nextcloud 。但是问题在于&#xff0c;我需要的是&#xff0c;客户…

前端开发两年半,我裸辞了

☀️ 前言 一晃两年半过去了&#xff0c;我离开了我的第一份前端开发工作&#xff0c;当你看到这篇文章&#xff0c;我已经离职两个月了&#xff0c;目前仍在艰难求职中&#xff0c;想记录分享一下我的经历&#xff0c;感兴趣的可以继续往下看&#xff0c;希望能给大家一些启示…

Objective-C 混用UITabBar与UINavigation

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 混用UITabBar与UINavigation做app&#xff0c;tab和nav&#xff0c;有时候显示有时候…

03 Web全栈 浏览器内置对象/事件/ajax

浏览器是一个JS的运行时环境&#xff0c;它基于JS解析器的同时&#xff0c;增加了许多环境相关的内容&#xff0c;用一张图表示各个运行环境和JS解析器的关系如下&#xff1a; 我们把常见的&#xff0c;能够用JS这门语言控制的内容称为一个JS的运行环境&#xff0c;常见的运行环…

专业科普:什么是单片机?

一、什么是单片机 单片机诞生于20世纪70年代末&#xff0c;它是指一个集成在一块芯片上的完整计算机系统。单片机具有一个完整计算机所需要的大部分部件&#xff1a;CPU、内存、内部和外部总线系统&#xff0c;目前大部分还会具有外存。同时集成诸如通讯接口、定时器&#xff…

Edge浏览器可以多开吗?

问答链接&#xff1a;Edge浏览器可以多开吗&#xff1f; 可以。 如果你的edge浏览器是默认路径安装的&#xff0c;那么打开命令提示符窗口输入以下两条命令即可启动一个数据完全隔离的edge浏览器。 mkdir C:\logs001 "C:\Program Files (x86)\Microsoft\Edge\Applicati…

【宝塔服务器】宝塔通过composer安装TP依赖

屡屡碰壁&#xff0c;安装一个项目&#xff0c;发现没有依赖&#xff0c;需要使用composer安装&#xff0c;没接触过&#xff0c;找了网上也没攻略&#xff0c;自己弄了后有以下问题&#xff0c;经过调整解决了&#xff1a; 报错1:没有安装fileinfo扩展 Loading composer rep…

Linux下RPM软件包管理

目录 1、软件包管理介绍1.1、软件包分类1.2、源码包1.3、RPM包 2、RPM包管理-包命名和依赖性2.1、RPM命名规则2.2、RPM包依赖性 3、RPM包管理-安装升级和与卸载3.1、包全名与包名3.2、RPM安装3.3、RPM包升级3.4、卸载 4、RPM包管理-查询4.1、查询是否安装4.2、查询软件包详细信…

Java集合相关问题

java集合框架体系 数据结构 算法复杂度分析 时间复杂度分析&#xff1a;对代码运行时间所消耗时间多少进行分析空间复杂度分析&#xff1a;对代码运行所占用的内存的大小进行分析 时间复杂度 时间复杂度分析&#xff1a;来评估代码的执行耗时 假如执行每行代码的执行耗时一…

阿里云服务器ping不通如何解决?

阿里云服务器ping不通&#xff1f;什么原因&#xff1f;在安全组中允许【全部 ICMP(IPv4)】&#xff0c;当然阿里云服务器禁ping也是通过配置安全组的ICMP规则来实现的&#xff0c;阿里云服务器网来详细说下安全组开通ping功能教程&#xff1a; 目录 阿里云服务器ping不通的解…

微服务: sleuth和zipkin的用处与zipkin安装使用(下)

目录 0. 上篇传送门: 1. 前言简介 mq安装传送门: 微服务: 01-rabbitmq的应用场景及安装(docker) 1.1 Sleuth是一款分布式跟踪解决方案。 1.2 Zipkin是一个开源的分布式跟踪系统。 2. zipkin安装方式 2.1 windows下安装zipkin: 2.1.0 下载jar包位置 2.1.1 下载后,找…

华为防火墙之NAT技术

1.源NAT 源NAT技术对IP报文的源地址进行转换&#xff0c;将私网IP地址转换成公网IP地址&#xff0c;使大量私网用户可以利用少量公网IP地址访问Internet&#xff0c;大大减少了对公网IP地址的消耗。 源NAT转换的过程如下图所示&#xff0c;当私网用户访问Internet的报文到达防…

银河麒麟系统安装mysql数据库[mysql-5.7.28-linux-glibc2.12-x86_64]

银河麒麟系统安装mysql数据库 1.1 准备材料 mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz MySQL5.7下载地址 https://cdn.mysql.com/archives/mysql-5.7/mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz 1.1 安装前准备工作 1、检查是否已经安装MySQL [rootlocalhost ~]# rpm …

redismariadb + keepalived 高可用

目录 机器准备 安装后服务 redis 安装redis mariadb 安装mariadb 启动和配置 互为主从同步配置 keepalived keepalived安装 修改主从 keepalived的配置 主从配置-mariadb监控 主从配置-redis监控 查看和使用 Keepalived Mariadb redis 机器准备 两台机器&…

transformer零基础学习

声明&#xff1a;以下文章链接仅用于个人学习与备忘。 基础知识 1&#xff1a;零基础解析教程 [推荐] https://zhuanlan.zhihu.com/p/609271490 2&#xff1a;Transformer 详解 [推荐] https://wmathor.com/index.php/archives/1438/ 3&#xff1a;如何从浅入深理解transfor…

行为型模式--状态模式

目录 举例 状态模式 定义 结构 代码实现 优缺点 优点&#xff1a; 缺点&#xff1a; 使用场景 举例 【例】通过按钮来控制一个电梯的状态&#xff0c;一个电梯有开门状态&#xff0c;关门状态&#xff0c;停止状态&#xff0c;运行状态。每一 种状态改变&#xff0c;都…

STM32外设系列—BH1750

文章目录 一、BH1750简介二、BH1750原理图三、BH1750数据手册3.1 指令集3.2 IIC通信读/写 四、BH1750程序设计4.1 IIC程序4.2 BH1750初始化程序4.3 读取BH1750测量结果4.4 获取光照强度4.5 相关宏定义 五、应用实例六、拓展应用6.1 实时调节LED亮度6.2 实时调整颜色阈值 一、BH…

C++【位图/布隆过滤器—海量数据处理】

文章目录 一、位图&#xff08;1&#xff09;位图概念介绍&#xff08;2&#xff09;简单模拟实现&#xff08;3&#xff09;位图应用 二、布隆过滤器&#xff08;1&#xff09;关于布隆过滤器概念及介绍&#xff08;2&#xff09;布隆过滤器的使用场景&#xff08;3&#xff0…
最新文章