《学习OpenCV(中文版)》例2-3
本帖最后由 ptsntwsz 于 2011-07-17 11:52:11 编辑 代码如下:
#include <highgui.h>
int g_sliderPosition = 0; // start position
CvCapture* g_capture = NULL;
void OnTrackbarSlide (int pos)
{
cvSetCaptureProperty(g_capture, CV_CAP_PROP_POS_FRAMES, pos);
}
int main (int args, char** argv)
{
cvNamedWindow("Example3", CV_WINDOW_AUTOSIZE);
if (args == 2 && (g_capture = cvCreateFileCapture(argv[1])) != NULL) {
int frameNum = (int)cvGetCaptureProperty(g_capture, CV_CAP_PROP_FRAME_COUNT);
if (frameNum)
cvCreateTrackbar("position", "Example3", &g_sliderPosition, frameNum, OnTrackbarSlide);
IplImage* frame;
while (1) {
frame = cvQueryFrame(g_capture);
if (frame == NULL)
break;
cvShowImage("Example3", frame);
char c = cvWaitKey(33); // wait for 33ns
if (c == 27) // Esc
break;
}
cvReleaseCapture(&g_capture);
cvDestroyWindow("Example3");
return 0;
}
else
return -1;
}
运行时没有问题,但是如果将滚动条拖到接近末尾的地方(只是接近末尾,还没有达到末尾),建立的播放窗口就关闭了,然后在控制台窗口中有如下提示:
HIGHGUI ERROR: AVI: could not seek to position 0.003
请问这是怎么一回事?为什么会有这个ERROR,它在什么情况下产生?而且为什么是0.003(有时候是出现多条提示,但是都是0.003)?希望有朋友可以具体解释其原因,谢谢了~
[解决办法]
有些时候与软件无关,和你要播放的源文件有关系的。
[解决办法]
回调函数大概的意思就是当你触发某个事件的时候,这个回调函数作为对这个事件的响应,会被调用。这里拖动进度条就是触发OnTrackbarSlide的事件,每次拖动进度条时OnTrackbarSlide都会被调用,你可以在OnTrackbarSlide里面加一句COUT输出点东西出来看看。
整个调用机制应该是OPENCV开出的窗口来自动维护的,所以不管后面的代码是什么,只要拖动进度条就会触发OnTrackbarSlide函数~
OnTrackbarSlide函数中重新设置了AVI当前帧的位置,所以执行完OnTrackbarSlide以后会接着跑WHILE循环里的东西,这个时候拿到的帧就是从重新设置的位置开始的了~
[解决办法]
是因为CMD和VS默认的工作目录不一样,总之就是VS找不到opencv_highgui231d.dll这个库,最简单的方式是吧这个文件找到,然后在可执行程序所在目录拷贝一份,
弱弱的问一下,2.31都有了?
[解决办法]
回调函数,,记得貌似在linux系统编程中有类似的,类似于硬件中断,
函数名可做为函数指针使用
[解决办法]
回调函数是在这一句里调用的,cvCreateTrackbar("position", "Example3", &g_sliderPosition, frameNum, OnTrackbarSlide);
最后一个参数即回调函数的名字即指针