(OpenCV) 基础demo

前言

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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值