三、C++版本OpenCV的API使用

2023-12-26 17:54:44

1.前言

????????使用了python版本的opencv接口,现在使用c++版本的opencv,感觉接口还是挺熟悉的,写一下当做记录,为了熟悉一下api就没有使用cv的命名空间。

2.OpenCV-API使用

2.1图片的操作

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

// using namespace cv;
using namespace std;

int main() {
    // 读取图片
    cv::Mat image = cv::imread("1.jpg");


    // 检查图片是否成功加载
    if (image.empty()) {
        cout << "Error: Unable to read the image." << endl;
        return -1;
    }


    // 图片变灰度
    cv::Mat grayImage;
    cv::cvtColor(image, grayImage, cv::COLOR_BGR2GRAY);


    // 图片BGR转RGB
    cv::Mat rgbImage;
    cv::cvtColor(image, rgbImage, cv::COLOR_BGR2RGB);


    // 图片保存
    cv::imwrite("path/to/save/image.jpg", image);


    // 获取图片的宽和高
    int width = image.cols;
    int height = image.rows;
    cout << "Width: " << width << ", Height: " << height << endl;


    // 图片修改分辨率
    cv::resize(image, image, cv::Size(640, 480));
    cv::imshow("Resized Image", image);
    cv::waitKey(0);


    // (图片数据类型的介绍和转换
    cout << "Original Image Data Type: " << image.type() << endl;
    cv::Mat floatImage;
    image.convertTo(floatImage, CV_32F);
    cout << "Converted Image Data Type: " << floatImage.type() << endl;


    // 展示图片
    cv::imshow("Original Image", image);
    cv::waitKey(0);
}

2.2视频的操作

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

// using namespace cv;
using namespace std;

int main() 
{
    // 读取视频或者摄像头数据
    cv::VideoCapture cap("path/to/your/video.mp4");  // 或者使用摄像头,例如:VideoCapture cap(0);

    // 检查视频是否成功打开
    if (!cap.isOpened()) {
        cout << "Error: Unable to open the video source." << endl;
        return -1;
    }

    // 展示视频或者摄像头数据
    while (true) {
        cv::Mat frame;
        cap >> frame;

        // 如果成功读取帧
        if (!frame.empty()) {
            cv::imshow("Video", frame);

            // 按 'q' 键退出循环
            if (cv::waitKey(25) == 'q') {
                break;
            }
        } else {
            // 如果未能读取帧,说明已到达视频末尾,退出循环
            break;
        }
    }

    // 视频或者摄像头数据变灰度
    cv::VideoCapture cap2("path/to/your/video.mp4");  // 或者使用摄像头,例如:VideoCapture cap(0);

    // 检查视频是否成功打开
    if (!cap2.isOpened()) {
        cout << "Error: Unable to open the video source." << endl;
        return -1;
    }

    while (true) {
        cv::Mat frame;
        cap2 >> frame;

        // 如果成功读取帧
        if (!frame.empty()) {
            cv::cvtColor(frame, frame, cv::COLOR_BGR2GRAY);
            cv::imshow("Gray Video", frame);

            // 按 'q' 键退出循环
            if (cv::waitKey(25) == 'q') {
                break;
            }
        } else {
            // 如果未能读取帧,说明已到达视频末尾,退出循环
            break;
        }
    }

    // 视频或者摄像头数据的保存
    cv::VideoCapture cap3("path/to/your/video.mp4");  // 或者使用摄像头,例如:VideoCapture cap(0);

    // 检查视频是否成功打开
    if (!cap3.isOpened()) {
        cout << "Error: Unable to open the video source." << endl;
        return -1;
    }

    int frameWidth = cap3.get(cv::CAP_PROP_FRAME_WIDTH);
    int frameHeight = cap3.get(cv::CAP_PROP_FRAME_HEIGHT);
    cv::VideoWriter videoWriter("path/to/save/video.avi", cv::VideoWriter::fourcc('X', 'V', 'I', 'D'), 10,
                                cv::Size(frameWidth, frameHeight));

    while (true) {
        cv::Mat frame;
        cap3 >> frame;

        // 如果成功读取帧
        if (!frame.empty()) {
            videoWriter.write(frame);

            // 按 'q' 键退出循环
            if (cv::waitKey(25) == 'q') {
                break;
            }
        } else {
            // 如果未能读取帧,说明已到达视频末尾,退出循环
            break;
        }
    }

    // 获取视频或者摄像头数据的宽和高
    int videoWidth = cap.get(cv::CAP_PROP_FRAME_WIDTH);
    int videoHeight = cap.get(cv::CAP_PROP_FRAME_HEIGHT);
    cout << "Video Width: " << videoWidth << ", Video Height: " << videoHeight << endl;

    // 视频或者摄像头数据修改分辨率
    cv::VideoCapture cap4("path/to/your/video.mp4");  // 或者使用摄像头,例如:VideoCapture cap(0);

    // 检查视频是否成功打开
    if (!cap4.isOpened()) {
        cout << "Error: Unable to open the video source." << endl;
        return -1;
    }

    int newWidth = 640;
    int newHeight = 480;
    cv::VideoWriter videoWriter2("path/to/save/video_resized.avi", cv::VideoWriter::fourcc('X', 'V', 'I', 'D'), 10,
                                 cv::Size(newWidth, newHeight));

    while (true) {
        cv::Mat frame;
        cap4 >> frame;

        // 如果成功读取帧
        if (!frame.empty()) {
            cv::resize(frame, frame, cv::Size(newWidth, newHeight));
            videoWriter2.write(frame);

            // 按 'q' 键退出循环
            if (cv::waitKey(25) == 'q') {
                break;
            }
        } else {
            // 如果未能读取帧,说明已到达视频末尾,退出循环
            break;
        }
    }

    // 视频或者摄像头数据数据类型的介绍和转换
    int videoDataType = cap.get(cv::CAP_PROP_FORMAT);
    cout << "Video Data Type: " << videoDataType << endl;

    return -1;
     
}

文章来源:https://blog.csdn.net/weixin_43999691/article/details/135225835
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。