اذهب إلى المحتوى
  • 0

الحصول على صورة كل 30 ثانية بدلا من كل 1 ثانية

Zeina Almakdisi

السؤال

مرحبا..

لدي كود برمجي يستخرج صور من الفيديوهات يعمل دون مشاكل

لكن مااحتاجه هو الحصول على صورة كل 30 ثانية بدلا من كل 1 ثانية

# from video2images import Video2Images

import cv2 

vcap = cv2.VideoCapture()
# set frame width and height
vcap.set(cv2.CAP_PROP_FRAME_WIDTH, 480)
vcap.set(cv2.CAP_PROP_FRAME_HEIGHT, 640)
vcap.open(100)

vs=cv2.VideoCapture('VideoDoor//aaa.mp4')###input

prop=cv2.CAP_PROP_FRAME_COUNT
total=int(vs.get(prop))
print(" [INFO] {} total frame in video".format(total))

ret, img=vs.read()  
print(ret)

count=0

while ret:
    
    cv2.imwrite("Images//frame%d.jpg" %count , img) ###output foldir
    ret, img=vs.read()
    print('Read a new frame:',count,ret)
    count += 1

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 0

يمكنك تعديل قيمة الإطار الزمني الذي تقوم بتسجيل الصور به. في الكود الحالي، يتم التقاط إطار الفيديو وحفظه في كل دورة بوحدة الثانية. لذا، يمكنك تغيير هذه الوحدة إلى 30 ثانية كما يلي:

import cv2

vs = cv2.VideoCapture('VideoDoor//aaa.mp4')  # مسار الفيديو الخاص بك

frame_rate = 30  # تحديد معدل الإطار المطلوب (هنا 30 إطار في الثانية)

count = 0
while True:
    ret, img = vs.read()
    if not ret:
        break
    
    if count % frame_rate == 0:
        cv2.imwrite("Images//frame%d.jpg" % count, img)  # حفظ الصورة
    
    count += 1

vs.release()

في هذا الكود، نستخدم frame_rate لتحديد عدد الإطارات التي نقوم بحفظها، ونحفظ إطارًا فقط إذا كان count متعددًا لـ 30، مما يسمح بحفظ صورة كل 30 ثانية.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

في البداية من الجيد توضيح أن الكود الخاص بك لا يقوم بجلب صورة كل ثانية، و إنما يقوم في كل مرة بجلب frame من الفيديو، و بالتالي الوقت بين كل صورتين كزمن يتحدد حسب ال fps الخاص بالفيديو، حالياً أنت تقومين بجلب كافة الصور في الفيديو.

حتى يمكنك جلب الصور كل فترة معينة من الزمن يمكنك الانتقال يدوياً إلى اللحظة المناسبة في الفيديو، مثلاً نبدأ عن اللحظة 0 ثم ننتقل إلى 30 ثانية لاحقة و هكذا. يمكنك استعمال الطريقة set على الغرض vs للقيام بذلك، كما يلي:

vs.set(cv2.CAP_PROP_POS_MSEC, 30*1000)

طبعاً هنا الوقت يمثل بالميلي ثانية لذلك قمت بالضرب ب 1000.

لذلك يمكنك كتابة حلقة for للقيام بالانتقال كل مرة إلى النقطة التي تبعد عن النقطة الحالية 30 ثانية زمنياً.

بعد الانتقال إلى اللحظة الزمنية المناسبة يمكنك فقط قراءة الفريم عن طريق التابع read.

يمكنك الإطلاع أكثر على التابع المذكور من هنا.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...