opencv自學之旅 視訊讀取,攝像頭讀取
阿新 • • 發佈:2019-01-22
opencv 可以很方便的讀取攝像頭,他有一個CvCapture結構體,可以用來操作攝像頭。
首先我們先了解下這個結構體。
1.讀取視訊檔案
cvCreateFileCapture(“檔案路徑”); 返回指標 CvCapture型別。
這個函式是讀取一個視訊檔案,他的返回類似是 CvCapture 型別。讀取的時候是一幀一幀的讀取,如果返回值型別 空,那麼安裝解碼器(解碼器就是看你電腦能不能正確的把各種檔案格式的視訊解析, 不然 avi格式,mp4格式等等), 或者 看路徑對不對。
1.1獲取一幀資料
cvQueryFrame(capture);
輸入一個CVCapture 型別的指標,該函式主要功能是將視訊下一個幀載入到記憶體,與cvLoadImage 不同,該函式不重新分配記憶體。
1.2
cvReleaseCapture()
釋放視訊空間鎮。
那麼來看看一個都去視訊的原始碼
int main()
{
CvCapture *capture = cvCreateFileCapture("1.mp4");
IplImage *frame = nullptr;
cvNamedWindow("mp4", 1);
while (1)
{
frame = cvQueryFrame(capture);
if (!frame)
{
break ;
}
cvShowImage("mp4", frame);
char c = cvWaitKey(1);
if (c == 27)
{
break;
}
}
cvReleaseCapture(&capture);
cvDestroyWindow("mp4");
return 0;
}
這個就是讀取一個mp4格式的視訊,然後顯示出來。 這個 cvWaitKey() 可以控制播放的速度。
2讀取視像頭操作
讀攝像頭
cvCreateCameraCapture(int id)
這個函式是讀取攝像頭操作, 裡面的id 代表你電腦連線的外設攝像頭id。
#include <opencv2\opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
VideoCapture cap(0);
cap.set(CV_CAP_PROP_FRAME_WIDTH, 1920); //設定解析度
cap.set(CV_CAP_PROP_FRAME_HEIGHT, 1080);
CvVideoWriter* video = NULL;
IplImage* frame = NULL;
if (!cap.isOpened()) //如果不能開啟攝像頭給出警告
{
cout << "Can not open the camera." << endl;
return -1;
}
else
{
cap.read(imgOriginal); //首先取得攝像頭中的一幀
if (video) //如果能建立CvVideoWriter物件則表明成功
{
cout << "VideoWriter has created." << endl;
}
cvNamedWindow("Camera Video", 1); //新建一個視窗
while (1)
{
bool bSuccess = cap.read(imgOriginal);
if (!bSuccess) //if not success, break loop
{
cout << "Cannot read a frame from video stream" << endl;
break;
}
frame = &IplImage(imgOriginal);
if (!frame)
{
cout << "Can not get frame from the capture." << endl;
break;
}
cvShowImage("Camera Video", frame); //顯示視訊內容的圖片
if (cvWaitKey(1) > 0) break; //有其他鍵盤響應,則退出
}
cvReleaseVideoWriter(&video);
cvDestroyWindow("Camera Video");
}
return 0;
}
其實原理和讀取視訊一樣, 都是一幀幀的獲取,然後顯示。