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序號打開,但如果實際中存在有多個攝影機的時候呢?如何區分以及如何去指定打開其中一個攝影機?值得思考一下,敬請待續。