استخدم هذه التقنية لتطبيق بعض الرياضيات الذكية على مقاطع الفيديو الخاصة بك وتقليل الاهتزاز.

يُعد تثبيت الفيديو تقنية تقلل الحركة غير المرغوب فيها والاهتزاز في لقطات الفيديو. يمكن أن يتسبب التصوير اليدوي والاهتزاز والحركة في حركات الكاميرا غير المستقرة. ينتج عن تثبيت الفيديو فيديو أكثر سلاسة.

الهدف الأساسي من تثبيت الفيديو هو تقدير حركة الكاميرا بين الإطارات المتتالية. يمكن للعملية بعد ذلك تطبيق التحويلات المناسبة لمحاذاة الإطارات. هذا يقلل من الحركة المتصورة.

إعداد بيئتك

ابدأ ب خلق بيئة افتراضية للتأكد من أن الحزم التي تقوم بتثبيتها لتشغيل البرنامج لا تتعارض مع الحزم الموجودة. ثم قم بتشغيل هذا الأمر الطرفي لتثبيت المكتبات المطلوبة:

نقطة تثبيت opencv-python numpy

يقوم هذا الأمر بتثبيت مكتبات NumPy و OpenCV. يوفر NumPy أدوات للمهام العددية بينما يتعامل OpenCV مع مهام رؤية الكمبيوتر.

كود المصدر الكامل متاح في ملف مستودع جيثب.

استيراد المكتبات المطلوبة وتحديد ثلاث وظائف حاسمة

قم بإنشاء ملف Python جديد وامنحه اسمًا يعجبك. قم باستيراد مكتبات NumPy و OpenCV في بداية البرنامج النصي.

يستورد حبيبي مثل np
يستورد السيرة الذاتية 2
instagram viewer

سيمكنك استيراد هذه المكتبات من استخدام وظائفها في التعليمات البرمجية الخاصة بك.

بعد ذلك ، حدد ثلاث وظائف ستكون حاسمة لعملية الاستقرار.

دالة calculate_moving_average

إنشاء وظيفة وتسميتها calculate_moving_average. ستحسب هذه الوظيفة المتوسط ​​المتحرك لمنحنى معين باستخدام نصف القطر الذي تحدده. تستخدم عملية التفاف بحجم نافذة محدد ونواة موحدة. يساعد هذا المتوسط ​​المتحرك على تهدئة التقلبات في المسار.

defcalculate_moving_average(منحنى ، نصف قطر):
# احسب المتوسط ​​المتحرك لمنحنى باستخدام نصف قطر معين
window_size = 2 * نصف قطر + 1
النواة = np.ones (window_size) / window_size
curve_padded = np.lib.pad (منحنى ، (نصف قطر ، نصف قطر) ، 'حافة')
Smoothed_curve = np.convolve (curve_padded، kernel، mode ='نفس')
Smoothed_curve = منحنى ناعم [radius: -radius]
يعود منحنى متجانس

ترجع الدالة منحنى متجانس. يساعد على تقليل الضوضاء والتقلبات في المنحنى. يقوم بذلك عن طريق حساب متوسط ​​القيم داخل النافذة المنزلقة.

الدالة Smooth_trajectory

قم بإنشاء وظيفة أخرى وقم بتسميتها على نحو سلس. ستطبق هذه الوظيفة المتوسط ​​المتحرك على كل بُعد من أبعاد المسار. سيحقق ذلك عن طريق إنشاء نسخة متجانسة من المسار الأصلي. سيؤدي ذلك إلى زيادة تحسين استقرار الفيديو.

defعلى نحو سلس(مسار):
# قم بسلاسة المسار باستخدام المتوسط ​​المتحرك في كل بُعد
Smoothed_trajectory = np.copy (المسار)

ل أنا في يتراوح(3):
Smoothed_trajectory [:، i] = calculate_moving_average (
مسار [: ، ط] ،
نصف القطر = SMOOTHING_RADIUS
)

يعود أملس

ال على نحو سلس ترجع الدالة مسارًا ناعمًا.

وظيفة fix_border

قم بإنشاء وظيفة نهائية وقم بتسميتها fix_border. ستعمل هذه الوظيفة على إصلاح حدود الإطار من خلال تطبيق تحويل التدوير والقياس. يأخذ إطار الإدخال ، ويحسب شكله ، ويبني مصفوفة تحويل ، ويطبق التحويل على الإطار. أخيرًا ، تقوم بإرجاع الإطار الثابت.

deffix_border(إطار):
# إصلاح حدود الإطار عن طريق تطبيق تحويل التدوير والتحجيم
frame_shape = شكل الإطار

