Zeina Almakdisi نشر 8 سبتمبر 2023 أرسل تقرير نشر 8 سبتمبر 2023 مرحبا.. لدي كود برمجي يستخرج صور من الفيديوهات يعمل دون مشاكل لكن مااحتاجه هو الحصول على صورة كل 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 1 اقتباس
0 بلال زيادة نشر 8 سبتمبر 2023 أرسل تقرير نشر 8 سبتمبر 2023 يمكنك تعديل قيمة الإطار الزمني الذي تقوم بتسجيل الصور به. في الكود الحالي، يتم التقاط إطار الفيديو وحفظه في كل دورة بوحدة الثانية. لذا، يمكنك تغيير هذه الوحدة إلى 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 ثانية. 1 اقتباس
0 Kais Hasan نشر 8 سبتمبر 2023 أرسل تقرير نشر 8 سبتمبر 2023 في البداية من الجيد توضيح أن الكود الخاص بك لا يقوم بجلب صورة كل ثانية، و إنما يقوم في كل مرة بجلب frame من الفيديو، و بالتالي الوقت بين كل صورتين كزمن يتحدد حسب ال fps الخاص بالفيديو، حالياً أنت تقومين بجلب كافة الصور في الفيديو. حتى يمكنك جلب الصور كل فترة معينة من الزمن يمكنك الانتقال يدوياً إلى اللحظة المناسبة في الفيديو، مثلاً نبدأ عن اللحظة 0 ثم ننتقل إلى 30 ثانية لاحقة و هكذا. يمكنك استعمال الطريقة set على الغرض vs للقيام بذلك، كما يلي: vs.set(cv2.CAP_PROP_POS_MSEC, 30*1000) طبعاً هنا الوقت يمثل بالميلي ثانية لذلك قمت بالضرب ب 1000. لذلك يمكنك كتابة حلقة for للقيام بالانتقال كل مرة إلى النقطة التي تبعد عن النقطة الحالية 30 ثانية زمنياً. بعد الانتقال إلى اللحظة الزمنية المناسبة يمكنك فقط قراءة الفريم عن طريق التابع read. يمكنك الإطلاع أكثر على التابع المذكور من هنا. 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
2 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.