image_transfer_raw_as_the_controller_device.py

# هذا العمل مرخص بموجب ترخيص MIT.
# حقوق النشر (c) 2013-2023 OpenMV LLC. جميع الحقوق محفوظة.
# https://github.com/openmv/openmv/blob/master/LICENSE
#
# نقل الصور - كجهاز تحكم
#
# صُمم هذا السكربت ليعمل مع كاميرا OpenMV أخرى تشغّل "image_transfer_raw_as_the_remote_device.py"
#
# يوضح هذا السكربت كيفية نقل ذاكرة الإطار المؤقتة من كاميرا OpenMV إلى أخرى.

import image
import omv
import rpc
import csi
import struct
import time

# مكتبة RPC أعلاه مثبَّتة على كاميرا OpenMV الخاصة بك وتوفر عدة أصناف من أجل
# مما يتيح لكاميرا OpenMV التحكم عبر CAN أو I2C أو SPI أو UART أو LAN/WLAN.

##############################################################
# اختر الواجهة التي ترغب في التحكم بكاميرا OpenMV من خلالها.
##############################################################

# قم بإلغاء التعليق عن السطر أدناه لإعداد كاميرا OpenMV للتحكم بها عبر CAN.
#
# * message_id - رسالة CAN المستخدمة لنقل البيانات على ناقل CAN (11-بت).
# * bit_rate - معدل بتات CAN.
# * sample_point - نسبة Tseg1/Tseg2. عادةً 75%. (50.0، 62.5، 75.0، 87.5، إلخ)
#
# ملاحظة: يجب أن تتطابق معرّفات الرسائل ومعدلات بتات CAN بين الجهاز الرئيسي والتابع. قم بتوصيل can high للجهاز الرئيسي بـ
# can high للجهاز التابع وcan low للجهاز الرئيسي بـ can low للجهاز التابع. يجب إنهاء ناقل can بمقاومة 120 أوم.
#
# interface = rpc.rpc_can_master(message_id=0x7FF, bit_rate=1000000, sample_point=75.0)

# قم بإلغاء التعليق عن السطر أدناه لإعداد كاميرا OpenMV للتحكم بها عبر I2C.
#
# * slave_addr - عنوان I2C.
# * rate - تردد ساعة ناقل I2C.
#
# ملاحظة: يجب أن تتطابق عناوين الجهاز الرئيسي والتابع. قم بتوصيل scl للجهاز الرئيسي بـ scl للجهاز التابع وsda للجهاز الرئيسي
# بـ sda للجهاز التابع. يجب استخدام مقاومات سحب (pull ups) خارجية. وأخيرًا، يجب أن يشترك الجهازان في نفس الأرضي (ground).
#
# interface = rpc.rpc_i2c_master(slave_addr=0x12, rate=1000000)

# قم بإلغاء التعليق عن السطر أدناه لإعداد كاميرا OpenMV للتحكم بها عبر SPI.
#
# * cs_pin - دبوس اختيار الجهاز التابع (Slave Select).
# * freq - تردد ساعة ناقل SPI
# * clk_polarity - مستوى الساعة في وضع الخمول (0 أو 1).
# * clk_phase - أخذ عينة البيانات عند الحافة الأولى (0) أو الثانية (1) للساعة.
#
# ملاحظة: يجب أن تتطابق إعدادات الجهاز الرئيسي والتابع. قم بتوصيل CS وSCLK وMOSI وMISO بـ CS وSCLK وMOSI وMISO.
# وأخيرًا، يجب أن يشترك الجهازان في أرضي مشترك.
#
interface = rpc.rpc_spi_master(cs_pin="P3", freq=20000000, clk_polarity=1, clk_phase=0)

