我之前写过一篇基于Python的,我现在重新写一次
Python+OpenCV 零基础学习笔记(4-5):计算机图形基础+Python相对文件路径+OpenCV图像+OpenCV视频
如果你想要一个简单的B站视频流下载器,这里推荐一个
如果想获取视频流,B站上面随便搜一下就可以
比如我这里下载一个视频素材
#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;
}
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我们改改代码,试着输出一下灰度视频流
# %%
# 导入包
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();
这里图像显示有点问题,分辨率不对。我后面有空去网上找找解决方案
详细的可以看这个博客,介绍的比较全面
经过这次代码书写,我发现确实,算子基本差不多,尤其是C++和Csharp,跑通了C++,Csharp也差不多就通了。Python简化的比较多,大致上也是调用算子。