15/12/16

Xử lý video hoặc Camera trong OpenCV

Trong bài học này, mình sẽ chỉ cho bạn làm thế nào để đọc một tập tin video. Đó là khá đơn giản. Các bạn chỉ cần khởi tạo một đối tượng VideoCapture mà sẽ mở một tập tin video và đọc theo từng khung hình từ video đó mở ra. Dưới đây là các mẫu mã OpenCV. Nếu bạn đang sử dụng Visual Studio, bạn sẽ cần phải bao gồm “stdafx.h” tập tin tiêu đề.

Xử lý video từ file cố đinh trong openCV

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include "opencv2/highgui/highgui.hpp"
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char* argv[])
{
 VideoCapture cap("C:/Users/SHERMAL/Desktop/SampleVideo.avi"); // Mở các file video đọc
 if ( !cap.isOpened() ) //Nếu ko mở được thoát khỏi chương trình
 {
 cout << "Không thể mở file video" << endl;
 return -1;
 }
 double fps = cap.get(CV_CAP_PROP_FPS); //Lấy các khung hình mỗi giây của video
 cout << "Frame / seconds : " << fps << endl;
 namedWindow("MyVideo",CV_WINDOW_AUTOSIZE); //Tạo ra một cửa số "MyVideo"
 while(1)
 {
 Mat frame;
 bool bSuccess = cap.read(frame); // Đọc cá khung từ video
if (!bSuccess) //Kiểm tra xem có đọc được ko
 {
 cout << "Không đọc được khung hình từ video" << endl;
 break;
 }
 mshow("MyVideo", frame); //Hiển thị khung hình trong MyVideo
 if(waitKey(30) == 27) //chờ người dùng nhân "esc"
 {
 cout << "Phim esc được sử dụng" << endl;
 break;
 }
 }
 return 0;
}

Xử lý video từ Camera trong openCV

Sự khác biệt chính của chương trình sau đây từ các chương trình trên là các đối số cho constructor VideoCapture. Ở đây bạn chỉ cần cung cấp cho các chỉ số của máy ảnh của bạn để các nhà xây dựng của các đối tượng VideoCapture thay cho tên tập tin trong chương trình trên. Dưới đây là các mẫu mã OpenCV.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include "opencv2/highgui/highgui.hpp"
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char* argv[])
{
VideoCapture cap(0); // mở camera video (không có: 0)
if (!cap.isOpened()) // nếu không thành công, thoát khỏi chương trình
{
cout << "Không thể mở Camera" << endl;
return -1;
}
double dWidth = cap.get(CV_CAP_PROP_FRAME_WIDTH); //có được chiều rộng của khung hình của video
double dHeight = cap.get(CV_CAP_PROP_FRAME_HEIGHT); //có được chiều cao của khung hình của video
cout << "Frame size : " << dWidth << " x " << dHeight << endl;
namedWindow("MyVideo",CV_WINDOW_AUTOSIZE); //Tạo ra một cửa số "MyVideo"
while (1)
{
Mat frame;
bool bSuccess = cap.read(frame); // đọc một khung mới từ video
if (!bSuccess) //kiểm tra xem đọc được ko
{
cout << "Không đọc được khung hình từ video" << endl;
break;
}
imshow("MyVideo", frame); //hiển thị khung trong "MyVideo" cửa sổ
if(waitKey(30) == 27) //chờ người dùng nhân "esc"
{
cout << "Phim esc được sử dụng" << endl;
break;
}
}
return 0;
}

Giải thích chức năng trong OpenCV

VideoCapture::VideoCapture(const string& filename)
Chức năng này được sử dụng để file video đọc các file video từ các tập tin được xác định sẵn đường dẫn.
bool VideoCapture::IsOpened()
Dùng để mở file video nếu mở thành công trả về TRUE nếu không thành công thì trả về FALSE
bool VideoCapture::set(int propId, double value)
Dùng để thay đổi một số thuộc tính của đối tượng VideoCapture.
Bảng thuộc tính:
  • CV_CAP_PROP_POS_MSEC – vị trí hiện tại của video trong mili giây
  • CV_CAP_PROP_POS_FRAMES – vị trí hiện tại của video trong khung
  • CV_CAP_PROP_FRAME_WIDTH – chiều rộng của khung hình của các dòng video
  • CV_CAP_PROP_FRAME_HEIGHT – chiều cao của khung hình của các dòng video
  • CV_CAP_PROP_FPS – tỷ lệ khung hình (khung hình mỗi giây)
  • CV_CAP_PROP_FOURCC – mã bốn nhân vật của codec
bool VideoCapture::read(Mat& image);
Các chức năng lấy khung hình tiếp theo từ video.
waitKey(30)
Các chức năng chờ đợi trong 30 phần nghìn giây. Nếu một phím được nhấn trước thời gian quy định, nó sẽ trả về giá trị ASCII của phím bấm. Nếu giá trị đó là 27 (giá trị ASCII của ‘esc’ chính là 27), chương trình sẽ thực hiện bên trong khối lệnh if. Nếu không có phím được nhấn trong đó 30ms, hàm trả về -1 chương trình sẽ tiếp tục vòng lặp while.
VideoCapture::~VideoCapture()
Destructor của đối tượng VideoCapture sẽ tiêu diệt bất kỳ bộ nhớ liên quan đến các đối tượng cụ thể. Destructor này sẽ được gọi là mặc nhiên xuất cảnh của phương pháp chính của các chương trình trên.
Bạn đang đọc bài viết Xử lý video hoặc Camera trong OpenCV tại Website: Học Lập Trình

1 nhận xét:

  1. Chao ban
    cho minh hoi bjo minh muon save video thanh duoi .avi trong open cv thi lam the nao ban nhi. minh cam on

    Trả lờiXóa