مصفوفة = cv2.getRotationMatrix2D (
(شكل الإطار [1] / 2، شكل الإطار [0] / 2),
0,
1.04
)

الإطار = cv2.warpAffine (frame، matrix، (frame_shape [1] ، شكل الإطار [0]))
يعود إطار

ال fix_border تضمن الوظيفة عدم احتواء الإطارات المستقرة على أي عيوب حدودية ناتجة عن عملية التثبيت.

تهيئة تثبيت الفيديو وأخذ المدخلات

ابدأ بتعيين نصف القطر الذي ستستخدمه وظيفة تجانس المسار.

SMOOTHING_RADIUS = 50

بعد ذلك ، قم بتمرير مسار الفيديو للفيديو المهتز الذي تريد تثبيته.

# افتح ملف فيديو الإدخال
# استبدل المسار بـ 0 لاستخدام كاميرا الويب الخاصة بك
cap = cv2.VideoCapture ("inputvid.mp4")

احصل على خصائص الفيديو المهتز:

num_frames = int (cap.get (cv2.CAP_PROP_FRAME_COUNT))
العرض = int (cap.get (cv2.CAP_PROP_FRAME_WIDTH))
الارتفاع = int (cap.get (cv2.CAP_PROP_FRAME_HEIGHT))
fps = cap.get (cv2.CAP_PROP_FPS)

اضبط تنسيق الإخراج. هذا هو التنسيق الذي سيحفظ به البرنامج الفيديو المستقر. يمكنك استخدام أي ملف تنسيق الفيديو الشائع تحب.

fourcc = cv2.VideoWriter_fourcc (*"mp4v")

أخيرًا ، قم بتهيئة كاتب الفيديو:

خارج = cv2.VideoWriter ("video_out.mp4"، fourcc، fps، (2 * عرض ارتفاع))

يجب أن يكون امتداد اسم الملف الذي تمرره إلى كاتب الفيديو هو نفسه الذي قمت بتعيينه في تنسيق الإخراج.

إطارات القراءة والمعالجة

تبدأ هنا الخطوة الأولى لمعالجة الفيديو المهتز. يتضمن قراءة الإطارات من فيديو الإدخال ، وحساب التحويلات ، وملء صفيف التحويلات.

ابدأ بقراءة الإطار الأول.

_، prev_frame = cap.read ()
prev_gray = cv2.cvtColor (prev_frame، cv2.COLOR_BGR2GRAY)

ثم تهيئة صفيف التحويل. سيتم تخزين المعلومات لكل إطار.

التحويلات = np.zeros ((عدد الإطارات - 1, 3) ، np.float32)

أخيرًا ، تحتاج إلى حساب التدفق البصري بين الإطارات المتتالية. ثم تقدير التحول التقريبي بين النقاط.

ل أنا في النطاق (عدد الإطارات - 2):
# احسب التدفق البصري بين الإطارات المتتالية
prev_points = cv2.goodFeaturesToTrack (
prev_gray ،
maxCorners =200,
qualityLevel =0.01,
أقل مسافة =30,
blockSize =3
)

النجاح ، cur_frame = cap.read ()

لولا نجاح:
استراحة

urr_gray = cv2.cvtColor (cur_frame، cv2.COLOR_BGR2GRAY)

Current_points، status، err = cv2.calcOpticalFlowPyrLK (
prev_gray ،
Curr_gray ،
نقاط_السابقة ،
لا أحد
)

يجزم prev_points.shape ==urr_points.shape
idx = np.where (الحالة == 1)[0]
prev_points = prev_points [معرف]
urr_points = Curr_points [idx]

# تقدير الانجذاب بين النقاط
مصفوفة ، _ = cv2.estimateAffine2D (prev_points، cur_points)
translation_x = مصفوفة [0, 2]
translation_y = مصفوفة [1, 2]
rotation_angle = np.arctan2 (مصفوفة [1, 0]، مصفوفة[0, 0])
يحولات [i] = [translation_x، translation_y، rotation_angle]
prev_gray = curr_gray

تتكرر الحلقة فوق كل إطار (باستثناء الإطار الأخير) لحساب التحويلات. يحسب التدفق البصري بين الإطارات المتتالية باستخدام طريقة Lucas-Kanade. cv2.good الميزات إلى المسار يكتشف النقاط المميزة في الإطار السابق prev_gray. ثم، cv2.calcOpticalFlowPyrLK يتتبع هذه النقاط في الإطار الحالي Curr_gray.

