image-patches-differential-rotation-scale.py

# هذا العمل مرخص بموجب ترخيص MIT.
# حقوق النشر (c) 2013-2023 OpenMV LLC. جميع الحقوق محفوظة.
# https://github.com/openmv/openmv/blob/master/LICENSE
#
# التدفق البصري التفاضلي لتصحيح الدوران/القياس باستخدام رقع الصورة
#
# يوضح هذا المثال كيفية استخدام كاميرا OpenMV لقياس
# الدوران/القياس عن طريق مقارنة الصورة الحالية
# بالصورة السابقة. لاحظ أن الدوران/القياس فقط هو
# ما يتم التعامل معه - وليس الانتقال على المحورين X وY في هذا الوضع.
#
# لكن هذا المثال يتجاوز إجراء التدفق البصري على الصورة
# كاملة دفعة واحدة. بدلاً من ذلك يقسّم العملية بالعمل على مجموعات
# من البكسلات في الصورة. هذا يمنحك صورة "جديدة" من النتائج.
#
# ملاحظة: يجب أن تحتوي الأسطح على نوع ما من "الحواف" حتى تعمل
# الخوارزمية. السطح الخالي من السمات ينتج عنه نتائج غريبة.
#
# لتشغيل هذا العرض التوضيحي بفعالية، يرجى تثبيت كاميرا OpenMV على قاعدة
# ثابتة وتدوير الكاميرا ببطء حول محور العدسة وتحريك الكاميرا
# للأمام/للخلف لرؤية تغيّر الأرقام.
# أي تغييرات في اتجاه Z فقط.
#
# ملاحظة: يجب استخدام دقة صغيرة من مضاعفات 2 عند استخدام
# find_displacement(). وذلك لأن الخوارزمية تعمل بواسطة
# ما يسمى بارتباط الطور (phase correlation) الذي يقوم بمقارنة الصور
# باستخدام تحويل فورييه السريع (FFT). الدقة غير المضاعفة لـ 2 تتطلب حشوًا لأقرب مضاعف
# لـ 2 مما يقلل من فائدة نتائج الخوارزمية. يرجى
# استخدام دقة مثل B128X128 أو B128X64 (أسرع بمقدار الضعف).
#
# تدعم كاميرا OpenMV الخاصة بك دقات من مضاعفات 2 مثل 64x32 و64x64
# و128x64 و128x128. إذا أردت دقة 32x32 يمكنك إنشاءها
# عن طريق تنفيذ "img.scale(x_scale=0.5, y_scale=0.5, hint=image.AREA)" على صورة 64x64.

import csi
import image
import time
import math

BLOCK_W = 16  # pow2
BLOCK_H = 16  # pow2

csi0 = csi.CSI()
csi0.reset()  # إعادة ضبط المستشعر وتهيئته.
csi0.pixformat(csi.GRAYSCALE)  # تعيين صيغة البكسل إلى GRAYSCALE
csi0.framesize((128, 128))  # تعيين حجم الإطار إلى 128x128... (أو 64x64)...
csi0.snapshot(time=2000)  # انتظر حتى تدخل الإعدادات حيز التنفيذ.
clock = time.clock()  # أنشئ كائن ساعة (clock) لتتبع معدل الإطارات (FPS).

# إنشاء ذاكرة تخزين مؤقت ثانية للإطار على الكومة (heap).
extra_fb = image.Image(csi0.width(), csi0.height(), csi0.pixformat())
extra_fb.draw_image(csi0.snapshot())

while True:
    clock.tick()  # تتبع عدد الميلي ثانية المنقضية بين استدعاءات snapshot().
    img = csi0.snapshot()  # التقاط صورة وإرجاعها.

    for y in range(0, csi0.height(), BLOCK_H):
        for x in range(0, csi0.width(), BLOCK_W):
            displacement = extra_fb.find_displacement(
                img,
                logpolar=True,
                roi=(x, y, BLOCK_W, BLOCK_H),
                template_roi=(x, y, BLOCK_W, BLOCK_H),
            )

            # أقل من 0.1 تقريبًا (قد تختلف النتائج) تكون النتائج مجرد ضوضاء.
            if displacement.response > 0.1:
                rotation_change = displacement.rotation
                zoom_amount = 1.0 + displacement.scale
                pixel_x = (
                    x
                    + (BLOCK_W // 2)
                    + int(math.sin(rotation_change) * zoom_amount * (BLOCK_W // 4))
                )
                pixel_y = (
                    y
                    + (BLOCK_H // 2)
                    + int(math.cos(rotation_change) * zoom_amount * (BLOCK_H // 4))
                )
                img.draw_line(
                    (x + BLOCK_W // 2, y + BLOCK_H // 2, pixel_x, pixel_y), color=255
                )
            else:
                img.draw_line(
                    (
                        x + BLOCK_W // 2,
                        y + BLOCK_H // 2,
                        x + BLOCK_W // 2,
                        y + BLOCK_H // 2,
                    ),
                    color=0,
                )
    extra_fb.draw_image(img)

    print(clock.fps())

results matching ""

    No results matching ""