我开始学习openCv但是我在理解这个函数的最后一个参数(double value)时遇到了一些困难
int cvSetCaptureProperty(CvCapture* capture, int property_id, double value)
我知道这是c ++中使用的propoerty,但它在下面的代码中是如何工作的?
void onTrackSlide(int pos)
{
cvSetCaptureProperty(cap, CV_CAP_PROP_POS_FRAMES, pos);
}
然后在主程序中调用它,如下所示:
cvCreateTrackbar("position", "example3", &slider, frames, onTrackSlide);
我不明白为什么在onTrackSlide函数的参数中从未填充或使用过pos。
这是完整的程序:
#include<opencv\cv.h>
#include<opencv\highgui.h>
#include "opencv2/opencv.hpp"
//#include <iostream>
using namespace cv;
int slider=0;
CvCapture* cap = NULL;
void onTrackSlide(int pos)
{
cvSetCaptureProperty(cap, CV_CAP_PROP_POS_FRAMES, pos);
}
int main(int argc, char ** argv)
{
cvNamedWindow("example3", CV_WINDOW_AUTOSIZE);
cap = cvCreateFileCapture(argv[1]);
int frames = (int)cvGetCaptureProperty(cap, CV_CAP_PROP_FRAME_COUNT);
if (frames != 0)
{
cvCreateTrackbar("position", "example3", &slider, frames, onTrackSlide);
}
IplImage* frame;
while (1)
{
frame = cvQueryFrame(cap);
if (!frame)break;
cvShowImage("example3", frame);
char c = cvWaitKey(33);
if (c == 27) break;
}
cvReleaseCapture(&cap);
cvDestroyWindow("example3");
}
答案 0 :(得分:1)
createTrackbar是OpenCV用户界面(Highgui
)的函数,它接受回调函数onChange
:
C ++: int createTrackbar(const string&amp; trackbarname,const string&amp; winname,int * value,int count, TrackbarCallback onChange = 0 ,void * userdata = 0)
C: int cvCreateTrackbar(const char * trackbar_name,const char * window_name,int * value,int count, CvTrackbarCallback on_change = NULL )
其中
onChange - 指向每次滑块更改位置时要调用的函数的指针。此函数应原型为void
Foo(int,void*);
,其中第一个参数是轨迹栏位置
您定义了回调onChange
,如:
void onTrackSlide(int pos)
{
// pos is the current trackbar position
...
}
由Highgui
内部回调系统调用。每次移动轨迹栏时,都会使用新的pos
值调用回调。
从评论中,您定义了一个回调函数,如:
void onTrackSlide()
{
int pos;
cvSetCaptureProperty(cap, CV_CAP_PROP_POS_FRAMES, pos);
}
且此不会有效,因为变量pos
永远不会被初始化。
您也可以使用getTrackbarPos获取轨道栏的当前值。