視頻的讀取
cv::VideoCapture類是讀取視頻的,cv::VideoCapture既支持視頻文件的讀取,也支持從視頻捕捉文件中讀取視頻。cv::VideoCapture類創(chuàng)建對(duì)象的方式如下三種:
cv::VideoCapture capture(const string& filename,);
//第一種:從輸入的文件名對(duì)應(yīng)文件中讀取
cv::VideoCapture capture(int device);
//第二種:從視頻捕捉設(shè)備ID中讀取
cv::VideoCapture capture();
//第三種:調(diào)用無參構(gòu)造函數(shù)創(chuàng)建對(duì)象
第一種方法是從文件(AVI和MP4都可以)中逐幀讀取視頻。對(duì)象創(chuàng)建后,OpenCv將會(huì)打開文件并準(zhǔn)備讀取它。如果打開成功,將可以開始讀取視頻的幀,通過cv::VideoCapture類的成員函數(shù)isOpened()返回True的結(jié)果可以判斷打開讀取對(duì)象成功(建議在打開視頻或者攝像頭的時(shí)候調(diào)用此成員函數(shù),以判斷是否打開成功)
第二種是從視頻捕捉設(shè)備中讀取視頻,一般電腦配套的攝像頭ID號(hào)是0,外接的USB攝像頭ID號(hào)為1.
第三種方式創(chuàng)建一個(gè)捕獲對(duì)象,而不提供任何關(guān)于打開的信息。對(duì)象創(chuàng)建后通過成員函數(shù)open()來設(shè)定打開的信息。open()操作也有一下兩種方式
cv::VideoCapture cap;
cap.open("D:\\360\\smart_car.mp4");//第一種路徑方式打開視頻
打開之后需要將視頻幀(其實(shí)就是把視頻中的圖像取出來)讀取到cv::Mat矩陣中,共有兩種方式,一種是read操作,一種是>>操作。示例如下:
cv::Mat frame;
cap.read(frame);//讀取方式一
cap>>frame;//讀取方式二
補(bǔ)充說明:獲取視頻某些屬性
retval=cap.get(propId)
propId:從0到18的數(shù)字,每個(gè)數(shù)字表示視頻的屬性
索引 | flags | 意義 |
---|---|---|
0 | cv2::CAP_ PROP_POS_MSEC | |
1 | cv2::CAP_PROP_POS_FRAMES | 從0開始索引幀,幀位置 |
2 | cv2::CAP_PROP_POS_AVI_RATIO | 視頻文件的相對(duì)位置(0表示開始,1表示結(jié)束) |
3 | cv2::CAP_PROP_FRAME_WIDTH | 視頻流的幀寬度 |
4 | cv2::CAP_PROP_FRAME_HEIGHT | 視頻流的幀高度 |
5 | cv2::CAP_PROP_FPS | 幀率 |
6 | cv2::CAP_PROP_FOURCC | 編解碼器四字符代碼 |
7 | cv2::CAP_PROP_FRAME_COUNT | 視頻文件的幀 |
綜上所述:
下面是一個(gè)打開視頻的示例代碼:
#include <iostream>
#include <opencv2\opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
VideoCapture CvCapture("D:\\360\\smart_car.mp4");
if(!CvCapture.isOpened())
{
cout<<"Read video Failed!"<<std::endl;//可以刪除std::
while(1);
return -1;
}
Mat img_lhc;
namedWindow("test");
int num=CvCapture.get(cv::CAP_PROP_FRAME_COUNT);//可以刪除cv::
for(int i=0;i<num-1;++i)
{
//CvCapture>>img_lhc;另一種導(dǎo)入圖片的寫法
CvCapture.read(img_lhc);
imshow("test",img_lhc);
//等待30ms后,按下q鍵即可退出播放
if(waitKey(30)=='q')
{
break;
}
}
destroyWindow("test");//銷毀窗口
CvCapture.release();//釋放對(duì)象
return 0;
}
視頻的輸出
cv::VideoWriter類用于寫入視頻。該類較之cv::VideoCapture類要復(fù)雜一些。cv::VideoWrite類的對(duì)象有兩種創(chuàng)建方式。第一種是使用構(gòu)建函數(shù),第二種是使用open()函數(shù),具體示例如下:
第一種方式:
cv::VideoWriter out(
const string& filename,//輸出文件名
int fourcc,//編碼形式,使用CV_FOURCC()宏
double fps,//輸出視頻幀率
cv::Size frame_size,//單幀圖像大小
bool is_color=true//如果是false則可傳入灰度圖像,true是彩色的
)
第二種方式:
cv::VideoWriter out;
out.open(
"my_video.mpg",//輸出文件名
CV_FOURCC('D','I','V','X'),//MPEG-4編碼
30.0,//輸出視頻幀率
cv::Size(640,480),//單幀圖像分辨率為640像素*480像素
true//只可傳入彩色圖像,false為灰度圖像
)
其中需要注意的是FOURCC編碼形式,操作時(shí)通常用以下4個(gè)字符連接起來形成一個(gè)FOURCC編碼,形式為cv::VideoWriter::fourcc(char c1,char c2,char c3,char c4)。
常用格式有以下幾種:
CV_FOURCC(‘P’,‘I’,‘M’,‘1’)=MPEG-1 codec。
CV_FOURCC(‘M’,‘J’,‘P’,‘G’)=motion-jpeg codec。
CV_FOURCC(‘M’,‘P’,‘4’,‘2’)=MPEG-4.2 codec。
CV_FOURCC(‘D’,‘I’,‘V’,‘X’)=MPEG-4 codec。
CV_FOURCC(‘F’,‘L’,‘V’,‘1’)=FLV1 codec。
像創(chuàng)建的cv::VideoWrite對(duì)象寫入圖像也有兩種形式,即write()操作以及<<操作。文章來源:http://www.zghlxwxcb.cn/news/detail-817555.html
cv::VideoWriter::write
(const Mat& image);//寫入圖像作為下一幀
out<<frame
示例:文章來源地址http://www.zghlxwxcb.cn/news/detail-817555.html
#include<stdio.h>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main(void)
{
Mat frame;
string filename="D:\\360\\smart_car.mp4";
VideoCapture cap(filename);
VideoWriter out;
out.open("D:\\360\\test.mp4",cv::VideoWriter::fourcc('D','I','V','X'),
cap.get(CAP_PROP_FPS),Size(cap.get(CAP_PROP_FRAME_WIDTH),
cap.get(CAP_PROP_FRAME_HEIGHT)),true);
if(!cap.isOpened())
{
cout<<"Video load failed!"<<endl;
return -1;
}
while(1)
{
cap>>frame;
if(frame.empty())
{
cout<<"Video process finished!"<<endl;
return 0;
}
imshow("video",frame);
if(waitKey(10)=='q')
break;
out<<frame;
}
cap.release();
//out.release();
/*
在使用OpenCV進(jìn)行視頻處理時(shí),通常會(huì)使用cv2.VideoCapture()函數(shù)來讀取視頻文件或者從攝像頭獲取視頻流。當(dāng)不再需要使用視頻流時(shí),可以通過調(diào)用cap.release()來釋放資源,關(guān)閉視頻流。
類似地,當(dāng)使用cv2.VideoWriter()函數(shù)將處理后的視頻保存為文件時(shí),可以通過調(diào)用out.release()來釋放資源,關(guān)閉視頻寫入器。
這些函數(shù)的調(diào)用可以確保在程序結(jié)束時(shí),釋放所有使用的資源,避免資源泄露和內(nèi)存溢出等問題。
*/
return 0;
}
到了這里,關(guān)于OpenCv(C++)學(xué)習(xí)筆記二——視頻的讀取與輸出的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!