فقط النقاط ذات الحالة 1 (تشير إلى التتبع الناجح) تساعد في تقدير مصفوفة التحويل الأفيني. يقوم الكود بتحديث ملف prev_gray متغير مع إطار التدرج الرمادي الحالي للتكرار التالي.

تمهيد المسار

تحتاج إلى تبسيط المسار الذي تم الحصول عليه من التحولات لتحقيق نتيجة مستقرة.

# احسب المسار بجمع التحولات بشكل تراكمي
المسار = np.cumsum (تحويلات ، محور =0)

# قم بسلاسة المسار باستخدام المتوسط ​​المتحرك
Smoothed_trajectory = Smooth_trajectory (المسار)

# احسب الفرق بين المسار المصقول والأصلي
الفرق = السلس - المسار

# أضف الفرق مرة أخرى إلى التحولات الأصلية للحصول على سلس
# تحولات
Transforms_smooth = تحويلات + فرق

يحسب الكود أعلاه مسار حركة الكاميرا ويسهلها.

إطارات التثبيت والكتابة

الخطوة الأخيرة هي تثبيت الإطارات وكتابة الفيديو المستقر في ملف الإخراج.

ابدأ بإعادة ضبط التقاط الفيديو. هذا يضمن قراءة العمليات المستقبلية من بداية الفيديو.

cap.set (cv2.CAP_PROP_POS_FRAMES ، 0)

ثم ثبّت الفيديو عن طريق معالجة كل إطار.

# معالجة كل إطار واستقرار الفيديو
ل أنا في النطاق (عدد الإطارات - 2):
النجاح ، الإطار = الحد الأقصى للقراءة ()

لولا نجاح:
استراحة

translation_x = transforms_smooth [i، 0]
translation_y = transforms_smooth [i، 1]
rotation_angle = transforms_smooth [i، 2]

# إنشاء مصفوفة التحويل لتحقيق الاستقرار
convert_matrix = np.zeros ((2, 3) ، np.float32)
مصفوفة التحويل [0, 0] = np.cos (rotation_angle)
مصفوفة التحويل [0, 1] = -np.sin (rotation_angle)
مصفوفة التحويل [1, 0] = np.sin (rotation_angle)
مصفوفة التحويل [1, 1] = np.cos (rotation_angle)
مصفوفة التحويل [0, 2] = translation_x
مصفوفة التحويل [1, 2] = translation_y

# تطبيق التحول لتثبيت الإطار
frame_stabilized = cv2.warpAffine (
إطار،
مصفوفة التحويل ،
(عرض ارتفاع)
)

# إصلاح حدود الإطار المستقر
frame_stabilized = fix_border (إطار_مستقر)

# اربط الإطارات الأصلية والمثبتة جنبًا إلى جنب
frame_out = cv2.hconcat ([frame، frame_stabilized])

# قم بتغيير حجم الإطار إذا تجاوز عرضه 1920 بكسل
لو frame_out.shape [1] > 1920:
frame_out = cv2.resize (
إطار_خارج ،
(frame_out.shape [1] // 2، frame_out.shape [0] // 2)
)

# عرض الإطارات قبل وبعد
cv2.imshow ("قبل وبعد"، frame_out)
cv2.waitKey (10)

# اكتب الإطار لملف الفيديو الناتج
out.write (frame_out)

يعمل الكود أعلاه على تثبيت كل إطار باستخدام التحويلات المحسوبة ، بما في ذلك تعديلات الترجمة والدوران. ثم يقوم بدمج الإطارات المستقرة مع الإطارات الأصلية لتقديم مقارنة.

الافراج عن لقطة الفيديو والكاتب

قم بإنهاء البرنامج عن طريق تحرير مقاطع الفيديو وكائنات الكاتب.

# حرر لقطة الفيديو والكاتب وأغلق أي نوافذ مفتوحة
cap.release ()
out.release ()
cv2.destroyAllWindows ()

يقوم هذا الرمز أيضًا بإغلاق أي نوافذ مفتوحة.

مخرجات البرنامج النهائي

سيبدو إخراج البرنامج كما يلي:

وإليك مثال على الفيديو الثابت:

يُظهر الإخراج المقارنة بين الفيديو المهتز والفيديو المستقر.

اكتشف قدرات OpenCV

يمكنك تطبيق OpenCV في العديد من المجالات التي تتضمن رؤية الكمبيوتر. هذا لأنه يقدم مجموعة واسعة من الوظائف. يجب عليك استكشاف قدراتها من خلال العمل على المزيد من المشاريع التي تتضمن رؤية الكمبيوتر. سيقدم لك هذا مفاهيم جديدة ويمنحك مجالات جديدة للبحث عنها.