1. 程式人生 > 其它 >Opencv 播放mp4檔案和讀取攝像頭圖以及可能會發生的一些異常問題解決方法

Opencv 播放mp4檔案和讀取攝像頭圖以及可能會發生的一些異常問題解決方法

https://www.cnblogs.com/lvvou/p/14974760.html

學習內容

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