C++&Python&C# 三语言OpenCV从零开发(4):视频流读取

文章目录

  • 相关链接
  • 视频流读取
    • C++
    • CSharp
    • Python
  • 总结

相关链接

C++&Python&Csharp in OpenCV 专栏

【2022B站最好的OpenCV课程推荐】OpenCV从入门到实战 全套课程(附带课程课件资料+课件笔记)

OpenCV 教程中文文档|OpenCV中文

OpenCV教程中文文档|W3Cschool

OpenCV基础教程——视频的读取与写入(超详细+附代码)

视频流读取

我之前写过一篇基于Python的,我现在重新写一次

Python+OpenCV 零基础学习笔记(4-5):计算机图形基础+Python相对文件路径+OpenCV图像+OpenCV视频

如果你想要一个简单的B站视频流下载器,这里推荐一个

哔哩下载姬downkyi_v1.6.1 下载

在这里插入图片描述

如果想获取视频流,B站上面随便搜一下就可以

卓特视觉视频素材 B站账号

于我何方 B站账号

比如我这里下载一个视频素材

【4K】群山无版权视频素材-6

在这里插入图片描述

C++

OpenCV基础教程——视频的读取与写入(超详细+附代码)

#include <opencv2/opencv.hpp>  
#include <opencv2/core/core.hpp>  
#include <opencv2/highgui/highgui.hpp>  
#include <opencv2/imgproc.hpp>  
#include<iostream>  
using namespace std;
using namespace cv;
int main()
{
    
    VideoCapture video("D:/workSpace/OpenCV/HellOpenCV/Resources/video/test.mp4");
    //video.open("");
    auto isOpen = false;
    Mat frame;



    if (video.isOpened()) {
        //读取第一帧视频
        isOpen = video.read(frame);
    }
    else {
        cout<< "不存在此视频" << endl;
    }

    while (isOpen)
    {   
        //不断的判断下一帧是否为空
        isOpen = video.read(frame);
        //如果为空则跳出循环
        if(frame.empty()){
            break;
        }
        imshow("C++", frame);
        int keyValue = waitKey(10);
        //27是ESC的ASCLL码,按下ESC退出
        if (keyValue == 27) {
            break;
        }
    }

    cout << "播放结束" << endl;
    //释放视频流
    video.release();
    
    //关闭所有窗口
    destroyAllWindows();
    return 0;
}

在这里插入图片描述

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

CSharp

internal class Program
{
    static void Main(string[] args)
    {

        VideoCapture video = new("D:/workSpace/OpenCV/HellOpenCV/Resources/video/test.mp4");
        //video.open("");
        var isOpen = false;
        Mat frame = new Mat();
        if (video.IsOpened())
        {
            //读取第一帧视频
            isOpen = video.Read(frame);
        }
        else
        {
            Console.WriteLine("不存在此视频");
        }

        while (isOpen)
        {
            //不断的判断下一帧是否为空
            isOpen = video.Read(frame);
            //如果为空则跳出循环
            if (frame.Empty())
            {
                break;
            }
            Cv2.ImShow("CSharp", frame);
            int keyValue =Cv2.WaitKey(10);
            //27是ESC的ASCLL码,按下ESC退出
            if (keyValue == 27)
            {
                break;
            }
        }

        Console.WriteLine("播放结束");
        //释放视频流
        video.Release();

        //关闭所有窗口
        Cv2.DestroyAllWindows();
    }
}

在这里插入图片描述

Python

Python我们改改代码,试着输出一下灰度视频流

# %%
# 导入包
import cv2
import matplotlib.pyplot as plt
import numpy as np

# 导入视频
input_video = {}
# 下载好的视频文件
input_video['vc'] = cv2.VideoCapture('D:/workSpace/OpenCV/HellOpenCV/Resources/video/test.mp4')
# 判断是否读取成功
if input_video['vc'].isOpened():
    # Python语法,元组读取
    input_video['open'] = input_video['vc'].read()
else:
    input_video['open'] = False
    
# 循环帧读取,两个退出条件:视频播放完/输入'ESC'退出
while input_video['open']:
    open,frame = input_video['vc'].read()
    if frame is None:
        break;
    if open:
        # 我们先播放灰度图像
        gray = cv2.cvtColor(frame)
        # 打开一个名为result的窗口,播放帧
        cv2.imshow('result',gray)
        # 这个是特殊组合,waiteKey指每帧的时间,输入'esc'退出视频播放
        if cv2.waitKey(10) & 0xff == 27:
            break;
        
# 释放视频输入流
input_video['vc'].release();
# 关闭所有窗口
cv2.destroyAllWindows();

在这里插入图片描述
这里图像显示有点问题,分辨率不对。我后面有空去网上找找解决方案

总结

详细的可以看这个博客,介绍的比较全面

OpenCV基础教程——视频的读取与写入(超详细+附代码)

经过这次代码书写,我发现确实,算子基本差不多,尤其是C++和Csharp,跑通了C++,Csharp也差不多就通了。Python简化的比较多,大致上也是调用算子。