今天學(xué)習(xí)的這兩個(gè)內(nèi)容比較簡(jiǎn)單,話不多說(shuō),直接上代碼!
目錄
【1】讀取視頻文件
【2】攝像頭讀取視頻
【1】讀取視頻文件
#include<iostream>
#include<opencv2\imgproc\imgproc.hpp>
#include<opencv2\highgui\highgui.hpp>
#include<opencv2\opencv.hpp>
using namespace std;
using namespace cv;
int main(int argc,char** argv)
{
//定義視頻讀取器
//若是讀取視頻,則需要在cap()內(nèi)提供讀取的地址
VideoCapture cap("E:\\喬大花進(jìn)度\\11-21\\讀取攝像頭和視頻\\tree.avi");
//對(duì)視頻讀取是否成功進(jìn)行判斷
if (!cap.isOpened())
{
cout << "視頻讀取失敗,請(qǐng)檢查地址!??!" << endl;
return -1;
}
Mat frame;//frame 用來(lái)接收視頻每一幀的圖片
namedWindow("test",WINDOW_AUTOSIZE);
while (true)
{
//將視頻中每幀的圖片傳入frame
cap >> frame;
//第二種方法
// bool ok = cap.read(frame); ok是對(duì)視頻是否成功讀取每幀圖片進(jìn)行判斷,抓取的每幀圖像存在frame中
//判斷載入的圖片是否為空,同時(shí)也可以用frame.data 代替
if (frame.empty())
{
//重新從開(kāi)始讀取
cout << "視頻讀取完成,重新開(kāi)始讀取" << endl;
//set函數(shù)可以設(shè)置cap捕捉器中參數(shù),也可以獲取捕捉視頻的一些信息
cap.set(CAP_PROP_POS_FRAMES,0);//將幀設(shè)置在0處
continue;
}
imshow("test",frame);
//定義循環(huán)速度為50ms
int key = waitKey(50);
if (key==27||key=='q'||key=='Q')
{
break;
}
}
destroyAllWindows();
return 0;
}
運(yùn)行結(jié)果:
?這段代碼較為簡(jiǎn)單,有興趣的同學(xué)也可以挑戰(zhàn)一下,在視頻讀取上加個(gè)進(jìn)度條,可以通過(guò)鼠標(biāo)拖動(dòng)進(jìn)度條到指定位置,像平時(shí)我們用的視頻播放器一樣,主要是createTrackbar算子調(diào)用回調(diào)函數(shù)實(shí)現(xiàn)。
參考代碼如下:
#include<iostream>
#include<opencv2\imgproc\imgproc.hpp>
#include<opencv2\highgui\highgui.hpp>
#include<opencv2\opencv.hpp>
using namespace std;
using namespace cv;
//定義全局變量
int g_slider_position = 0, frames_all = 0;
VideoCapture cap;
//定義全局函數(shù)
void onTrackerslide(int, void*);
void onTrackerslide(int, void*)
{
//將視頻移動(dòng)到指定位置幀
cap.set(CAP_PROP_POS_FRAMES, g_slider_position);
}
int main(int argc, char** argv)
{
//定義視頻讀取器
//若是讀取視頻,則需要在cap()內(nèi)提供讀取的地址
/*VideoCapture cap("E:\\喬大花進(jìn)度\\11-21\\讀取攝像頭和視頻\\tree.avi");*/
cap.open("E:\\喬大花進(jìn)度\\11-21\\讀取攝像頭和視頻\\1.mp4");
//對(duì)視頻讀取是否成功進(jìn)行判斷
if (!cap.isOpened())
{
cout << "視頻讀取失敗,請(qǐng)檢查地址!??!" << endl;
return -1;
}
Mat frame;//frame 用來(lái)接收視頻每一幀的圖片
namedWindow("test", WINDOW_AUTOSIZE);
//獲取圖像的總幀數(shù)
frames_all = cap.get(CAP_PROP_FRAME_COUNT);
cout << "總的幀數(shù)為:" << frames_all << endl;
//創(chuàng)建進(jìn)度條
createTrackbar("進(jìn)度", "test", &g_slider_position, frames_all, onTrackerslide);
//回調(diào)函數(shù)初始化
// onTrackerslide(0,0);
int i = 0;
while (true)
{
//將視頻中每幀的圖片傳入frame
cap >> frame;
//第二種方法
// bool ok = cap.read(frame); ok是對(duì)視頻是否成功讀取每幀圖片進(jìn)行判斷,抓取的每幀圖像存在frame中
//判斷載入的圖片是否為空,同時(shí)也可以用frame.data 代替
if (frame.empty())
{
//重新從開(kāi)始讀取
cout << "視頻讀取完成,重新開(kāi)始讀取" << endl;
//set函數(shù)可以設(shè)置cap捕捉器中參數(shù),get可以獲取捕捉視頻的一些信息
cap.set(CAP_PROP_POS_FRAMES, 0);//將幀設(shè)置在0處
continue;
}
//設(shè)置進(jìn)度條的位置,使進(jìn)度條可以可以和視頻一致運(yùn)動(dòng)
int now_frame = cap.get(CAP_PROP_POS_FRAMES);
setTrackbarPos("進(jìn)度", "test", now_frame);
//定義循環(huán)速度為50ms
int key = waitKey(20);
imshow("test", frame);
if (key == 27 || key == 'q' || key == 'Q')
{
break;
}
}
cv::destroyAllWindows();
return 0;
}
運(yùn)行結(jié)果為:
【2】攝像頭讀取視頻
#include<opencv2\opencv.hpp>
#include<iostream>
#include<opencv2\highgui\highgui.hpp>
#include<opencv2\imgproc\imgproc.hpp>
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
//argc為設(shè)備上攝像頭的數(shù)量,如果只有一個(gè)1,則初始ID為0,默認(rèn)為-1
cout << argc << endl;
//打開(kāi)初始攝像頭
VideoCapture cap(0);
namedWindow("test",WINDOW_AUTOSIZE);
Mat frame;
while (true)
{
cap >> frame;
if (!frame.data)
{
cout << "檢查攝像頭" << endl;
break;
}
imshow("test", frame);
int key = waitKey(20);
if (key==27||key=='Q'||key=='q')
{
break;
}
}
system("pause");
return 0;
}
運(yùn)行結(jié)果:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-566842.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-566842.html
到了這里,關(guān)于Opencv(C++)系列學(xué)習(xí)---讀取視頻文件和打開(kāi)攝像頭的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!