2015-12-16 2 views
-1

Я начинаю изучать OpenCV, но у меня есть некоторые трудности с пониманием последнего аргумента (двойное значение) этой функцииOpenCV: понимание функции cvsetcaptureproperty и аргумент

int cvSetCaptureProperty(CvCapture* capture, int property_id, double value) 

Я понимаю, что это propoerty используется в C++, но как работает ли он в коде ниже?

void onTrackSlide(int pos) 
{ 
    cvSetCaptureProperty(cap, CV_CAP_PROP_POS_FRAMES, pos); 
} 

тогда оно называется в основной программе, как это:

cvCreateTrackbar("position", "example3", &slider, frames, onTrackSlide); 

Я не понимаю, почему позиция никогда не заполняется или используется в качестве аргумента функции onTrackSlide.

здесь является полная программа:

#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

Вы просто перемещаетесь в видео. Когда вы перемещаете ползунок по значению 'pos', вы перемещаетесь на' pos'-й кадр в видео. – Miki

+0

Да, точно я двигаюсь, я попытался изменить код для функции ниже, переместив int pos в качестве аргумента в ядро ​​функции, но это не сработало, у вас есть идея, почему? void onTrackSlide() { int pos; cvSetCaptureProperty (cap, CV_CAP_PROP_POS_FRAMES, pos); } – saadamiens

+0

Где будет инициализировано «pos» с правильным значением? – Miki

ответ

1

createTrackbar является функцией OpenCV пользовательского интерфейса (Highgui), который принимает функцию обратного вызова onChange:

C++: Int createTrackbar (Const строки & trackbarname, const string & winname, int * значение, int count, TrackbarCallback onChange = 0, недействительным * UserData = 0)

C: INT cvCreateTrackbar (Const символ * trackbar_name, Const символ * window_name, Int * значение, количество INT, CvTrackbarCallback on_change = NULL)

, где

OnChange - Указатель на функцию, которая будет вызываться каждый раз меняет положение ползунка. Эта функция должно быть прототип, как ничтожная Foo(int,void*);, где первого параметром является позиция TrackBar

вы определили вы обратный вызов 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, чтобы получить текущее значение TrackBar.

+0

спасибо за ваш ответ, поэтому, когда я перемещаю курсор трекбара, int pos автоматически заполняется аргументом функции onTrackSlide, это правильно, еще раз спасибо за помощь. – saadamiens

+0

Да, правильно. Не забудьте отметить как ответ/upvote – Miki

+0

Выполнено, спасибо miki – saadamiens

Смежные вопросы