Tiny Tech

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

اجرای یک ویدئو با OpenCV ، تقریبا به اسانی نمایش تصویر ساده است.

تنها مسئله ی جدیدی که بایستی با ان روبرو شویم، ان است که به یک حلقه برای دسترسی به هر قاب در یک دنباله ویدئویی احتیاج داریم.

همچنین باید بتوانیم راهی برای خروج از حلقه – اگر فیلم خیلی خسته کننده است – پیدا کنیم.

مثال اول

یک برنامه ساده OpenCV برای اجرای یک ویدئو از روی فایل

 

#include "highgui.h"
int main( int argc, char** argv ) {
cvNamedWindow( "Example2", CV_WINDOW_AUTOSIZE );
CvCapture* capture = cvCreateFileCapture( argv[1] );
IplImage* frame;
while(1) {
frame = cvQueryFrame( capture );
if( !frame ) break;
cvShowImage( "Example2", frame );
char c = cvWaitKey(33);
if ( c == 27 ) break;
}
cvReleaseCapture( &capture );
cvDestroyWindow( "Example2" );
}

 

تابع ()main را با ایجاد یک پنجره نامگذاری شده ( در این مثال “Example2” ) اغاز می کنیم.

پس از ان کار ها کمی جذاب تر می شوند.

 

cvNamedWindow( "Example2", CV_WINDOW_AUTOSIZE );

 

تابع ()cvNamedWindow نام فایل AVI که بایستی بارگذاری شود را به عنوان ارگومان گرفته و یک اشاره گر به یک ساختار CvCapture بر میگرداند.

این ساختار شامل همه اطلاعات در مورد فایل AVI است که بایستی خوانده شود.

ساختار CvCapture به ابتدای فایل AVI مقداردهی اولیه می شود.

 

frame = cvQueryFrame( capture );

 

پس از ورود به حلقه (۱)while شروع به خواندن فایل AVI می کنیم.

()cvQueryFrame بع عنوان ارگومان، یک اشاره گر به ساختار CvCapture بر می گیرد.

سپس قالب ویدیویی بعدی بعدی را به حافظه ( حافظه ای که در حقیقت بخشی از ساختار CvCapture است ) وارد می کند و یک اشاره گر را به ان قاب را برمیگرداند.

بر خلاف cvLoadImage که در حقیقت حافظه برای تصویر اختصاص می دهد، cvQueryFrame از حافظه ای که قبلا در ساختار CvCapture اختصاص داده شده است اسفاده می کند.

بنابراین نیازی نیست که برای این اشاره گر قاب، ()cvReleaseImage را فراخوانی کنیم.

در عوض این حافظه زمانی که ساختار CvCapture ازاد می گردد، باز پس داده می شود.

 

char c = cvWaitKey(33);
if ( c == 27 ) break;

 

پس از ان که قاب نمایش داده شد، برنامه برای ۳۳ میلی ثانیه صبر کرده و اگر کاربر کلیدی را فشار داد مقدار اسکی ان را در c ریخته میشود؛ در غیر این صورت مقدار ان را به ۱- تنظیم می شود.

اگر کاربر کلید ESC ( اسکی ۲۷ ) را فشار دهد، برنامه از حلقه خارج می شود.

در غیر این صورت پس از گذشت ۳۳ میلی ثانیه، جلفه دوباره اجرا می شود.

بهتر است یاداوری کنم که در این مثال ساده، به طور صحیح سرعت ویدیو را کنترل نمیکنیم بلکه تنها روی تایمر در ()cvWaitKey برای تاخیر در بارگذاری قاب ها تکیه می کنیم.

در یک برنامه پیچیده تر، عاقلانه تر ان است که نرخ قاب واقعی را از ساختار CvCapture ( از AVI ) خوانده و طبق ان عمل کنیم.

 

cvReleaseCapture( &capture );

 

وقتی به هر دلیل از حلقه خواندن خارج شدیم – به دلیل این که دیگر داده ویدیویی وجود ندارد یا این که کاربر کلید Esc را فشار داده است – می توانیم حافظه ی اختصاص داده شده به ساختار CvCapture را ازاد کنیم .

این کار تمام دسترسی های باز به این فایل AVI را می بندد.

خوب اکنون زمان ان رسیده تا کمی بیشتر تفکر کنیم، برنامه ی کوچک خود را ارتقا داده و کمی بیشتر توابع موجود را کشف کنیم.

اولین چیزی که ممکن است در مورد اجرا کننده ی AVI متوجه شویم ان است که هیچ راهی ربای جلو عقب کردن ویدیو وجود ندارد.

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

بسته ابزار HighGUI شامل دستورالعمل های ساده برای کار کردن با تصاویر و ویدیو همراه با توابع سادهای برای نمایش است یک مکانیزم مفید که به ما کمک می کند به اسانی از یک قسمت ویدیو به قسمت دیگر پرش کنیم، نوار لغزان است.

برای ایجاد یک نوار لغزان، cvCreateTrackbar را فراخوانی کرده و مشخص می کنیم که در کدام پنجره می خواهیم این نوار نشان داده شود.

برای بدست اوردن عملکرد دلخواه، احتیاج به تهیه یک callback داریم تا در هنگام جابجا شدن نوار لغزان فراخوانی می شود.

 

 

برای مشاهده ی مثال پست بعدی را مشاهده کنید.