要捕获视频,需要创建一个 VideoCapture 对象。它的参数可以是设备索引或视频文件的名称。设备索引就是指定哪个摄像头的数字。正常情况下,一个摄像头会被连接(默认为0)。可以通过传递1来选择第二个相机,以此类推。在此之后,可以逐帧捕获。但是在最后,不要忘记释放捕获。
cv.VideoCapture() 相机默认参数为0,如果从视屏中播放文件,参数为视屏地址。
cap.read() 返回布尔值,如果真确读取,返回ture。可以通过检查返回值来检查视屏结尾。read函数与重载运算符>>作用相同
cap.isOpened() 检查cap是否被初始化,如果初始化成功,返回true。
import numpy as np
import cv2
cap = cv2.VideoCapture("F:\\L-opencv3\\videos\\stell.mp4")
cv2.namedWindow("stell",cv2.WINDOW_AUTOSIZE)
while(True):
ret,frame = cap.read()
if not ret:
print("视屏读取错误")
break
cv2.imshow("stell",frame)
if cv2.waitKey(1) == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
#include
#include
#include
#include
using namespace std;
int main()
{
cv::namedWindow("stell", cv::WINDOW_AUTOSIZE);
cv::VideoCapture cap;
cap.open("F:\\L-opencv3\\videos\\stell.mp4");
cv::Mat frame;
while (true) {
//cap >> frame; 输入流运算符与cv::read()函数功能相同
cap.read(frame);
if (frame.empty()) break;
cv::imshow("stell", frame);
if (cv::waitKey(25) == int('q')) break;
}
return 0;
}
创建一个 VideoWriter 对象。应该指定输出文件名(例如: output.avi)。然后应该指定 FourCC 代码(详见下一段)。然后传递帧率的数量和帧大小。最后一个是颜色标志。如果为 True
,编码器期望颜色帧,否则它与灰度帧一起工作。
FourCC:http://en.wikipedia.org/wiki/FourCC 是用于指定视频编解码器的4字节代码。可用代码列表可在fourcc.org中:http://www.fourcc.org/codecs.php 找到。它取决于平台。
FourCC代码作为MJPG的cv.VideoWriter_fourcc('M','J','P','G')
or cv.VideoWriter_fourcc(*'MJPG')
传递。
从文件读取视频,沿垂直方向翻转每一帧并保存
import numpy as np
import cv2
cap = cv2.VideoCapture("F:\\L-opencv3\\videos\\stell.mp4")
cv2.namedWindow("stell",cv2.WINDOW_AUTOSIZE)
cv2.namedWindow("stell2",cv2.WINDOW_AUTOSIZE)
while(True):
ret,frame = cap.read()
if not ret:
print("视屏读取错误")
break
cv2.imshow("stell",frame)
frame2 = cv2.flip(frame,0)
cv2.imshow("stell2",frame2)
if cv2.waitKey(1) == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
#include
#include
#include
#include
using namespace std;
int main()
{
cv::namedWindow("stell", cv::WINDOW_AUTOSIZE);
cv::VideoCapture cap;
cap.open("F:\\L-opencv3\\videos\\stell.mp4");
cv::VideoWriter out;
out.open("F:\\L-opencv3\\videos\\out_video.mp4", CV_FOURCC('D', 'I', 'V', 'X'),
30.0, cv::Size(640, 480), true);
cv::Mat frame;
cv::Mat frame2;
while (true) {
cap >> frame;
if (frame.empty()) break;
cv::flip(frame,frame2,0);
out.write(frame2);
cv::imshow("stell", frame);
if (cv::waitKey(25) == int('q')) break;
}
return 0;
}
问题:保存的视频无法打开,大小为0字节,python代码和 C++代码均有此问题,待解决。
python 代码
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
cap = cv.VideoCapture(0)
while(True):
ret,frame = cap.read()
if ret:
cv.imshow("frame",frame)
if cv.waitKey(25)==ord('q'):
break
else:
break
C++代码
#include
#include
#include
#include
using namespace std;
int main() {
cv::VideoCapture out;
out.open(0);
cv::namedWindow("test", CV_WINDOW_AUTOSIZE);
cv::Mat frame;
while (true) {
out.read(frame);
if (frame.empty()) break;
cv::imshow("test", frame);
if (cv::waitKey(25) == int('q')) break;
}
return 0;
}