Opencv3学习笔记(C++&Python双语)---视屏读取与保存

要捕获视频,需要创建一个 VideoCapture 对象。它的参数可以是设备索引或视频文件的名称。设备索引就是指定哪个摄像头的数字。正常情况下,一个摄像头会被连接(默认为0)。可以通过传递1来选择第二个相机,以此类推。在此之后,可以逐帧捕获。但是在最后,不要忘记释放捕获。

重要函数:

cv.VideoCapture()  相机默认参数为0,如果从视屏中播放文件,参数为视屏地址。

cap.read() 返回布尔值,如果真确读取,返回ture。可以通过检查返回值来检查视屏结尾。read函数与重载运算符>>作用相同

cap.isOpened()  检查cap是否被初始化,如果初始化成功,返回true。

python代码

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()

C++代码

#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 找到。它取决于平台。

  • 在Fedora中:DIVX,XVID,MJPG,X264,WMV1,WMV2。(最好使用XVID。MJPG会生成大尺寸的视频。X264会生成非常小的尺寸的视频)
  • 在Windows中:DIVX(尚待测试和添加)
  • 在OSX中:MJPG(.mp4),DIVX(.avi),X264(.mkv)。

FourCC代码作为MJPG的cv.VideoWriter_fourcc('M','J','P','G')or cv.VideoWriter_fourcc(*'MJPG')传递。

python代码

从文件读取视频,沿垂直方向翻转每一帧并保存

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()

C++代码

#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;
}

 

你可能感兴趣的:(Opencv3学习笔记(C++&Python双语)---视屏读取与保存)