Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk menggunakan C++ untuk pemprosesan strim video dan analisis video yang cekap?

Bagaimana untuk menggunakan C++ untuk pemprosesan strim video dan analisis video yang cekap?

WBOY
WBOYasal
2023-08-25 21:40:442828semak imbas

Bagaimana untuk menggunakan C++ untuk pemprosesan strim video dan analisis video yang cekap?

Bagaimana menggunakan C++ untuk pemprosesan strim video dan analisis video yang cekap?

Abstrak: Dengan perkembangan pesat teknologi video, semakin banyak aplikasi memerlukan pemprosesan dan analisis video. Artikel ini akan memperkenalkan cara menggunakan bahasa C++ untuk pemprosesan strim video dan analisis video yang cekap, termasuk pemerolehan strim video, penyahkodan video, pengekodan video dan analisis video serta menyediakan contoh kod yang sepadan.

1. Pemerolehan strim video
Pemerolehan strim video ialah langkah pertama dalam pemprosesan video, yang terutamanya mendapatkan strim video daripada sumber seperti kamera, fail atau rangkaian. Dalam C++, anda boleh menggunakan perpustakaan OpenCV untuk pemerolehan strim video, yang mudah digunakan dan berkuasa.
Berikut ialah contoh kod yang menggunakan perpustakaan OpenCV untuk mendapatkan fail video tempatan:

#include <opencv2/opencv.hpp>

int main() {
    cv::VideoCapture cap("test.mp4");  // 打开本地视频文件
    if (!cap.isOpened()) {             // 检查文件是否成功打开
        std::cout << "Failed to open video file!" << std::endl;
        return -1;
    }

    cv::Mat frame;
    while (cap.read(frame)) {          // 读取每一帧画面
        cv::imshow("Video", frame);    // 显示视频
        cv::waitKey(1);
    }

    cap.release();                     // 释放资源

    return 0;
}

2. Penyahkodan video
Penyahkodan video adalah untuk menyahkod aliran video termampat ke dalam data bingkai video asal untuk pemprosesan dan analisis seterusnya. Dalam C++, anda boleh menggunakan perpustakaan FFmpeg untuk penyahkodan video, yang mempunyai sokongan meluas dan prestasi penyahkodan yang cekap.
Berikut ialah contoh kod yang menggunakan perpustakaan FFmpeg untuk menyahkod fail video dan mengeluarkan setiap bingkai:

extern "C" {
#include <libavformat/avformat.h>
#include <libswscale/swscale.h>
}

int main() {
    av_register_all();

    AVFormatContext* format_ctx = nullptr;
    if (avformat_open_input(&format_ctx, "test.mp4", nullptr, nullptr) != 0) {
        std::cout << "Failed to open video file!" << std::endl;
        return -1;
    }

    avformat_find_stream_info(format_ctx, nullptr);

    int video_stream_index = -1;
    for (int i = 0; i < format_ctx->nb_streams; i++) {
        if (format_ctx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
            video_stream_index = i;  // 找到视频流索引
            break;
        }
    }

    AVCodecParameters* codec_params = format_ctx->streams[video_stream_index]->codecpar;
    AVCodec* codec = avcodec_find_decoder(codec_params->codec_id);
    if (codec == nullptr) {
        std::cout << "Failed to find decoder!" << std::endl;
        return -1;
    }

    AVCodecContext* codec_ctx = avcodec_alloc_context3(codec);
    avcodec_parameters_to_context(codec_ctx, codec_params);
    avcodec_open2(codec_ctx, codec, nullptr);

    AVFrame* frame = av_frame_alloc();
    AVPacket packet;

    while (av_read_frame(format_ctx, &packet) >= 0) {
        if (packet.stream_index == video_stream_index) {
            avcodec_send_packet(codec_ctx, &packet);
            avcodec_receive_frame(codec_ctx, frame);

            // TODO: 处理每一帧画面
        }
        av_packet_unref(&packet);
    }

    av_frame_free(&frame);
    avcodec_free_context(&codec_ctx);
    avformat_close_input(&format_ctx);

    return 0;
}

3 Pengekodan video
Pengekodan video adalah untuk memampatkan data bingkai video yang diproses untuk penyimpanan dan penghantaran. Dalam C++, anda juga boleh menggunakan perpustakaan FFmpeg untuk pengekodan video untuk mencapai pemampatan dan pengekodan video yang cekap.
Berikut ialah contoh kod yang menggunakan perpustakaan FFmpeg untuk mengekod data bingkai video mentah ke dalam fail video dalam format H.264:

