一、OpenCV自學筆記:顯示圖片與播放視頻

一、運行環境

環境是Visual Studio 2015和OpenCV4.0.1

一般在VS裏邊就可以看到函數的功能及用法描述,你也可以查看官方文檔來獲取幫助。https://docs.opencv.org/4.0.1/

二、示例代碼

1. 顯示一張圖片

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main(int argc, char* argv[])
{
	const char* ImgPath = "AWVS1455.JPG";
	const char* WindowName = "Example";
	Mat img = imread(ImgPath);

	if (img.empty())
	{//判斷是否加載成功,如果未加載圖片則提示加載失敗
		cerr << "Read img file error !" << endl;
		system("pause");
		return -1;
	}

	namedWindow(WindowName, WINDOW_NORMAL);//這個函數可以不加,不加的話創建的窗口就是默認屬性
	imshow(WindowName, img);
	waitKey(0);

	return 0;
}

CV_EXPORTS_W Mat imread( const String& filename, int flags = IMREAD_COLOR );

功能:加載一張指定的圖片,並返回一個包含圖片信息的Mat對象

參數:參數一指定需要加載的圖片位置及名稱,參數二指定加載方式,默認值IMREAD_COLOR是以RGB方式加載

返回值:成功時返回一個包含打開圖片信息的Mat對象,可通過返回對象的成員函數empty查看是否成功加載

CV_EXPORTS_W void namedWindow(const String& winname, int flags = WINDOW_AUTOSIZE);

功能:按窗口名稱設置用於顯示圖片的窗口屬性,如果使用的名稱未被其他窗口占用,該函數將創建一個窗口

參數:參數一指定窗口名稱,參數二指定窗口的屬性,默認值WINDOW_AUTOSIZE是包含圖片的窗口不能改變大小(大的圖片會顯示不全,本例中使用的是WINDOW_NORMAL,顯示完整圖片,可改變窗口大小)

CV_EXPORTS_W void imshow(const String& winname, InputArray mat);

功能:在指定的窗口中顯示圖片(根據窗口名稱確定窗口)

參數:參數一指定用以顯示圖片的窗口,參數二指定需要顯示的圖片

CV_EXPORTS_W int waitKey(int delay = 0);

功能:是程序在調用處暫停一段時間

參數:0或者負數時,等待鍵盤按鍵按下後結束暫停;正數時,等待數值給出的毫秒數後結束暫停

返回值:參數爲0或者負數時,返回鍵盤鍵入按鍵的ASCII值;參數爲正數時,函數結束後返回 - 1

2. 播放一段視頻

#include <opencv2/opencv.hpp>
using namespace cv;

#include <iostream>
using namespace std;

int main()
{
	VideoCapture cap;    //創建存儲視頻文件或者設備的對象
	cap.open("D:\\StudyOpencv\\002-PlayVideo\\002-PlayVideo\\1234.MP4");    //打開視頻文件或者視頻設備
	if (!cap.isOpened())
	{
		cout << "could not open the VideoCapture !" << endl;
		system("pause");
		return -1;
	}

	const char* windowsName = "Example";
	int k = -1;

	while (true)
	{
		Mat frame;
		bool ok = cap.read(frame);
		if (!ok)    //判斷視頻文件是否讀取結束
			break;
		imshow(windowsName, frame);    //從視頻對象中獲取圖片顯示到窗口
		k = waitKey(33);    //每33毫秒一張圖片
		if (k == 27) break;    //按下退出鍵:Esc
	}

	waitKey(-1);
	return 0;
}

CV_WRAP virtual bool open(const String& filename, int apiPreference = CAP_ANY);

功能:打開一個指定的視頻文件或者打開一個指定的視頻設備

參數:參數一指定打開的路徑及對象,參數二指定了第一個參數的類型或屬性,默認參數CAP_ANY表示由系統或程序自動識別類型

返回值:當指定的文件或設備成功打開時返回true,也可以用isOpened函數去查看是否成功打開

CV_WRAP virtual bool read(OutputArray image);

功能:讀取視頻文件或視頻設備的數據

參數:存儲視頻文件或視頻設備的信息對象

返回值:如果沒有畫面可以讀取時返回 false

三、自學問題記錄

程序雖然簡單,但第一次接觸,還是遇到了問題。代碼如下(老版本的播放視頻方法),一開始是在OpenCV3.4版本上寫的視頻播放代碼,語法沒有報錯,一旦調試就會報錯。調查發現是因爲高版本的OpenCV已經不建議使用下列C語言風格的代碼,而是建議用上面C++面向對象風格編寫代碼。同樣的代碼放在OpenCV4.0.1上就直接會提示語法錯誤,相對3.4版本不做語法報錯但編譯不通過的情況,4.0版本應該已經做了完善,畢竟無用的代碼最好還是在未編譯時就告訴你,否則很容易讓我們一臉懵逼(往下貼出了錯誤信息)。

示例:

#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>

using namespace cv;

int main(int argc, char *argv[])
{
	const char *videoName = "vtest.avi";
	const char *windowName = "Example";

	cvNamedWindow(windowName, CV_WINDOW_NORMAL);
	CvCapture* capture = cvCreateFileCapture(videoName);
	IplImage* frame;

	while (1)
	{
		frame = cvQueryFrame(capture);
		if(!frame)
			break;
		cvShowImage(windowName, frame);
		char c = cvWaitKey(33);
		if(c == 27)
			break;
	}

	cvReleaseCapture(&capture);
	cvDestroyWindow(windowName);

	system("pause");
	return 0;
}

OpenCV3.4版本編譯後的錯誤信息:(這裏之所以貼出來,是爲了讓遇到相同疑惑的兄弟更容易檢索到這篇文章)

[ INFO:0] VIDEOIO: Enabled backends(6, sorted by priority): FFMPEG(1000); MSMF(990); DSHOW(980); VFW(970); CV_IMAGES(960); CV_MJPEG(950)
[ WARN:0] cvCreateFileCaptureWithPreference: backend FFMPEG doesn't support legacy API anymore.
[ WARN:0] cvCreateFileCaptureWithPreference: backend MSMF doesn't support legacy API anymore.

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章