Tiny Tech

مقدمه ای بر OpenCV – بخش چهارم

برنامه اضافه کردن یک نوار لغزان به پنجره پایه

زمانی که لغزنده جا به جا می شود، تابع ()onTrackbarSlide فراخوانی شده و مقدار جدید لغزاننده به ان پاس داده می شود.

#include "cv.h"
#include "highgui.h"
int g_slider_position = 0;
CvCapture* g_capture = NULL;
void onTrackbarSlide(int pos){
cvSetCaptureProperty(g_capture, CV_CAP_PROP_POS_FRAMES, pos);
}
int main(int argc, char** argv){
cvNamedWindow( "Example3", CV_WINDOW_AUTOSIZE );
g_capture = cvCreateFilecapture( argv[1] );
int frames = (int) cvGetCaptureProperty ( g_capture, CV_CAP_PROP_FRAME _COUNT);
if(framesl = 0){
cvCreateTrackbar( "Position", "Example3", &g_slider_position, frames, onTrackbarSlide );
}
IplImage* frame;
return 0;
}

در اصل استراتژیاین برنامه استفاده از یک متغیر سراسری برای نمایش موقعیت لغزانندهاست و سپس اضافه کردن یک callback که یک متغیر را به روز کرده و موقعیت خواندن در ویدیو را مجددا تعیین نمایید.

بیایید به جزییات نگاهی بیندازیم.

int g_slider_position = 0;
CvCapture* g_capture = NULL;

ابتدا یک متغیر سراسری برای موقعیت لغزاننده تعریف می کنیم.

Callback نیاز به دسترسی به شئ capture دارد.

برای همین ان را به صورت متغیر سراسری تعریف می کنیم.

از ان جایی می خواهیم کد خوانا و قابل فهم باشد، قرارداد می کنیم که به متغیر های سراسری یک پیشوند _g اضافه کنیم.

void onTrackbarSlide(int pos){
cvSetCaptureProperty(g_capture, CV_CAP_PROP_POS_FRAMES, pos);
}

اکنون یک روتین callback تعریف می کنیم تا هنگام ضربه زدن کاربر به لغزاننده، مورد استفاده قرار گیرد.

به این تابع یک مقدار صحیح ۳۲ بیتی که موقعیت لغزاننده است، ارسال می شود.

فراخوانی ()cvSetCaptureProperty چیزی است که در اینده ان را به همراه تابع متناظرش ()cvGetCaptureProperty زیاد می بینیم.

این روتین به ما اجازه می دهد تا ویژگی های مختلف شئ CvCapture را پیکربندی کنیم.

در این مثال ارگومان CV_CAP_PROP_POS_FRAMES به تابع ارسال شود، به این معنا که می خواهیم موقعیت خواندن در واحد قاب را تنظیم کنیم ( اگر خواسته باشیم موقعیت را به عنوان بخشی از طول کل ویدئو تنظیم کنیم، می توانیم به جای FRAMES از AVI_RATIO استفاده کنیم ).

در نهایت مقدار جدید موقعیت لغزاننده ارسال شود.

int frames = (int) cvGetCaptureProperty ( g_capture, CV_CAP_PROP_FRAME _COUNT);

از تابع ()cvGetCaptureProperty برای گرفتن برخی اطلاعات در مورد ساختار CvCapture استفاده می کنیم.

در این مثال می خواهیم ببینیم چه تعداد قاب در ویدیو وجود دارد تا لغزاننده را در مرحله بعد تنظیم کنیم.

if(framesl = 0){
cvCreateTrackbar( "Position", "Example3", &g_slider_position, frames, onTrackbarSlide );
}

اخرین مرحله ایجاد خود نوار لغزان است.

تابع ()cvCreateTrackbar به ما اجازه می دهد تا هب نوار لغزان یک عنوان ( در این مثال Position ) داده و یم پنجره را برای قرار دادن نوار در ان مشخص نماییم.

پس متغیر مقید به نوار لغزان، ماکزیمم مقدار نوار لغزان و یک callback ( یا اگر نخواستیم نال ) برای زمانی که لغزاننده جا به جا می شود، تعیین می گردد.

دقت کنید که اگر ()cvGetCaptureProperty تعداد قاب را صفر برگرداند، نوار لغزان را ایجاد نمی کنیم؛ زیرا گاهی بسته به این که ویدیو چگونه کد شده است، تعداد قاب ها موجود نیست.

در این حالت تنها ویدیو را بدون نوار لغزان نمایش می هیم.