v1.2.0

v1.2.0 هو إصدار تأسيسي كبير جداً يبني معظم واجهة برمجة التصوير الكلاسيكية في OpenMV: طرق الرسم، وعمليات الثنائية / المورفولوجيا، وواصفات النقاط المفتاحية (FAST / FREAK / LBP)، وتحويلات الألوان وimage.statistics، وإدخال/إخراج ملفات BMP / PPM / JPEG، ووحدات lcd وmjpeg وgif وmlx الحرارية، وكاميرا OV7725، والعديد من عناصر التحكم في sensor. تغيّر بعض سلوك sensor الأساسي — اقرأ التغييرات الكاسرة أدناه.

أبرز النقاط

  • واجهة الرسمdraw_line() / draw_rectangle() / draw_circle() / draw_string() / draw_cross() / draw_keypoints().

  • الثنائية / المورفولوجياbinary() وinvert() وand/or/xor/... وerode() / dilate() / morph() وnegate() / difference().

  • النقاط المفتاحية — واصفات FAST / FREAK / LBP مع match_descriptor() / save_descriptor() / load_descriptor().

  • وحدات جديدةlcd وmjpeg وgif (بالألوان) وmlx الحرارية.

  • دعم كاميرا OV7725؛ وimage.statistics؛ وإدخال/إخراج ملفات BMP/PPM/JPEG.

  • كاسر: تغيّر سلوك sensor.reset() وsensor.snapshot() وsensor.set_pixformat() — راجع التغييرات الكاسرة.

ميزات جديدة

  • الرسم — أُضيفت image.draw_line() / draw_rectangle() / draw_circle() / draw_string() / draw_cross() / draw_keypoints() مع وسائط مفتاحية (color وthickness و…).

  • الثنائية / المورفولوجيا — أُضيفت image.binary() وinvert() وand() / nand() / or() / nor() / xor() / xnor() وerode() / dilate() / morph() وnegate() / difference() وpixels() وcentroid() وorientation_radians() / orientation_degrees() وwidth() / height() / format().

  • النقاط المفتاحية / الواصفات — استخراج النقاط المفتاحية FAST عبر find_keypoints()، ودالة موحّدة match_descriptor() وsave_descriptor() / load_descriptor() لـ FREAK / LBP، بالإضافة إلى سلسلة Haar/LBP للوجه الجانبي.

  • اللون / الإحصاءاتimage.statistics ودوال تحويل الألوان (rgb_to_lab / lab_to_rgb / rgb_to_grayscale / grayscale_to_rgb).

  • إدخال/إخراج الملفات — تحميل وحفظ BMP / PPM (P2/P3/P5/P6) / JPEG (بما في ذلك JPEG بتدرج الرمادي وأخذ عينات اللونية الفرعية 4:2:0 / 4:2:2).

  • الوحدات — وحدة lcd جديدة (درع LCD)، وmjpeg (تسجيل الفيديو)، وgif بالألوان (مع Gif.loop())، ووحدات mlx للكاميرا الحرارية، ولكلٍ منها برامج نصية كأمثلة.

  • المستشعر — أُضيفت sensor.get_id() (+ ثوابت PID لـ OV9650/OV2640/OV7725)، وsensor.set_special_effect() (ثوابت SDE_*)، وsensor.set_image_filter() (FILTER_BW / FILTER_SKIN)، وحجم الإطار HQVGA، وimage.set_pixel(x, y, …).

  • WiFi — أُضيف برنامج تشغيل WiFi لـ ATWINC1500 وأساسيات BSP لـ OpenMV 1/2، بالإضافة إلى مثال BLE.

تغييرات وتحسينات أخرى

  • يُضغط مخزن الإطارات الآن بصيغة JPEG قبل بثّه إلى OpenMV IDE (عرض نطاق أقل)؛ ويتم ضغط JPEG في مكانه؛ ويتيح التكبير الأفقي/الرأسي في OV7725 تحجيماً اعتباطياً؛ وتحسّن كشف الوجوه بـ Haar (أسرع) ليعمل بدقة QVGA.

إصلاحات الأخطاء

التصوير:

  • أُصلح حساب الصورة التكاملية، وتلف مرشح median()، وحساب المركز، ومرشحات بشرة RGB / الأبيض والأسود على دخل RGB، وأصبحت قراءة/كتابة BMP/PPM بتدرج الرمادي أسرع.

المستشعر والنظام:

  • أُصلحت مؤقتات pyb.Servo (أصبح Servo يعمل)، ودقة HQVGA، وموثوقية تهيئة بطاقة SD، وإعادة تهيئة التخزين بعد إعادة الضبط الناعمة، وإعادة تشغيل REPL عند عدم وجود برنامج نصي.

العتاد ودعم اللوحات

  • مستشعر كاميرا OV7725.

  • درع LCD (وحدة lcd)، وكاميرا mlx الحرارية، وأساسيات WiFi لـ ATWINC1500.

تغييرات واجهة البرمجة الكاسرة

الكسور في واجهة البرمجة المرئية للمستخدم بين v1.1.0 وv1.2.0. النطاق: وحدات Python بلغة C في modules/ ومكتبات Python في scripts/libraries/.

جميع التغييرات الكاسرة الثلاثة هي تغييرات في السلوك لدوال sensor الأساسية (واجهة برمجة واحدة، سلوك مختلف) — أعد فحص البرامج النصية المتأثرة. يرتبط كل تجزئة (hash) للالتزام بفرقه (diff) على GitHub. (الغالبية العظمى من هذا الإصدار هي واجهة برمجة جديدة بُنيت ضمن نطاق v1.1→v1.2 وهي بالتالي إضافية لا كاسرة.)

sensor.reset() لم تعد تطبّق إعداداً افتراضياً (سلوك)

لم تعد sensor.reset() تطبّق تكويناً افتراضياً مدمجاً (pixformat / framesize / framerate / gain / contrast / brightness / saturation). البرامج النصية التي اعتمدت على أن reset() تترك إعداداً افتراضياً قابلاً للاستخدام يجب الآن أن تستدعي صراحةً sensor.set_pixformat() وsensor.set_framesize() (وأي إعدادات أخرى) بعد reset().

الالتزامات: d1e782df3

sensor.snapshot() تطلق استثناءً عند انتهاء المهلة (سلوك)

تطلق sensor.snapshot() الآن RuntimeError("Sensor Timeout!!") عند انتهاء مهلة المستشعر بدلاً من التعلّق إلى أجل غير مسمى. غلّف snapshot() داخل try / except RuntimeError إذا كنت بحاجة إلى تحمّل انتهاء المهل.

الالتزامات: e3f41d674

sensor.set_pixformat() تطلق استثناءً عند صيغة غير مدعومة (سلوك)

تطلق sensor.set_pixformat() الآن استثناءً عند إعطائها صيغة بكسل غير مدعومة بدلاً من إرجاع False. يجب على الشفرة التي كانت تفحص قيمة الإرجاع False أن تلتقط الاستثناء بدلاً من ذلك.

الالتزامات: e0c5822c2

قائمة مراجعة الترحيل

للنقل النظيف إلى v1.2.0، العمل المعتاد هو:

  1. اضبط صراحةً sensor.set_pixformat() / sensor.set_framesize() بعد sensor.reset() (تغيير reset).

  2. غلّف sensor.snapshot() داخل try / except RuntimeError إذا كنت بحاجة إلى تحمّل انتهاء مهل المستشعر (تغيير snapshot).

  3. التقط الاستثناء من sensor.set_pixformat() بدلاً من فحص False (تغيير set_pixformat).

تعمل جميع البرامج النصية الأخرى دون تغيير.