2 OpenCV 图像初步

首页




图像

/**
 * @author IYATT-yx
 * @date 2021/2/2
 * @brief 显示图片和保存图片
 */
#include "opencv2/opencv.hpp"

int main(int argc, char *argv[])
{
    if (argc > 2)
    {
        std::cout << "参数过多" << std::endl;
        exit(EXIT_FAILURE);
    }
    else if (argc < 2)
    {
        std::cout << "请指定要打开的图片的路径" << std::endl;
        exit(EXIT_FAILURE);
    }

    // 转存图片路径
    std::string name = argv[1];

    // 读取图片
    // 不指定标志参数,默认为三通倒BGR彩色图像
    cv::Mat img = cv::imread(name);
    // 检测图片是否正确打开
    if (img.empty())
    {
        std::cout << "请检查输入的图片路径是否存在" << std::endl;
        exit(EXIT_FAILURE);
    }

    // 显示图片
    // 参数分别为窗口名字和要显示的图像矩阵
    cv::imshow(name, img);
    // 在程序运行路径下将图片另存为 OpenCV.png
    cv::imwrite("OpenCV.png", img);

    // 显示窗口直到键盘按下才关闭
    cv::waitKey(0);
}

在这里插入图片描述





视频

    VideoWriter::fourcc('D', 'I', 'V', 'X') MPEG-4编码
    VideoWriter::fourcc('P', 'I', 'M', 1) MPRG-1编码
    VideoWriter::fourcc('M', 'J', 'P', 'G') JPEG编码
    VideoWriter::fourcc('M', 'P', '4', '2') MPEG-4.2编码
    VideoWriter::fourcc('D', 'I', 'V', '3') MPEG-4.3编码
    VideoWriter::fourcc('U', '2', '6', '3') H263编码
    VideoWriter::fourcc('I', '2', '6', '3') H2631编码
    VideoWriter::fourcc('F', 'L', 'V', '1') FLV1编码

/**
 * @author IYATT-yx
 * @date 2021/2/2
 * @brief 从相机捕捉视频并保存视频或者播放视频文件(及视频源链接)
 */
#include "opencv2/opencv.hpp"

// 如果捕捉摄像头视频,则参数指定 c
// 如果播放视频文件,则分别指定参数 f 和 要打开的文件名
int main(int argc, char *argv[])
{
    if (argc < 2 || argc > 3)
    {
        std::cout << "未指定参数或参数过多" << std::endl;
        exit(EXIT_FAILURE);
    }
    if (argc == 2)
    {
        std::string flag = argv[1];
        if (flag != "c")
        {
            std::cout << "参数错误" << std::endl;
            exit(EXIT_FAILURE);
        }
        
        // 构造VideoCapture对象
        // 可以使用命令 ls /dev/video* 查看本机的摄像头设备
        // 摄像头序号按 0, 1, 2 ...排, 可以直接指定.
        // 如果初始化设置 -1, 则默认使用最小的可用的摄像头
        cv::VideoCapture camera(-1);
        if (!camera.isOpened())
        {
            std::cout << "摄像头打开失败" << std::endl;
            exit(EXIT_FAILURE);
        }
        // 用于暂存视频中一帧图像的矩阵
        cv::Mat frame;
        // 获取一帧图像用于下面得到摄像头的分辨率
        camera >> frame;
        
        // 用于保存视频的对象
        // 保存的文件名, 编码类型指定, 帧率, 视频分辨率, 是否为彩色
        cv::VideoWriter saveVideo("camera.avi", cv::VideoWriter::fourcc('D', 'I', 'V', 'X'),
                                    25, frame.size(), frame.type() == CV_8UC3);
        if (!saveVideo.isOpened())
        {
            std::cout << "创建视频文件失败" << std::endl;
            // 释放摄像头
            camera.release();
            exit(EXIT_FAILURE);
        }

        // 循环从视频流中获取图片
        while (camera.read(frame))
        {
            // 显示图片
            cv::imshow("Camera", frame);
            // 保存视频
            saveVideo.write(frame);

            // 每张图片显示40ms (1000 / 40 = 25 FPS )
            // 同时按Esc键可退出
            if (cv::waitKey(40) == 27)
            {
                std::cout << "退出程序" << std::endl;
                break;
            }
        }

        // 释放
        camera.release();
        saveVideo.release();
    }
    else if (argc == 3)
    {
        std::string flag = argv[1];
        if (flag != "f")
        {
            std::cout << "参数错误" << std::endl;
            exit(EXIT_FAILURE);
        }
        std::string fileName = argv[2];

        // 读取视频文件(或 视频源链接)
        cv::VideoCapture videoFile(fileName);
        if (!videoFile.isOpened())
        {
            std::cerr << "视频文件打开失败" << std::endl;
            exit(EXIT_FAILURE);
        }
        cv::Mat frame;

        while (videoFile.read(frame))
        {
            cv::imshow("Video", frame);
            if (cv::waitKey(40) == 27)
            {
                std::cout << "退出程序" << std::endl;
                break;
            }
        }

        videoFile.release();
    }
}