# قم بإلغاء التعليق عن السطر أدناه لإعداد كاميرا OpenMV للتحكم بها عبر UART.
#
# * baudrate - معدل البود التسلسلي (Serial Baudrate).
#
# ملاحظة: يجب أن تتطابق معدلات البود بين الجهاز الرئيسي والتابع. قم بتوصيل tx للجهاز الرئيسي بـ rx للجهاز التابع وrx للجهاز الرئيسي بـ
# tx للجهاز التابع. وأخيرًا، يجب أن يشترك الجهازان في أرضي مشترك.
#
# interface = rpc.rpc_uart_master(baudrate=7500000)

##############################################################
# معالجات دوال رد النداء (Call Back Handlers)
##############################################################


def get_frame_buffer_call_back(pixformat, framesize, cutthrough, silent):
    if not silent:
        print("Getting Remote Frame...")

    result = interface.call(
        "raw_image_snapshot", struct.pack("<II", pixformat, framesize)
    )
    if result is not None:
        w, h, pixformat, size = struct.unpack("<IIII", result)
        img = image.Image(w, h, pixformat, copy_to_fb=True)  # تخصيص ذاكرة إطار مؤقتة ممسوحة.
        img_ba = img.bytearray()

        if cutthrough:
            # نقل بيانات سريع مباشر (cutthrough) دون التحقق من الأخطاء.

            # قبل بدء نقل البيانات المباشر، نحتاج إلى مزامنة كل من الجهاز الرئيسي و
            # الجهاز التابع. عند الإرجاع، يكون كلا الجهازين متزامنين.
            result = interface.call("raw_image_read")
            if result is not None:
                # يجب أن يُنفَّذ GET BYTES مباشرةً بعد ذلك بأقل تأخير ممكن.

                # قراءة جميع بيانات الصورة في عملية نقل واحدة كبيرة جدًا.
                interface.get_bytes(img_ba, 5000)  # المهلة الزمنية

        else:
            # نقل بيانات أبطأ مع التحقق من الأخطاء.

            # نقل أجزاء بحجم 32/8 كيلوبايت.
            chunk_size = (1 << 15) if omv.board_type() == "H7" else (1 << 13)

            if not silent:
                print("Reading %d bytes..." % size)
            for i in range(0, size, chunk_size):
                ok = False
                for j in range(3):  # المحاولة حتى 3 مرات.
                    result = interface.call(
                        "raw_image_read", struct.pack("<II", i, chunk_size)
                    )
                    if result is not None:
                        img_ba[i:i + chunk_size] = result  # كتابة بيانات الصورة.
                        if not silent:
                            print("%.2f%%" % ((i * 100) / size))
                        ok = True
                        break
                    if not silent:
                        print("Retrying... %d/2" % (j + 1))
                if not ok:
                    if not silent:
                        print("Error!")
                    return None

        return img

    else:
        if not silent:
            print("Failed to get Remote Frame!")

    return None


clock = time.clock()
while True:
    clock.tick()

    # يمكنك تغيير صيغة البكسل وحجم الإطار للصورة المنقولة من الجهاز البعيد
    # عن طريق تعديل المعاملات أدناه.
    #
    # عندما تكون cutthrough بقيمة False، سيتم نقل الصورة عبر مكتبة RPC مع حماية CRC و
    # إعادة المحاولة على جميع البيانات المنقولة. لنقل أسرع للبيانات، عيّن cutthrough إلى True حتى
    # يتم استدعاء get_bytes() وput_bytes() بعد اكتمال استدعاء RPC لنقل البيانات
    # بشكل أسرع من ذاكرة صورة مؤقتة إلى أخرى. ملاحظة: يعمل هذا لأنه بمجرد اكتمال
    # استدعاء RPC بنجاح، يكون كل من الجهاز الرئيسي والتابع متزامنين تمامًا.
    #
    img = get_frame_buffer_call_back(
        csi.RGB565, csi.QQVGA, cutthrough=True, silent=True
    )
    if img is not None:
        pass  # يمكنك معالجة الصورة هنا.

    print(clock.fps())

results matching ""

    No results matching ""