extern "C" {
#include <libavformat/avformat.h>
#include <libswscale/swscale.h>
#include <libavcodec/avcodec.h>
}

int main() {
    av_register_all();

    AVFormatContext* format_ctx = nullptr;
    if (avformat_alloc_output_context2(&format_ctx, nullptr, nullptr, "output.mp4") != 0) {
        std::cout << "Failed to create output format context!" << std::endl;
        return -1;
    }

    AVOutputFormat* output_fmt = format_ctx->oformat;

    AVStream* video_stream = avformat_new_stream(format_ctx, nullptr);
    if (video_stream == nullptr) {
        std::cout << "Failed to create video stream!" << std::endl;
        return -1;
    }

    AVCodec* codec = avcodec_find_encoder(AV_CODEC_ID_H264);
    if (codec == nullptr) {
        std::cout << "Failed to find encoder!" << std::endl;
        return -1;
    }

    AVCodecContext* codec_ctx = avcodec_alloc_context3(codec);
    if (codec_ctx == nullptr) {
        std::cout << "Failed to allocate codec context!" << std::endl;
        return -1;
    }

    codec_ctx->width = 640;
    codec_ctx->height = 480;
    codec_ctx->pix_fmt = AV_PIX_FMT_YUV420P;
    codec_ctx->time_base = (AVRational){1, 30};

    if (format_ctx->oformat->flags & AVFMT_GLOBALHEADER) {
        codec_ctx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
    }

    avcodec_open2(codec_ctx, codec, nullptr);

    avcodec_parameters_from_context(video_stream->codecpar, codec_ctx);

    avio_open(&format_ctx->pb, "output.mp4", AVIO_FLAG_WRITE);

    avformat_write_header(format_ctx, nullptr);

    // TODO: 逐帧编码并写入

    av_write_trailer(format_ctx);

    avio_close(format_ctx->pb);
    avcodec_free_context(&codec_ctx);
    avformat_free_context(format_ctx);

    return 0;
}

IV Analisis Video
Analisis video adalah untuk melaksanakan pelbagai algoritma dan pemprosesan pada data video, dengan mengekstrak kandungan video Maklumat dan ciri utama untuk menyelesaikan tugasan yang berbeza, seperti pengesanan sasaran, pengecaman tindakan, dsb. Dalam C++, anda boleh menggunakan perpustakaan OpenCV untuk analisis video dan menggabungkannya dengan algoritma pemprosesan imej lain untuk analisis video yang lebih maju.
Berikut ialah contoh kod yang menggunakan perpustakaan OpenCV untuk melaksanakan pengesanan objek pada video:

#include <opencv2/opencv.hpp>

int main() {
    cv::VideoCapture cap("test.mp4");
    if (!cap.isOpened()) {
        std::cout << "Failed to open video file!" << std::endl;
        return -1;
    }

    cv::CascadeClassifier classifier("haarcascade_frontalface_default.xml");

    cv::Mat frame;
    while (cap.read(frame)) {
        cv::Mat gray;
        cv::cvtColor(frame, gray, cv::COLOR_BGR2GRAY);

        std::vector<cv::Rect> faces;
        classifier.detectMultiScale(gray, faces, 1.1, 3);

        for (const auto& rect : faces) {
            cv::rectangle(frame, rect, cv::Scalar(0, 255, 0), 2);
        }

        cv::imshow("Video", frame);
        cv::waitKey(1);
    }

    cap.release();

    return 0;
}

Ringkasan: Artikel ini memperkenalkan cara menggunakan bahasa C++ untuk pemprosesan strim video dan analisis video yang cekap. Melalui perpustakaan OpenCV untuk pemerolehan strim video dan analisis video, dan melalui perpustakaan FFmpeg untuk penyahkodan video dan pengekodan video, pelbagai fungsi pemprosesan dan analisis video boleh dilaksanakan dengan mudah. Melalui contoh kod yang disediakan dalam artikel ini, pembaca boleh merujuknya semasa proses pembangunan dan menggunakannya pada projek sebenar. Saya harap artikel ini akan membantu pembaca dalam pemprosesan video dan analisis video.

Atas ialah kandungan terperinci Bagaimana untuk menggunakan C++ untuk pemprosesan strim video dan analisis video yang cekap?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn