opencv中cvSetCaptureProperty定位不準的原因及解決

來源:互聯網
上載者:User

出處:http://blog.csdn.net/friedvan/article/details/6195777 (opencv2.3.1仍然有這問題)

以前在opencv2.0裡面用到cvSetCaptureProperty函數的時候總是發生定位不準確的問題,明明是讓其跳到100幀,結果卻總不是100幀,定位一段連續的視頻,總是出現跳躍的現象。同樣的代碼在opencv1.0裡面完全沒錯。可是這是為什嗎?這個問題一直困擾了我半年,終於在今天知道原因了。

經過差不多一晚上的探究,得出粗略的結論。原因在於opencv2.0以後,採用ffmpeg採集視頻,而在opencv1.0採用vfw採集視頻(具體的概念暫時還不清楚,有時間繼續補上)。而opencv在定位時候,調用的ffmpeg的av_seek_frame()函數,此函數原型為:

int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags);

其中,最後一個參數有

AVSEEK_FLAG_BACKWARD = 1; ///< seek backward
AVSEEK_FLAG_BYTE     = 2; ///< seeking based on position in bytes
AVSEEK_FLAG_ANY      = 4; ///< seek to any frame, even non key-frames

ffmpeg預設的是選取主要畫面格(這個概念需要具體定義)。opencv裡面這個函數的參數flag是0,

int ret = av_seek_frame(ic, video_stream, timestamp, 0);

也就是按照預設的讀取主要畫面格。因此,視頻跳躍就出現了。

解決這個問題需要將0改為 AVSEEK_FLAG_ANY ,即:

int ret = av_seek_frame(ic, video_stream, timestamp, AVSEEK_FLAG_ANY );

之後重新編譯opencv庫,就可以了。

 

P.S:測試的代碼

#include "opencv/highgui.h"#include <iostream>using namespace std;int main( int argc, char** argv ){ cvNamedWindow( "Example2", CV_WINDOW_AUTOSIZE );CvCapture* capture = cvCreateFileCapture( "d://11.avi" );IplImage* frame;int pos=0;int pos1=0;while(1){cvSetCaptureProperty(capture,CV_CAP_PROP_POS_FRAMES,pos);cout<<pos;frame = cvQueryFrame(capture);pos1=cvGetCaptureProperty(capture,CV_CAP_PROP_POS_FRAMES);cout<<"/t"<<pos1<<endl;if( !frame ) break;cvShowImage( "Example2", frame );char c = cvWaitKey(33);if( c == 27 ) break;pos++;}cvReleaseCapture( &capture );cvDestroyWindow( "Example2" );}

參考:http://wsqhs.spaces.live.com/blog/cns!94F639580F58209C!697.entry

http://www.ffmpeg.com.cn/index.php/%E5%85%B3%E4%BA%8E_frame%E7%9A%84%E4%B8%80%E4%BA%9B%E5%9F%BA%E6%9C%AC%E7%9F%A5%E8%AF%86

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.