Opencv 播放mp4文件和讀取攝像頭圖以及可能會發生的一些異常問題解決方法
學習內容
學習Opencv 讀取並播放本地視頻和打開攝像頭圖像以及可能會發生的一些異常問題解決方法
代碼演示
電腦環境信息: OpenCV版本:4.5.2 ,vs2017
1.視頻文件讀取與播放
加載本地視頻基本代碼:
#include "opencv2/opencv.hpp"
#include <iostream>
#include <Windows.h>
using namespace std;
using namespace cv;
int main(int argc, char **argv)
{
cv::VideoCapture vedio("D:/workspace/opencv/project/test.mp4");
if (!vedio.isOpened())
{
cout << "讀取視頻文件失敗!" << endl;
return -1;
}
else
{
cout << "讀取視頻文件成功!" << endl;
}
return 0;
}
運行結果
我們發現運行結果是讀取失敗,然後我們先檢查一下文件是否存在,我們的路徑是否寫錯….
經過一陣的搗鼓,發現視頻文件確實存在而且沒有錯誤,路徑也是非常的正確!
那為什麼不能加載呢?試着猜想會不會缺少相關的庫造成呢,經探索,opencv播放是依賴ffmpeg的,所以我們去找相關的庫放在同exe目錄下試試。
1.找到安裝的opencv目錄處
2.複製到我們debug目錄下跟exe同級
接下來我們再運行一次
哎,運行成功啦。
接下來,讀取視頻文件沒有問題啦,就進行顯示代碼的編寫
#include "opencv2/opencv.hpp"
#include <iostream>
#include <Windows.h>
using namespace std;
using namespace cv;
int main(int argc, char **argv)
{
cv::VideoCapture vedio("D:/workspace/opencv/project/test.mp4");
if (!vedio.isOpened())
{
cout << "讀取視頻文件失敗!" << endl;
return -1;
}
else
{
cout << "讀取視頻文件成功!" << endl;
}
Mat frame;
namedWindow("Vedio", WINDOW_NORMAL);
/*視頻文件的寬高和幀率信息*/
cout << "Vedio Width:" << vedio.get(CAP_PROP_FRAME_WIDTH) << endl;
cout << "Vedio Height:" << vedio.get(CAP_PROP_FRAME_HEIGHT) << endl;
cout << "Vedio FPS:" << vedio.get(CAP_PROP_FPS) << endl;
/*循環讀取視頻文件*/
while (true)
{
vedio >> frame; /*獲取一幀*/
if (frame.empty()) /*讀取完成則退出*/
break;
double sec = 1000.0 / vedio.get(CAP_PROP_FPS);/*播放速度*/
if (waitKey(sec) == VK_ESCAPE) /*播放過程中可按ESC退出播放*/
break;
imshow("Vedio", frame); /*顯示幀*/
}
destroyAllWindows();/*清理資源*/
return 0;
}
運行結果
播放視頻文件編寫完成!
2.讀取攝像頭圖像
有了上面的基礎,編寫讀取攝像頭的方式就非常簡單啦
#include "opencv2/opencv.hpp"
#include <iostream>
#include <Windows.h>
using namespace std;
using namespace cv;
int main(int argc, char **argv)
{
cv::VideoCapture vedio;
vedio.open(0); /*讀取第一個攝像頭*/
if (!vedio.isOpened())
{
cout << "打開攝像頭失敗!" << endl;
return -1;
}
else
{
cout << "打開攝像頭成功!" << endl;
}
Mat frame;
namedWindow("Vedio", WINDOW_NORMAL);
/*視頻文件的寬高和幀率信息*/
cout << "Vedio Width:" << vedio.get(CAP_PROP_FRAME_WIDTH) << endl;
cout << "Vedio Height:" << vedio.get(CAP_PROP_FRAME_HEIGHT) << endl;
/*循環讀取視頻文件*/
while (true)
{
vedio >> frame; /*獲取一幀*/
if (frame.empty()) /*讀取完成則退出*/
break;
int sec = 25;/*播放速度*/
if (waitKey(sec) == VK_ESCAPE) /*播放過程中可按ESC退出播放*/
break;
imshow("Vedio", frame); /*顯示幀*/
}
destroyAllWindows();/*清理資源*/
return 0;
}
運行結果
以上就是利用OpenCV讀取攝像頭的內容
四.結束
簡單的東西也需要做簡單的記錄,在打開攝像頭這裡,只能按Index序號打開,但如果實際中存在有多個攝像頭的時候呢?如何區分以及如何去指定打開其中一個攝像頭?值得思考一下,敬請待續。