摄像头
在这里插入图片描述

视频文件
在这里插入图片描述

视频源网址
在这里插入图片描述


绘图

/**
 * @author IYATT-yx
 * @date 2021/2/1
 * @brief 绘图
 */
#include "opencv2/opencv.hpp"

int main()
{
    // 创建背景画布
    // 行(y), 列(x), 类型, 颜色
    // Scalar(B, G, R)
    cv::Mat img = cv::Mat(500, 800, CV_8UC3, cv::Scalar(0, 0, 0));

    /**
     * @brief 画直线
     * 
     * @param . Mat矩阵
     * @param . 起点坐标 Point(x, y)
     * @param . 终点坐标
     * @param . 直线的颜色
     */
    cv::line(img, cv::Point(10, 20), cv::Point(600, 400), cv::Scalar(0, 255, 255));

    /**
     * @brief 画圆
     * 
     * @param . Mat矩阵
     * @param . 圆心坐标
     * @param . 半径,单位为像素
     * @param . 颜色
     */
    cv::circle(img, cv::Point(500, 250), 100, cv::Scalar(255, 0, 255));

    /**
     * @brief 画矩形
     * 
     * @param . 左上角坐标
     * @param . 右上角坐标
     * @param . 颜色
     */
    cv::rectangle(img, cv::Point(500, 250), cv::Point(700, 350), cv::Scalar(255, 255, 0));

    /**
     * @brief 画椭圆
     * 
     * @param . Mat矩阵
     * @param . 中心坐标
     * @param . 椭圆旋转角度 (角度制)
     * @param . 椭圆的起始角度
     * @param . 椭圆的终止角度
     */
    cv::ellipse(img, cv::Point(400, 250), cv::Size(350, 200), 0, 0, 360, cv::Scalar(255, 255, 255));

    /**
     * @brief 添加文字 (不支持中文, 添加中文可以使用 freetype (contrib模块))
     * 
     * @param . Mat矩阵
     * @param . 要添加的文字
     * @param . 字符串的左下角坐标
     * @param . 字体类型,记不住查官方文档就行
     * @param . 字体大小
     */
    cv::putText(img, "ALRR a-rounder.com IYATT-yx", cv::Point(100, 200), cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(0, 0, 255));

    cv::imshow("img", img);
    cv::waitKey(0);
}

在这里插入图片描述





画板

/**
 * @author IYATT-yx
 * @date 2021/2/1
 * @brief 画板
 */
#include "opencv2/opencv.hpp"

// 构建画布
cv::Mat img = cv::Mat(600, 900, CV_8UC3, cv::Scalar(255, 255, 255));
// 记录鼠标前一时刻的坐标
cv::Point prePoint;
// 画笔配色变量
int B = 0;
int G = 0;
int R = 0;


// 回调函数, 鼠标事件触发该函数进行绘图, 用到的标志可以查阅官方文档
void paint(int event, int x, int y, int flag, void *)
{
    // 单击右键
    if (event == cv::EVENT_RBUTTONDOWN)
    {
        std::cout << "点击鼠标左键才可以绘图" << std::endl;
    }
    // 单击鼠标左键
    else if (event == cv::EVENT_LBUTTONDOWN)
    {
        prePoint = cv::Point(x, y);
        std::cout << "起始点: " << prePoint << std::endl;
    }

    // 按住鼠标左键移动
    if (event == cv::EVENT_MOUSEMOVE && (flag & cv::EVENT_FLAG_LBUTTON))
    {
        cv::Point point(x, y);
        // 通过绘制直线(极短,高频)构成曲线
        cv::line(img, prePoint, point, cv::Scalar(B, G, R), 3);
        prePoint = point;
        imshow("Drawing board", img);
    }
}

int main()
{
    // 显示画布
    cv::imshow("Drawing board", img);
    // 创建调色版 (滑动条)
    cv::createTrackbar("B", "Drawing board", &B, 255);
    cv::createTrackbar("G", "Drawing board", &G, 255);
    cv::createTrackbar("R", "Drawing board", &R, 255);
    // 鼠标响应
    cv::setMouseCallback("Drawing board", paint);
    cv::waitKey(0);
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值