OpenCV VideoCapture()函式
OpenCV3和OpenCV2類似,視訊的讀、寫操作,分別通過下面兩個類來實現:cv::VideoCapture和cv::VideoWriter兩個類來實現。
1.VideoCapture類的建構函式:
C++: VideoCapture::VideoCapture()
C++: VideoCapture::VideoCapture(const string& filename)
C++: VideoCapture::VideoCapture(int device)
功能:建立一個VideoCapture類的例項,如果傳入對應的引數,可以直接開啟視訊檔案或者要呼叫的攝像頭。
引數:
filename – 開啟的視訊檔名。
device – 開啟的視訊捕獲裝置id ,如果只有一個攝像頭可以填0,表示開啟預設的攝像頭。
2.VideoCapture::open
功能:開啟一個視訊檔案或者開啟一個捕獲視訊的裝置(也就是攝像頭)
C++: bool VideoCapture::open(const string& filename)
C++: bool VideoCapture::open(int device)
引數:
filename – 開啟的視訊檔名。
device – 開啟的視訊捕獲裝置id ,如果只有一個攝像頭可以填0,表示開啟預設的攝像頭。
通過對VideoCapture類的建構函式和open函式分析,可以發現opencv讀入視訊的方法一般有如下兩種。比如讀取當前目錄下名為"dog.avi"的視訊檔案,那麼這兩種寫法分別如下。
(1)先例項化再初始化:
VideoCapture capture;
capture.open("test1.mp4");
(2)在例項化的同時進行初始化:
VideoCapture("dog.avi");
3.VideoCapture::isOpened
C++: bool VideoCapture::isOpened()
功能:判斷視訊讀取或者攝像頭呼叫是否成功,成功則返回true。
4.VideoCapture::release
C++: void VideoCapture::release()
功能:關閉視訊檔案或者攝像頭。
5.VideoCapture::grab
C++: bool VideoCapture::grab()
功能:從視訊檔案或捕獲裝置中抓取下一個幀,假如呼叫成功返回true。(細 節請參考opencv文件說明)
6.VideoCapture::retrieve
C++: bool VideoCapture::retrieve(Mat& image, int channel=0)
功能:解碼並且返回剛剛抓取的視訊幀,假如沒有視訊幀被捕獲(相機沒有連線或者視訊檔案中沒有更多的幀)將返回false。
7.VideoCapture::read
C++: VideoCapture& VideoCapture::operator>>(Mat& image)
C++: bool VideoCapture::read(Mat& image)
功能:該函式結合VideoCapture::grab()和VideoCapture::retrieve()其中之一被呼叫,用於捕獲、解碼和返回下一個視訊幀這是一個最方便的函式對於讀取視訊檔案或者捕獲資料從解碼和返回剛剛捕獲的幀,假如沒有視訊幀被捕獲(相機沒有連線或者視訊檔案中沒有更多的幀)將返回false。
從上面的API中我們會發現獲取視訊幀可以有多種方法 :
// 方法一
capture.read(frame);
// 方法二
capture.grab();
// 方法三
capture.retrieve(frame);
// 方法四
capture >> frame;
8.VideoCapture::get
C++: double VideoCapture::get(int propId)
功能:一個視訊有很多屬性,比如:幀率、總幀數、尺寸、格式等,VideoCapture的get方法可以獲取這些屬性。
引數:屬性的ID。
屬性的ID可以是下面的之一:
員函式set(),設定相應屬性的值。cv::VideoCapture中提供的屬性標識如下:
CV_CAP_PROP_POS_MSEC 視訊當前點的毫秒值或視訊捕捉的時間戳
CV_CAP_PROP_POS_FRAMES 下次將被捕獲的0基索引的幀
CV_CAP_PROP_POS_AVI_RATIO 視訊檔案的相關位置 : 0 - start of the film, 1 - end of the film.
CV_CAP_PROP_FRAME_WIDTH 視訊流幀的寬度
CV_CAP_PROP_FRAME_HEIGHT 視訊流幀的高.
CV_CAP_PROP_FPS 幀率.
CV_CAP_PROP_FOURCC 4字元編碼的編碼器.
CV_CAP_PROP_FRAME_COUNT 視訊檔案的幀數.
CV_CAP_PROP_FORMAT 由retrieve()返回矩陣物件的格式(CV_U8C3) .
CV_CAP_PROP_MODE 後端指定值指示當前捕捉的模式.
CV_CAP_PROP_BRIGHTNESS 影象亮度(只對攝像頭).
CV_CAP_PROP_CONTRAST 影象對比度(only for cameras).
CV_CAP_PROP_SATURATION 影象飽和度(only for cameras).
CV_CAP_PROP_HUE 色調(only for cameras).
CV_CAP_PROP_GAIN 增益(only for cameras).
CV_CAP_PROP_EXPOSURE 曝光(only for cameras).
CV_CAP_PROP_CONVERT_RGB 布林型標記影象是否應該被轉換為RGB.
CV_CAP_PROP_WHITE_BALANCE 白平衡(only for cameras)
CV_CAP_PROP_RECTIFICATION 立體相機的矯正標記(note: only supported by DC1394 v 2.x backend currently)
Note: 當檢索到一個不被VideoCapture類後端支援的特性,返回0值.
VideoCapture::set基本與VideoCapture::get相同。
.VideoCapture::set
C++: bool VideoCapture::set(int propertyId, double value)
功能:設定VideoCapture類的屬性,設定成功返回ture,失敗返回false。
引數:第一個是屬性ID,第二個是該屬性要設定的值。
屬性ID如下:
CV_CAP_PROP_POS_MSEC 視訊當前點的毫秒值或視訊捕捉的時間戳
CV_CAP_PROP_POS_FRAMES 下次將被捕獲的0基索引的幀
CV_CAP_PROP_POS_AVI_RATIO 視訊檔案的相關位置 : 0 - start of the film, 1 - end of the film.
CV_CAP_PROP_FRAME_WIDTH 視訊流幀的寬度
CV_CAP_PROP_FRAME_HEIGHT 視訊流幀的高.
CV_CAP_PROP_FPS 幀率.
CV_CAP_PROP_FOURCC 4字元編碼的編碼器.
CV_CAP_PROP_FRAME_COUNT 視訊檔案的幀數.
CV_CAP_PROP_FORMAT 由retrieve()返回矩陣物件的格式(CV_U8C3) .
CV_CAP_PROP_MODE 後端指定值指示當前捕捉的模式.
CV_CAP_PROP_BRIGHTNESS 影象亮度(只對攝像頭).
CV_CAP_PROP_CONTRAST 影象對比度(only for cameras).
CV_CAP_PROP_SATURATION 影象飽和度(only for cameras).
CV_CAP_PROP_HUE 色調(only for cameras).
CV_CAP_PROP_GAIN 增益(only for cameras).
CV_CAP_PROP_EXPOSURE 曝光(only for cameras).
CV_CAP_PROP_CONVERT_RGB 布林型標記影象是否應該被轉換為RGB.
CV_CAP_PROP_WHITE_BALANCE 白平衡(only for cameras)
CV_CAP_PROP_RECTIFICATION 立體相機的矯正標記(note: only supported by DC1394 v 2.x backend currently)
Note: 當檢索到一個不被VideoCapture類後端支援的特性,返回0值.
10、視訊的寫操作cv::VideoWriter
cv::VideoWriter物件的建立有兩種方式,第一種是使用建構函式的形式,第二種使用open()的方式,具體如下:
cv::VideoWriter out(
const string& filename, // 輸入檔名
int fourcc, // 編碼形式,使用 CV_FOURCC()巨集
double fps, // 輸出視訊幀率
cv::Size frame_size, // 單幀圖片的大小
bool is_color = true // 如果是false,可傳入灰度影象
);
cv::VideoWriter out;
out.open(
"my_video.mpg", //輸出檔名
CV_FOURCC('D', 'I', 'V', 'X'), // MPEG-4 編碼
30.0, // 幀率 (FPS)
cv::Size(640, 480), // 單幀圖片解析度為 640x480
true // 只輸入彩色圖
);
同樣,向建立後的cv::VideoWriter物件寫入影象也有兩種方式,即write()操作和“<<”操作:
cv::VideoWriter::write(
const Mat& image // 寫入影象作為下一幀
);
my_video_writer << my_frame;