一、運行環境
環境是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.