نواندیشان
0

هیچ محصولی در سبد خرید نیست.

ایجاد ویدئو از تصاویر متوالی در متلب

دسته بندی :دانلود و آموزش نرم افزار 2 آذر 1393 Imaaan 5717
ایجاد ویدئو از تصاویر متوالی

ایجاد ویدئو از تصاویر متوالی در متلب

فرض کنیم یه تعداد عکس یا تصویر داریم، می خوایم اینا رو توی یه فایل ویدئویی پشت سر هم نمایش بدیم. توی تاپیک (پست دوم) زیر یه مثال از نحوه ذخیره سازی انمیشنی که حالا مثلا با plot یا هر دستور دیگه داخل پنجره figure نمایش می دیم، وجود داره:

اما اینجا همونطور که گفتیم یه سری تصویر داریم که می خوایم به صورت ویدئو در بیاریم. من اینجا از یکی از مثال های خود متلب استفاده می کنم، عنوانش اینه: Create a New Video with the Image Sequence. دقیقا همون نیست، یه خورده شیوه نامگذاری رو عوض می کنم که نیاز به sort کردن پیدا نکنیم، فرمت ویدئو رو هم mp4 قرار میدم تا تفاوت حجمش با avi مشخص بشه، چون توضیحاتش رو هم نخوندم احتمالا متفاوت توضیح میدم.

اول از همه ما نیاز داریم که یه سری تصویر متوالی داشته باشیم، واسه اینکار می تونیم از یه ویدئو این تصاویر رو استخراج کنیم، در آخر دوباره این تصاویر استخراج شده رو به یه ویدئو تبدیل کنیم. متلب چند تا ویدئو داره، مثلا rhinos.avi که توی تولباکس Image Processing استفاده میشه، اما اینجا از shuttle.avi استفاده می کنم، که توی مثال متلب هم استفاده شده. اگه خواستین این ویدئو رو مشاهده کنین، اما نه با متلب با پلیر خودتون می تونین این دستور رو توی Command Window تایپ کنین:

کد:
winopen('shuttle.avi')

دستور winopen فایل مورد نظرتون رو باز می کنه، اما نه داخل متلب با برنامه ای که به ویندوزتون برای فایل هایی با اون پسوند در نظر گرفته، مثل اینکه روی فایل دابل کلیک کنین.

ایجاد ویدئو از تصاویر متوالی

shuttle

خب الان می خوایم هر فریم ویدئو رو به صورت یه تصویر ذخیره کنیم، از دستور VideoReader استفاده می کنیم، این دستور فایلمون رو نمی خونه، بلکه فقط آدرس و مشخصاتش رو نگه میداره، اینجوری RAMمون هم بی دلیل اشغال نمیشه اگه فایل ویدئویی حجیم باشه. خط بعدش نگاه می کنیم این فایلمون چند فریم داره، بعد هم یه فولدر درست می کنیم که تصویر های خروجی رو داخل اون بریزه.

کد:
clear;
myvideo = VideoReader('shuttle.avi');
framesNum = myvideo.NumberOfFrames;

if ~exist('ShuttleImages','dir')
    mkdir('ShuttleImages');
end

for i = 1:framesNum
    myframe = read(myvideo,i);
    namewithPath = sprintf('ShuttleImages\\%03d.png',i);
    imwrite(myframe,namewithPath,'png');
end

در ادامش روی فریم های ویدئومون یه حلقه میذاریم، که فریم به فریم بخونه و ذخیره کنه. یه توضیحی هم درمورد sprintf بدم، به علامت \ برای نمایش آدرس داخل این دستور باید از \\ استفاده کنیم. برای عددهای صحیح که از d% استفاده میشه، پس اون ۰۳ چیه که من گذاشتم، ۰۳ در واقع مشخص میکنه عددم همیشه از سه تا کاراکتر تشکیل بشه، برای اعدادی که کمتر از سه رقم دارن به تعداد مورد نیاز سمت راستش صفر قرار بده. با این روش دیگه نیاز به مرتب کردن موقع خوندن نداریم، چون در اون صورت اعداد یه رقمی، دو رقمی و … ترتیبشون بهم می خوره (مثلا ۱ و ۱۱ پشت سر هم قرار میگیرن، چون هر دو با یک شروع میشن).

