一、前言-簡介
在試驗中需要常常將實驗結果進行保存,在opencv中提供很好用的錄制視頻的句柄,也可稱之為類-videowriter。
videowriter應用那是相當的簡單,總之分為三步:
//聲明 VideoWriter writer; //打開 writer.open("C:\\Users\\lenovo\\Documents\\04.avi",CV_FOURCC('M', 'J', 'P', 'G'), rate, //不進行跟蹤,定位,只顯示、錄制時的幀率 Size(inFrame.cols,inFrame.rows), true); if (!writer.isOpened()) { return; } //輸入 writer<<inFrame; //釋放 writer.release();
open ( const char* filename, int fourcc, double fps, CvSize frame_size, int is_color=1 );
- filename 輸出視頻文件名。
- fourcc為 四個字符用來表示壓縮幀的codec 例如:
- CV_FOURCC('P','I','M','1') = MPEG-1 codec
- CV_FOURCC('M','J','P','G') = motion-jpeg codec
- CV_FOURCC('M', 'P', '4', '2') = MPEG-4.2 codec
- CV_FOURCC('D', 'I', 'V', '3') = MPEG-4.3 codec
- CV_FOURCC('D', 'I', 'V', 'X') = MPEG-4 codec
- CV_FOURCC('U', '2', '6', '3') = H263 codec
- CV_FOURCC('I', '2', '6', '3') = H263I codec
- CV_FOURCC('F', 'L', 'V', '1') = FLV1 codec
- 若編碼器代號為 -1,則運行時會彈出一個編碼器選擇框.
- fps 被創建視頻流的幀率。
- frame_size 視頻流的大小。
- is_color 如果非零,編 碼器將希望得到彩色幀並進行編碼;否則,是灰度幀(只有在Windows下支持這個標志)。
二、應用難點
應用中出現的問題歸結為:
- 1、打不開
- 2、保存文件為空
- 3、保存的文件打不開
1、打不開
a、輸入路徑名稱不對
在程序中經常遇到打不開的問題,最常見的問題是路徑輸入不對比如:
strvideoFile = "C:\Users\lenovo\Documents\visual studio 2010\TestMyClass\Testopencv\3.avi
上述代碼中賦值操作,因為轉義符的原因讀入內存中,路徑就會出現問題,結果為:
C:UserslenovoDocumentsisual studio 2010TestMyClassTestopencv.avi
當然打不開了,所以在程序中一定注意轉義符的問題。
正確的路徑命名方式為:
strvideoFile = "C:/Users/lenovo/Documents/visual studio 2010/TestMyClass/Testopencv/3.avi"; strvideoFile = "C:\\Users\\lenovo\\Documents\\visual studio 2010\\TestMyClass\\Testopencv\\3.avi";
b、編碼格式不對
在open函數中第二個參數是編碼格式,一定按照提供的編碼格式進行填寫,在應用中最好的解決方法是為-1。當為-1時,程序對彈出如下對話框供你選擇
這樣就沒有問題啦,很容易解決編碼問題。
2、保存文件為空
這種問題往往是后綴名不對,自己試過.Mp4沒有成功,后來改為.avi就成功了
3、保存文件打不開
其實注意上面兩個問題,就可以進行錄制視頻了,在錄制視頻無法打開打開問題,這個就不好排查了。
但可以講一下自己遇到的問題:
最常見的問題是幀率設置不對,已經幀大小不對。
三、實例代碼
string strimgfile,strvideoFile ; /*strimgfile = "C:\Users\lenovo\Documents\visual studio 2010\TestMyClass\Testopencv\12.png"; strvideoFile = "C:\Users\lenovo\Documents\visual studio 2010\TestMyClass\Testopencv\3.avi";*/ strimgfile = "C:/Users/lenovo/Documents/visual studio 2010/TestMyClass/Testopencv/12.png"; //strvideoFile = "C:/Users/lenovo/Documents/visual studio 2010/TestMyClass/Testopencv/3.avi"; //strvideoFile = "C:\\Users\\lenovo\\Documents\\visual studio 2010\\TestMyClass\\Testopencv\\3.avi"; //strimgfile = "12.png"; //strvideoFile = "3.avi"; strvideoFile = "C:\Users\lenovo\Documents\visual studio 2010\TestMyClass\Testopencv\3.avi"; Mat frame = imread(strimgfile); namedWindow("圖像"); imshow("圖像",frame); namedWindow("視頻"); VideoCapture capture; VideoWriter writer; capture.open(strvideoFile); Mat inFrame; if (!capture.isOpened()) { return; } int rate = capture.get(CV_CAP_PROP_FPS); int delay = 1000/rate; capture>>inFrame; writer.open("C:\\Users\\lenovo\\Documents\\04.avi",CV_FOURCC('M', 'J', 'P', 'G'), rate, //不進行跟蹤,定位,只顯示、錄制時的幀率 Size(inFrame.cols,inFrame.rows), true); if (!writer.isOpened()) { return; } while(true) { capture>>inFrame; writer<<inFrame; imshow("視頻",inFrame); waitKey(delay); if (!capture.grab()) { break; } } writer.release(); system("pause");