opencv:了解cvsetcaptureproperty函数和参数

时间:2015-12-16 16:11:11

标签: c++ visual-studio opencv opencv3.0

我开始学习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");


}

1 个答案:

答案 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获取轨道栏的当前值。