فرمت فایل ها رو هم من png گذاشتم تا فشرده سازی نداشته باشیم، با همون کیفیت اصلی ذخیره بشن. خب تصاویر توی فولدر ShuttleImages ریخته میشه:

ایجاد ویدئو از تصاویر متوالی

تصاویر استخراج شده از ویدئو

می رسیم به بخش اصلی یعنی می خوایم این تصاویری که استخراج کردیم رو به صورت یه ویدئوی جدید در بیاریم. اسم تصاویر مورد نظرمون رو با دستور dir می خونیم، دیگه نگرانی بابت ترتیبشون نداریم چون قبلا در موردش فکر کرده بودیم.می تونیم تمام تصاویر رو اول بخونیم بعد ازشون استفاده کنیم، ولی خب نمی خوایم بی دلیل حافظه RAM رو اشغال کنیم، دونه دونه می خونیم و استفاده می کنیم. برای این کار هم یه چنین کدی نیاز داریم:

کد:
clear;
ImagesList = dir('ShuttleImages\*.png');

MyNewVideo = VideoWriter('MyNewVideo.mp4','MPEG-4');
MyNewVideo.FrameRate = 10;
open(MyNewVideo)

for i = 1:numel(ImagesList)
    myImage = imread(fullfile('ShuttleImages',ImagesList(i).name));
    
    writeVideo(MyNewVideo,myImage)
end

close(MyNewVideo);

بعد از اینکه تمام اسامی تصاویرمون رو توی ImagesList ریختیم، خب یه فایل خروجی برای ویدئومون نیاز داریم، من mp4 انتخاب کردم، واسه mp4 باید نحوه ی فشرده سازی ‘MPEG-4’ هم مشخص بشه، در غیر این صورت بازم avi ذخیره می کنه. واسه avi اون خط رو باید این شکلی بنویسیم:

کد:
MyNewVideo = VideoWriter('MyNewVideo.avi');

FrameRate رو هم ۱۰ گذاشتم، که واسه ویدئوی اصلی ۳۰ بود، معمولا هم همون ۳۰ استفاده میشه. واسه همین زمان ویدئوی من ۳ برابر شده و خیلی نسبت به ویدئوی اصلی آهسته تر هستش.

در آخر هم با winopen نمایشش میدیم، ببینیم چی درست شده، البته اگه نام یا فرمت رو تغییر دادین، باید این خط رو هم اصلاح کنیم:

کد:
winopen('MyNewVideo.mp4')
منبع: نواندیشان
مقالات، مطالب، طرح ها و پروژه های خود را برای قرارگیری در سایت علمی آموزشی نواندیشان از اینجا بفرستید.
Imaaan

برای ارتباط ساده‌تر و سریع‌تر اپلیکیشن نواندیشان را دانلود کنید. دانلود اپلیکیشن

مطالب زیر را حتما بخوانید:

قوانین ارسال دیدگاه در سایت

  • چنانچه دارای سوال فنی درباره محصول خریداری شده هستید، لطفاً از بخش حساب کاربری، تیکت ارسال کنید.
  • چنانچه دیدگاهی توهین آمیز باشد و متوجه اشخاص مدیر، نویسندگان و سایر کاربران باشد تایید نخواهد شد.
  • چنانچه دیدگاه شما جنبه ی تبلیغاتی داشته باشد تایید نخواهد شد.
  • چنانچه در دیدگاه خود از شماره تماس، ایمیل و آیدی تلگرام استفاده کرده باشید تایید نخواهد شد.

  1. فاضلی گفته؛
    06:55 1393/09/25

    آیا در مورد سیم هیدرولیک نرم افزار متلب چیزی میدانید نه سیمولینک

    • Imaaan گفته؛
      09:04 1393/09/26

      سلام دوست عزیز

      سوالتون رو توی تالار گفتگو مطرح کنین، امیدوارم بتونیم کمکتون کنیم.

  2. سعید گفته؛
    15:49 1395/10/18

    خیلی دمت گرم.کارم رو راه انداختی

  3. Hamid گفته؛
    01:20 1399/01/08

    خیلییییییی محششششششششششر بود توضیحاتتون, عالیییی یه دنیا سپاس

  4. Hamid گفته؛
    01:38 1399/01/08

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

    • Hamid گفته؛
      04:34 1399/01/08

      یافتم

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

لینک کوتاه:
کارایی بهتر در اندروید نواندیشان
0