今天刚开始学opencv,计算机视觉就这样被斯坦福的牛人写出开源库了,相比之下我好像无关紧要的普通人,很自卑啊...
不过,起点低不是问题,要一直坚持下去。好了,说说我弄了一个多小时的事情吧。
运行eg ch2-2:
于是我去源码里看:
cvCreateFileCapture 这个函数还是做得很好的,可以兼容很多多媒体编解码库。
不过,起点低不是问题,要一直坚持下去。好了,说说我弄了一个多小时的事情吧。
运行eg ch2-2:
1 cvNamedWindow("T2", CV_WINDOW_AUTOSIZE);
2 //CvCapture *cap = cvCreateFileCapture(argv[1]);
3 CvCapture* cap = cvCreateFileCapture( "test.avi" );
4 if (!cap)
5 printf("Nothing has been captured!\n");
6 IplImage *frame;
7 while(1)
8 {
9 frame = cvQueryFrame(cap);
10 if (!frame)
11 {
12 break;
13 }
14 cvShowImage("T2", frame);
15 char c = cvWaitKey(33);
16 if (c == 27)
17 break;
18
19 }
20 cvReleaseCapture(&cap);
21 cvDestroyWindow("T2");
结果视频怎么也播放不出来,窗口一闪而过。2 //CvCapture *cap = cvCreateFileCapture(argv[1]);
3 CvCapture* cap = cvCreateFileCapture( "test.avi" );
4 if (!cap)
5 printf("Nothing has been captured!\n");
6 IplImage *frame;
7 while(1)
8 {
9 frame = cvQueryFrame(cap);
10 if (!frame)
11 {
12 break;
13 }
14 cvShowImage("T2", frame);
15 char c = cvWaitKey(33);
16 if (c == 27)
17 break;
18
19 }
20 cvReleaseCapture(&cap);
21 cvDestroyWindow("T2");
于是我去源码里看:
CV_IMPL CvCapture * cvCreateFileCapture (const char * filename)
|
| // #ifdef WIN32
V
CvCapture* cvCreateFileCapture_Win32(const char * filename)
{
CvCapture_FFMPEG_proxy* result = new CvCapture_FFMPEG_proxy;
if( result->open( filename ))
return result;
delete result;
return cvCreateFileCapture_VFW(filename);
}
很显然,如果用ffmpeg打开视频失败就会调用windows SDK的AVIFileOpen,但是很诡异的是书的examples里面的test.avi竟然不能被解码。我用windows media player也打不开,说明AVIFileOpen确实很弱。于是我去编译了opencv的release源码,一定要是release,因为源码里面LoadLibrary的时候就是导入的opencv_ffmpeg200.dll。这样有了这个动态库之后就可以流程的播放视频了。|
| // #ifdef WIN32
V
CvCapture* cvCreateFileCapture_Win32(const char * filename)
{
CvCapture_FFMPEG_proxy* result = new CvCapture_FFMPEG_proxy;
if( result->open( filename ))
return result;
delete result;
return cvCreateFileCapture_VFW(filename);
}
cvCreateFileCapture 这个函数还是做得很好的,可以兼容很多多媒体编解码库。

