From 45491035ea0e2399a674917165d4e695b66464e8 Mon Sep 17 00:00:00 2001 From: leestott Date: Sun, 7 Sep 2025 15:24:18 +0000 Subject: [PATCH] =?UTF-8?q?=F0=9F=8C=90=20Update=20translations=20via=20Co?= =?UTF-8?q?-op=20Translator?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../4-ComputerVision/06-IntroCV/OpenCV.ipynb | 44 ++++++------- .../4-ComputerVision/06-IntroCV/OpenCV.ipynb | 52 ++++++++-------- .../4-ComputerVision/06-IntroCV/OpenCV.ipynb | 58 ++++++++--------- .../4-ComputerVision/06-IntroCV/OpenCV.ipynb | 30 ++++----- .../4-ComputerVision/06-IntroCV/OpenCV.ipynb | 28 ++++----- .../4-ComputerVision/06-IntroCV/OpenCV.ipynb | 46 +++++++------- .../4-ComputerVision/06-IntroCV/OpenCV.ipynb | 48 +++++++------- .../4-ComputerVision/06-IntroCV/OpenCV.ipynb | 46 +++++++------- .../4-ComputerVision/06-IntroCV/OpenCV.ipynb | 32 +++++----- .../4-ComputerVision/06-IntroCV/OpenCV.ipynb | 36 +++++------ .../4-ComputerVision/06-IntroCV/OpenCV.ipynb | 46 +++++++------- .../4-ComputerVision/06-IntroCV/OpenCV.ipynb | 54 ++++++++-------- .../4-ComputerVision/06-IntroCV/OpenCV.ipynb | 48 +++++++------- .../4-ComputerVision/06-IntroCV/OpenCV.ipynb | 52 ++++++++-------- .../4-ComputerVision/06-IntroCV/OpenCV.ipynb | 38 ++++++------ .../4-ComputerVision/06-IntroCV/OpenCV.ipynb | 52 ++++++++-------- .../4-ComputerVision/06-IntroCV/OpenCV.ipynb | 42 ++++++------- .../4-ComputerVision/06-IntroCV/OpenCV.ipynb | 32 +++++----- .../4-ComputerVision/06-IntroCV/OpenCV.ipynb | 42 ++++++------- .../4-ComputerVision/06-IntroCV/OpenCV.ipynb | 50 +++++++-------- .../4-ComputerVision/06-IntroCV/OpenCV.ipynb | 60 +++++++++--------- .../4-ComputerVision/06-IntroCV/OpenCV.ipynb | 40 ++++++------ .../4-ComputerVision/06-IntroCV/OpenCV.ipynb | 52 ++++++++-------- .../4-ComputerVision/06-IntroCV/OpenCV.ipynb | 50 +++++++-------- .../4-ComputerVision/06-IntroCV/OpenCV.ipynb | 50 +++++++-------- .../4-ComputerVision/06-IntroCV/OpenCV.ipynb | 32 +++++----- .../4-ComputerVision/06-IntroCV/OpenCV.ipynb | 60 +++++++++--------- .../4-ComputerVision/06-IntroCV/OpenCV.ipynb | 52 ++++++++-------- .../4-ComputerVision/06-IntroCV/OpenCV.ipynb | 46 +++++++------- .../4-ComputerVision/06-IntroCV/OpenCV.ipynb | 38 ++++++------ .../4-ComputerVision/06-IntroCV/OpenCV.ipynb | 62 +++++++++---------- .../4-ComputerVision/06-IntroCV/OpenCV.ipynb | 34 +++++----- .../4-ComputerVision/06-IntroCV/OpenCV.ipynb | 44 ++++++------- .../4-ComputerVision/06-IntroCV/OpenCV.ipynb | 26 ++++---- .../4-ComputerVision/06-IntroCV/OpenCV.ipynb | 32 +++++----- .../4-ComputerVision/06-IntroCV/OpenCV.ipynb | 50 +++++++-------- .../4-ComputerVision/06-IntroCV/OpenCV.ipynb | 40 ++++++------ .../4-ComputerVision/06-IntroCV/OpenCV.ipynb | 60 +++++++++--------- .../4-ComputerVision/06-IntroCV/OpenCV.ipynb | 40 ++++++------ .../4-ComputerVision/06-IntroCV/OpenCV.ipynb | 52 ++++++++-------- .../4-ComputerVision/06-IntroCV/OpenCV.ipynb | 42 ++++++------- .../4-ComputerVision/06-IntroCV/OpenCV.ipynb | 54 ++++++++-------- .../4-ComputerVision/06-IntroCV/OpenCV.ipynb | 48 +++++++------- .../4-ComputerVision/06-IntroCV/OpenCV.ipynb | 42 ++++++------- .../4-ComputerVision/06-IntroCV/OpenCV.ipynb | 50 +++++++-------- .../4-ComputerVision/06-IntroCV/OpenCV.ipynb | 50 +++++++-------- .../4-ComputerVision/06-IntroCV/OpenCV.ipynb | 26 ++++---- .../4-ComputerVision/06-IntroCV/OpenCV.ipynb | 54 ++++++++-------- 48 files changed, 1079 insertions(+), 1083 deletions(-) diff --git a/translations/ar/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb b/translations/ar/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb index 670dd43f..abdf3140 100644 --- a/translations/ar/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb +++ b/translations/ar/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb @@ -8,9 +8,9 @@ "\n", "هذا الدفتر هو جزء من [منهج الذكاء الاصطناعي للمبتدئين](http://aka.ms/ai-beginners).\n", "\n", - "يُعتبر [OpenCV](https://opencv.org/) المعيار الفعلي لمعالجة الصور. يحتوي على العديد من الخوارزميات المفيدة، التي تم تنفيذها بلغة C++. يمكنك أيضًا استخدام OpenCV من خلال Python.\n", + "يُعتبر [OpenCV](https://opencv.org/) المعيار الفعلي لمعالجة الصور. يحتوي على العديد من الخوارزميات المفيدة، والمُنفذة بلغة C++. يمكنك أيضًا استخدام OpenCV من خلال Python.\n", "\n", - "في هذا الدفتر، سنقدم لك بعض الأمثلة لاستخدام OpenCV. لمزيد من التفاصيل، يمكنك زيارة دورة [تعلم OpenCV](https://learnopencv.com/getting-started-with-opencv/) عبر الإنترنت.\n", + "في هذا الدفتر، سنقدم لك بعض الأمثلة لاستخدام OpenCV. لمزيد من التفاصيل، يمكنك زيارة دورة [Learn OpenCV](https://learnopencv.com/getting-started-with-opencv/) عبر الإنترنت.\n", "\n", "أولاً، دعونا نقوم بـ `import cv2`، بالإضافة إلى بعض المكتبات المفيدة الأخرى:\n" ] @@ -44,7 +44,7 @@ "source": [ "## تحميل الصور\n", "\n", - "يمكن تمثيل الصور في بايثون بسهولة باستخدام مصفوفات NumPy. على سبيل المثال، صورة بتدرج رمادي بحجم 320x200 بكسل سيتم تخزينها في مصفوفة بحجم 200x320، وصورة ملونة بنفس الأبعاد سيكون لها شكل 200x320x3 (لتمثيل 3 قنوات لونية).\n", + "يمكن تمثيل الصور في بايثون بسهولة باستخدام مصفوفات NumPy. على سبيل المثال، صورة بتدرج رمادي بحجم 320x200 بكسل سيتم تخزينها في مصفوفة بحجم 200x320، وصورة ملونة بنفس الأبعاد سيكون لها شكل 200x320x3 (لثلاث قنوات لونية).\n", "\n", "لنبدأ بتحميل صورة:\n" ] @@ -94,7 +94,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "كما ترى، إنها صورة لنص برايل. وبما أننا لسنا مهتمين جدًا باللون الفعلي، يمكننا تحويلها إلى أبيض وأسود:\n" + "كما ترى، إنها صورة لنص برايل. وبما أننا لسنا مهتمين كثيرًا باللون الفعلي، يمكننا تحويلها إلى أبيض وأسود:\n" ] }, { @@ -135,7 +135,7 @@ "source": [ "bw_im = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)\n", "print(bw_im.shape)\n", - "plt.imshow(bw_im)" + "plt.imshow(bw_im, cmap='gray')" ] }, { @@ -144,9 +144,9 @@ "source": [ "## معالجة الصور بطريقة برايل\n", "\n", - "إذا أردنا تطبيق تصنيف الصور للتعرف على النصوص، نحتاج إلى قص الرموز الفردية لجعلها مشابهة لصور MNIST التي رأيناها سابقًا. يمكن القيام بذلك باستخدام تقنية [كشف الكائنات](../11-ObjectDetection/README.md) التي سنناقشها لاحقًا، ولكن يمكننا أيضًا محاولة استخدام رؤية الكمبيوتر البحتة لهذا الغرض. وصف جيد لكيفية استخدام رؤية الكمبيوتر لفصل الأحرف يمكن العثور عليه [في هذه المقالة](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) - سنركز هنا فقط على بعض تقنيات رؤية الكمبيوتر.\n", + "إذا أردنا تطبيق تصنيف الصور للتعرف على النصوص، نحتاج إلى قص الرموز الفردية لجعلها مشابهة لصور MNIST التي رأيناها سابقًا. يمكن القيام بذلك باستخدام تقنية [اكتشاف الكائنات](../11-ObjectDetection/README.md) التي سنناقشها لاحقًا، ولكن يمكننا أيضًا محاولة استخدام رؤية الكمبيوتر البحتة لهذا الغرض. وصف جيد لكيفية استخدام رؤية الكمبيوتر لفصل الأحرف يمكن العثور عليه [في هذه المقالة](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) - سنركز هنا فقط على بعض تقنيات رؤية الكمبيوتر.\n", "\n", - "أولاً، دعونا نحاول تحسين الصورة قليلاً. يمكننا استخدام فكرة **التقسيم العتبي** (موصوفة بشكل جيد [في هذه المقالة من OpenCV](https://docs.opencv.org/4.x/d7/d4d/tutorial_py_thresholding.html)):\n" + "أولاً، دعونا نحاول تحسين الصورة قليلاً. يمكننا استخدام فكرة **التقسيم بالعتبة** (موصوفة بشكل جيد [في هذه المقالة من OpenCV](https://docs.opencv.org/4.x/d7/d4d/tutorial_py_thresholding.html)):\n" ] }, { @@ -192,7 +192,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "للتعامل مع الصور، نحتاج إلى \"استخراج\" النقاط الفردية، أي تحويل الصور إلى مجموعة من إحداثيات النقاط الفردية. يمكننا القيام بذلك باستخدام تقنيات **استخراج الميزات**، مثل SIFT، SURF أو [ORB](https://docs.opencv.org/4.x/d1/d89/tutorial_py_orb.html):\n" + "للعمل مع الصور، نحتاج إلى \"استخراج\" النقاط الفردية، أي تحويل الصور إلى مجموعة من إحداثيات النقاط الفردية. يمكننا القيام بذلك باستخدام تقنيات **استخراج الميزات**، مثل SIFT، SURF أو [ORB](https://docs.opencv.org/4.x/d1/d89/tutorial_py_orb.html):\n" ] }, { @@ -254,7 +254,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "للفصل بين الأحرف الفردية، نحتاج إلى معرفة صندوق الحدود للنص بالكامل. لمعرفة ذلك، يمكننا فقط حساب الإحداثيات الدنيا والقصوى:\n" + "لفصل الأحرف الفردية، نحتاج إلى معرفة المربع المحيط للنص بأكمله. لمعرفة ذلك، يمكننا ببساطة حساب الإحداثيات الصغرى والكبرى:\n" ] }, { @@ -342,7 +342,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "بعد أن نحصل على هذه الصورة المحاذاة جيدًا، يجب أن يكون من السهل نسبيًا تقطيعها إلى قطع:\n" + "بعد أن نحصل على هذه الصورة المحاذاة جيدًا، يجب أن يكون من السهل نسبيًا تقسيمها إلى قطع:\n" ] }, { @@ -395,9 +395,9 @@ "source": [ "## اكتشاف الحركة باستخدام الفرق بين الإطارات\n", "\n", - "اكتشاف الحركة في بث الفيديو هو مهمة شائعة جدًا. على سبيل المثال، يمكننا الحصول على تنبيهات عندما يحدث شيء ما على كاميرا المراقبة. إذا أردنا فهم ما يحدث على الكاميرا، يمكننا استخدام شبكة عصبية - ولكن استخدام الشبكة العصبية يصبح أكثر فعالية من حيث التكلفة عندما نعرف أن هناك شيء ما يحدث بالفعل.\n", + "اكتشاف الحركة في بث الفيديو هو مهمة شائعة جدًا. على سبيل المثال، يمكننا الحصول على تنبيهات عندما يحدث شيء ما على كاميرا المراقبة. إذا أردنا فهم ما يحدث على الكاميرا، يمكننا استخدام شبكة عصبية - ولكن من الأرخص استخدام الشبكة العصبية فقط عندما نعلم أن هناك شيئًا يحدث.\n", "\n", - "الفكرة الرئيسية لاكتشاف الحركة بسيطة. إذا كانت الكاميرا ثابتة، فإن الإطارات الملتقطة من الكاميرا يجب أن تكون متشابهة جدًا مع بعضها البعض. وبما أن الإطارات تُعرض كمصفوفات، فإن طرح هذه المصفوفات لإطارين متتاليين سيعطينا الفرق بين البكسلات، والذي يجب أن يكون منخفضًا للإطارات الثابتة، ويزداد عندما تكون هناك حركة كبيرة في الصورة.\n", + "الفكرة الرئيسية لاكتشاف الحركة بسيطة. إذا كانت الكاميرا ثابتة، فإن الإطارات المأخوذة من الكاميرا يجب أن تكون متشابهة جدًا مع بعضها البعض. وبما أن الإطارات تمثل كمصفوفات، فإن طرح هذه المصفوفات لإطارين متتاليين سيعطينا الفرق بين البكسلات، والذي يجب أن يكون منخفضًا للإطارات الثابتة، ويزداد عندما تكون هناك حركة كبيرة في الصورة.\n", "\n", "سنبدأ بتعلم كيفية فتح فيديو وتحويله إلى سلسلة من الإطارات:\n" ] @@ -537,7 +537,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "الآن يمكننا العثور على الإطارات التي تحتوي على كمية تغييرات أعلى من العتبة باستخدام `np.where`، واستخراج تسلسل من الإطارات المتتالية التي يزيد طولها عن 30 إطارًا:\n" + "الآن يمكننا العثور على الإطارات التي تحتوي على كمية تغييرات أعلى من العتبة باستخدام `np.where`، واستخراج تسلسل من الإطارات المتتالية التي تزيد عن 30 إطارًا:\n" ] }, { @@ -612,7 +612,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "قد تلاحظ أن نظام الألوان في هذه الصورة لا يبدو صحيحًا! يرجع ذلك إلى أن OpenCV لأسباب تاريخية يقوم بتحميل الصور في مساحة ألوان BGR، بينما يستخدم matplotlib ترتيب ألوان RGB التقليدي. في معظم الأحيان، من المنطقي تحويل الصور إلى RGB فور تحميلها.\n" + "قد تلاحظ أن نظام الألوان في هذه الصورة لا يبدو صحيحًا! يرجع ذلك إلى أن OpenCV لأسباب تاريخية يقوم بتحميل الصور في مساحة ألوان BGR، بينما تستخدم matplotlib ترتيب ألوان RGB التقليدي. في معظم الأحيان، من المنطقي تحويل الصور إلى RGB فور تحميلها.\n" ] }, { @@ -653,7 +653,7 @@ "source": [ "## استخراج الحركة باستخدام التدفق البصري\n", "\n", - "بينما يسمح لنا مقارنة إطارين متتاليين برؤية مقدار التغيرات، إلا أنه لا يقدم أي معلومات حول ما الذي يتحرك وأين. للحصول على هذه المعلومات، هناك تقنية تُعرف باسم **[التدفق البصري](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)**:\n", + "بينما يسمح لنا مقارنة إطارين متتاليين برؤية مقدار التغيرات، إلا أنه لا يقدم أي معلومات حول ما الذي يتحرك فعليًا وأين. للحصول على هذه المعلومات، هناك تقنية تُسمى **[التدفق البصري](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)**:\n", "\n", "* **التدفق البصري الكثيف** يحسب حقل المتجهات الذي يوضح لكل بكسل إلى أين يتحرك.\n", "* **التدفق البصري المتناثر** يعتمد على أخذ بعض الميزات المميزة في الصورة (مثل الحواف)، وبناء مسارها من إطار إلى آخر.\n", @@ -689,9 +689,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "كما ترى، لكل إطار، يكون التدفق بنفس أبعاد الإطار، وله قناتان، تمثلان مكونات x و y من متجه التدفق البصري.\n", + "كما ترى، لكل إطار، يحتوي التدفق على أبعاد الإطار وقناتين، تمثلان مكونات x و y من متجه التدفق البصري.\n", "\n", - "عرض التدفق البصري في بعدين يعتبر تحديًا بعض الشيء، ولكن يمكننا استخدام فكرة ذكية. إذا قمنا بتحويل التدفق البصري إلى إحداثيات قطبية، فسنحصل على مكونين لكل بكسل: *الاتجاه* و *الشدة*. يمكننا تمثيل الشدة من خلال شدة البكسل، والاتجاه من خلال ألوان مختلفة. سنقوم بإنشاء صورة في [فضاء ألوان HSV (التدرج-التشبع-القيمة)](https://en.wikipedia.org/wiki/HSV_color_space)، حيث يتم تحديد التدرج بواسطة الاتجاه، والقيمة بواسطة الشدة، والتشبع يكون 255.\n" + "عرض التدفق البصري في بعدين يعتبر تحديًا بعض الشيء، ولكن يمكننا استخدام فكرة ذكية. إذا قمنا بتحويل التدفق البصري إلى إحداثيات قطبية، فسنحصل على مكونين لكل بكسل: *الاتجاه* و *الشدة*. يمكننا تمثيل الشدة من خلال كثافة البكسل، والاتجاه من خلال ألوان مختلفة. سنقوم بإنشاء صورة في [فضاء ألوان HSV (الصبغة-التشبع-القيمة)](https://en.wikipedia.org/wiki/HSV_color_space)، حيث يتم تحديد الصبغة بواسطة الاتجاه، والقيمة بواسطة الشدة، والتشبع سيكون 255.\n" ] }, { @@ -740,16 +740,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "لذلك، في تلك الإطارات، يشير اللون الأخضر إلى الحركة نحو اليسار، بينما يشير اللون الأزرق إلى الحركة نحو اليمين.\n", + "لذلك، في تلك الإطارات، اللون الأخضر يشير إلى الحركة نحو اليسار، بينما اللون الأزرق يشير إلى الحركة نحو اليمين.\n", "\n", - "يمكن أن يكون التدفق البصري أداة رائعة لاستخلاص استنتاجات حول الاتجاه العام للحركة. على سبيل المثال، إذا لاحظت أن جميع البكسلات في إطار ما تتحرك في اتجاه واحد بشكل أو بآخر - يمكنك استنتاج أن هناك حركة للكاميرا، ومحاولة تعويض ذلك.\n" + "يمكن أن يكون التدفق البصري أداة رائعة لاستخلاص استنتاجات حول الاتجاه العام للحركة. على سبيل المثال، إذا لاحظت أن جميع البكسلات في إطار معين تتحرك في اتجاه واحد بشكل أو بآخر - يمكنك استنتاج أن هناك حركة للكاميرا، ومحاولة تعويض ذلك.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**إخلاء المسؤولية**: \nتم ترجمة هذا المستند باستخدام خدمة الترجمة بالذكاء الاصطناعي [Co-op Translator](https://github.com/Azure/co-op-translator). بينما نسعى لتحقيق الدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو معلومات غير دقيقة. يجب اعتبار المستند الأصلي بلغته الأصلية المصدر الموثوق. للحصول على معلومات حاسمة، يُوصى بالاستعانة بترجمة بشرية احترافية. نحن غير مسؤولين عن أي سوء فهم أو تفسيرات خاطئة ناتجة عن استخدام هذه الترجمة.\n" + "\n---\n\n**إخلاء المسؤولية**: \nتمت ترجمة هذا المستند باستخدام خدمة الترجمة الآلية [Co-op Translator](https://github.com/Azure/co-op-translator). بينما نسعى لتحقيق الدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو معلومات غير دقيقة. يجب اعتبار المستند الأصلي بلغته الأصلية هو المصدر الموثوق. للحصول على معلومات حساسة أو هامة، يُوصى بالاستعانة بترجمة بشرية احترافية. نحن غير مسؤولين عن أي سوء فهم أو تفسيرات خاطئة تنشأ عن استخدام هذه الترجمة.\n" ] } ], @@ -776,8 +776,8 @@ }, "orig_nbformat": 4, "coopTranslator": { - "original_hash": "ad5bdca62175c7a3d4336ef8c761aef3", - "translation_date": "2025-08-28T03:18:02+00:00", + "original_hash": "339b2129f86b24024393ff92b8bd376f", + "translation_date": "2025-09-07T14:52:29+00:00", "source_file": "lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb", "language_code": "ar" } diff --git a/translations/bg/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb b/translations/bg/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb index df4158e5..887a6562 100644 --- a/translations/bg/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb +++ b/translations/bg/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb @@ -6,11 +6,11 @@ "source": [ "# Компютърно зрение и OpenCV\n", "\n", - "Този тефтер е част от [Учебната програма за начинаещи в AI](http://aka.ms/ai-beginners).\n", + "Тази тетрадка е част от [Учебната програма за начинаещи в ИИ](http://aka.ms/ai-beginners).\n", "\n", - "[OpenCV](https://opencv.org/) се счита за *де факто* стандарт за обработка на изображения. Той съдържа много полезни алгоритми, реализирани на C++. Можете да използвате OpenCV и от Python.\n", + "[OpenCV](https://opencv.org/) се счита за *де факто* стандарт за обработка на изображения. Той съдържа множество полезни алгоритми, реализирани на C++. OpenCV може да се използва и с Python.\n", "\n", - "В този тефтер ще ви дадем няколко примера за използване на OpenCV. За повече подробности можете да посетите онлайн курса [Learn OpenCV](https://learnopencv.com/getting-started-with-opencv/).\n", + "В тази тетрадка ще ви покажем няколко примера за използване на OpenCV. За повече подробности можете да посетите онлайн курса [Learn OpenCV](https://learnopencv.com/getting-started-with-opencv/).\n", "\n", "Първо, нека `import cv2`, както и някои други полезни библиотеки:\n" ] @@ -44,7 +44,7 @@ "source": [ "## Зареждане на изображения\n", "\n", - "Изображенията в Python могат удобно да се представят чрез NumPy масиви. Например, черно-бяло изображение с размер 320x200 пиксела ще бъде съхранено в масив с размери 200x320, а цветно изображение със същите размери ще има форма 200x320x3 (за 3 цветни канала).\n", + "Изображенията в Python могат удобно да се представят чрез NumPy масиви. Например, черно-бяло изображение с размер 320x200 пиксела би се съхранявало в масив с размери 200x320, а цветно изображение със същите размери би имало форма 200x320x3 (за трите цветови канала).\n", "\n", "Нека започнем със зареждане на изображение:\n" ] @@ -94,7 +94,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Както можете да видите, това е изображение на брайлов текст. Тъй като не сме много заинтересовани от действителния цвят, можем да го преобразуваме в черно-бяло:\n" + "Както виждате, това е изображение на брайлов текст. Тъй като не се интересуваме особено от действителния цвят, можем да го преобразуваме в черно-бяло:\n" ] }, { @@ -135,18 +135,18 @@ "source": [ "bw_im = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)\n", "print(bw_im.shape)\n", - "plt.imshow(bw_im)" + "plt.imshow(bw_im, cmap='gray')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Обработка на изображения с Брайлова азбука\n", + "## Обработка на изображения с Брайл\n", "\n", - "Ако искаме да приложим класификация на изображения за разпознаване на текста, трябва да изрежем отделните символи, за да ги направим подобни на изображенията от MNIST, които сме виждали преди. Това може да се постигне чрез техниката [разпознаване на обекти](../11-ObjectDetection/README.md), която ще обсъдим по-късно, но също така можем да опитаме да използваме чисто компютърно зрение за тази цел. Добро описание на това как компютърното зрение може да се използва за разделяне на символи може да се намери [в тази блог публикация](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) - тук ще се фокусираме само върху някои техники на компютърното зрение.\n", + "Ако искаме да приложим класификация на изображения за разпознаване на текста, трябва да изрежем отделните символи, за да ги направим подобни на изображенията от MNIST, които сме виждали преди. Това може да се направи с помощта на техниката [разпознаване на обекти](../11-ObjectDetection/README.md), която ще обсъдим по-късно, но също така можем да опитаме да използваме чисто компютърно зрение за тази цел. Добро описание на това как компютърното зрение може да се използва за разделяне на символи може да се намери [в тази публикация в блог](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) - тук ще се фокусираме само върху някои техники на компютърното зрение.\n", "\n", - "Първо, нека опитаме да подобрим изображението малко. Можем да използваме идеята за **прагова обработка** (добре описана [в тази статия на OpenCV](https://docs.opencv.org/4.x/d7/d4d/tutorial_py_thresholding.html)):\n" + "Първо, нека опитаме да подобрим изображението малко. Можем да използваме идеята за **прагова обработка** (добре описана [в тази статия за OpenCV](https://docs.opencv.org/4.x/d7/d4d/tutorial_py_thresholding.html)):\n" ] }, { @@ -252,7 +252,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "За да разделим отделните символи, трябва да знаем ограничителната рамка на целия текст. За да я намерим, можем просто да изчислим минималните и максималните координати:\n" + "За да разделим отделните символи, трябва да знаем ограничителната кутия на целия текст. За да я намерим, можем просто да изчислим минималните и максималните координати:\n" ] }, { @@ -293,7 +293,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Също така, този текст може да бъде частично завъртян и за да го направим перфектно подравнен, трябва да извършим така наречената **перспективна трансформация**. Ще вземем правоъгълник, определен от точки $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ и ще го подравним с ново изображение с пропорционални размери:\n" + "Също така, този текст може да бъде частично завъртян и за да го направим перфектно подравнен, трябва да извършим така наречената **перспективна трансформация**. Ще вземем правоъгълник, определен от точките $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ и ще го подравним с ново изображение с пропорционални размери:\n" ] }, { @@ -340,7 +340,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "След като получим тази добре подравнена снимка, би трябвало да е сравнително лесно да я нарежем на парчета:\n" + "След като получим това добре подравнено изображение, трябва да бъде сравнително лесно да го нарежем на части:\n" ] }, { @@ -384,7 +384,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Вие сте видели, че доста задачи могат да бъдат изпълнени с помощта на чиста обработка на изображения, без никакъв изкуствен интелект. Ако можем да използваме техники за компютърно зрение, за да направим работата на невронната мрежа по-лесна - определено трябва да го направим, защото това ще ни позволи да решаваме проблеми с по-малко количество обучителни данни.\n" + "Видели сте, че доста задачи могат да бъдат изпълнени с помощта на чиста обработка на изображения, без изкуствен интелект. Ако можем да използваме техники за компютърно зрение, за да направим работата на невронната мрежа по-опростена - определено трябва да го направим, защото това ще ни позволи да решаваме проблеми с по-малко количество обучителни данни.\n" ] }, { @@ -393,9 +393,9 @@ "source": [ "## Откриване на движение чрез разлика между кадри\n", "\n", - "Откриването на движение в поток от видео е много често срещана задача. Например, това ни позволява да получаваме известия, когато нещо се случва на камера за наблюдение. Ако искаме да разберем какво точно се случва на камерата, можем да използваме невронна мрежа – но е много по-евтино да използваме невронна мрежа, когато вече знаем, че нещо се случва.\n", + "Откриването на движение във видео поток е много често срещана задача. Например, това ни позволява да получаваме известия, когато нещо се случва на камера за наблюдение. Ако искаме да разберем какво се случва на камерата, можем да използваме невронна мрежа – но е много по-евтино да използваме невронна мрежа, когато знаем, че нещо се случва.\n", "\n", - "Основната идея на откриването на движение е проста. Ако камерата е фиксирана, тогава кадрите от камерата би трябвало да са доста сходни един с друг. Тъй като кадрите са представени като масиви, просто като извадим тези масиви за два последователни кадъра, ще получим разликата в пикселите, която би трябвало да е ниска за статични кадри и да стане по-висока, когато има значително движение в изображението.\n", + "Основната идея на откриването на движение е проста. Ако камерата е фиксирана, тогава кадрите от камерата трябва да са доста сходни един с друг. Тъй като кадрите са представени като масиви, просто като извадим тези масиви за два последователни кадъра, ще получим разликата в пикселите, която трябва да е ниска за статични кадри и да стане по-висока, когато има значително движение в изображението.\n", "\n", "Ще започнем, като научим как да отворим видео и да го преобразуваме в последователност от кадри:\n" ] @@ -535,7 +535,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Сега можем да намерим кадри, които имат количество промени над прага, като използваме `np.where`, и да извлечем последователност от поредни кадри, която е по-дълга от 30 кадри:\n" + "Сега можем да намерим кадрите, които имат количество промени над прага, като използваме `np.where`, и да извлечем последователност от поредни кадри, която е по-дълга от 30 кадъра:\n" ] }, { @@ -610,7 +610,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Може да забележите, че цветовата схема на това изображение не изглежда правилно! Това е така, защото OpenCV по исторически причини зарежда изображенията в цветово пространство BGR, докато matplotlib използва по-традиционния ред на цветовете RGB. В повечето случаи има смисъл изображенията да се конвертират в RGB веднага след тяхното зареждане.\n" + "Може да забележите, че цветовата схема на това изображение не изглежда правилна! Това е така, защото OpenCV по исторически причини зарежда изображенията в цветово пространство BGR, докато matplotlib използва по-традиционния ред на цветовете RGB. В повечето случаи има смисъл изображенията да се конвертират в RGB веднага след зареждането им.\n" ] }, { @@ -651,10 +651,10 @@ "source": [ "## Извличане на движение с помощта на оптичен поток\n", "\n", - "Докато сравняването на два последователни кадъра ни позволява да видим количеството промени, то не дава информация за това какво всъщност се движи и къде. За да получим тази информация, съществува техника, наречена **[оптичен поток](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)**:\n", + "Докато сравняването на два последователни кадъра ни позволява да видим количеството промени, то не дава информация за това какво точно се движи и къде. За да получим тази информация, съществува техника, наречена **[оптичен поток](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)**:\n", "\n", "* **Плътен оптичен поток** изчислява векторното поле, което показва за всеки пиксел къде се движи.\n", - "* **Рядък оптичен поток** се основава на вземането на някои отличителни характеристики в изображението (например ръбове) и изграждането на тяхната траектория от кадър на кадър.\n", + "* **Рядък оптичен поток** се базира на избора на някои отличителни характеристики в изображението (например ръбове) и изграждането на тяхната траектория от кадър на кадър.\n", "\n", "Прочетете повече за оптичния поток [в този страхотен урок](https://learnopencv.com/optical-flow-in-opencv/).\n", "\n", @@ -687,9 +687,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Както виждате, за всяка рамка потокът има размерите на рамката и 2 канала, които съответстват на x и y компонентите на вектора на оптичния поток.\n", + "Както виждате, за всяка рамка потокът има размерите на рамката и 2 канала, съответстващи на x и y компонентите на вектора на оптичния поток.\n", "\n", - "Изобразяването на оптичния поток в 2D е малко предизвикателство, но можем да използваме една хитра идея. Ако преобразуваме оптичния поток в полярни координати, тогава ще получим два компонента за всеки пиксел: *посока* и *интензитет*. Можем да представим интензитета чрез интензитета на пиксела, а посоката - чрез различни цветове. Ще създадем изображение в [HSV (Hue-Saturation-Value) цветово пространство](https://en.wikipedia.org/wiki/HSV_color_space), където оттенъкът (hue) ще се определя от посоката, стойността (value) - от интензитета, а наситеността (saturation) ще бъде 255.\n" + "Показването на оптичния поток в 2D е малко предизвикателно, но можем да използваме една умна идея. Ако преобразуваме оптичния поток в полярни координати, тогава ще получим два компонента за всеки пиксел: *посока* и *интензитет*. Можем да представим интензитета чрез интензитета на пиксела, а посоката чрез различни цветове. Ще създадем изображение в [HSV (Hue-Saturation-Value) цветово пространство](https://en.wikipedia.org/wiki/HSV_color_space), където оттенъкът ще бъде определен от посоката, стойността - от интензитета, а наситеността ще бъде 255.\n" ] }, { @@ -738,16 +738,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "И така, в тези кадри зеленикавият цвят съответства на движение наляво, а синият - на движение надясно.\n", + "В тези кадри зеленикавият цвят съответства на движение наляво, докато синият - на движение надясно.\n", "\n", - "Оптичният поток може да бъде чудесен инструмент за извеждане на заключения относно общата посока на движение. Например, ако видите, че всички пиксели в даден кадър се движат в повече или по-малко една посока, можете да заключите, че има движение на камерата и да се опитате да го компенсирате.\n" + "Оптичният поток може да бъде отличен инструмент за извличане на заключения относно общата посока на движение. Например, ако забележите, че всички пиксели в кадър се движат в повече или по-малко една посока - можете да заключите, че има движение на камерата и да опитате да го компенсирате.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**Отказ от отговорност**: \nТози документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.\n" + "\n---\n\n**Отказ от отговорност**: \nТози документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматичните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия изходен език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален превод от човек. Ние не носим отговорност за каквито и да е недоразумения или погрешни интерпретации, произтичащи от използването на този превод.\n" ] } ], @@ -774,8 +774,8 @@ }, "orig_nbformat": 4, "coopTranslator": { - "original_hash": "ad5bdca62175c7a3d4336ef8c761aef3", - "translation_date": "2025-08-29T23:32:42+00:00", + "original_hash": "339b2129f86b24024393ff92b8bd376f", + "translation_date": "2025-09-07T15:19:14+00:00", "source_file": "lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb", "language_code": "bg" } diff --git a/translations/bn/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb b/translations/bn/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb index 1330f0af..3450c771 100644 --- a/translations/bn/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb +++ b/translations/bn/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb @@ -8,7 +8,7 @@ "\n", "এই নোটবুকটি [AI for Beginners Curriculum](http://aka.ms/ai-beginners)-এর একটি অংশ।\n", "\n", - "[OpenCV](https://opencv.org/) ইমেজ প্রসেসিংয়ের জন্য *de facto* স্ট্যান্ডার্ড হিসেবে বিবেচিত হয়। এটি অনেক দরকারী অ্যালগরিদম ধারণ করে, যা C++-এ বাস্তবায়িত হয়েছে। আপনি পাইথন থেকেও OpenCV ব্যবহার করতে পারেন।\n", + "[OpenCV](https://opencv.org/) চিত্র প্রক্রিয়াকরণের জন্য *de facto* মান হিসেবে বিবেচিত হয়। এটি অনেক দরকারী অ্যালগরিদম ধারণ করে, যা C++-এ বাস্তবায়িত হয়েছে। আপনি Python থেকেও OpenCV ব্যবহার করতে পারেন।\n", "\n", "এই নোটবুকে, আমরা OpenCV ব্যবহারের কিছু উদাহরণ দেখাব। আরও বিস্তারিত জানার জন্য, আপনি [Learn OpenCV](https://learnopencv.com/getting-started-with-opencv/) অনলাইন কোর্সটি দেখতে পারেন।\n", "\n", @@ -42,11 +42,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## ছবি লোড করা\n", + "## ইমেজ লোড করা\n", "\n", - "পাইথনে ছবি সহজেই NumPy অ্যারে দ্বারা উপস্থাপন করা যায়। উদাহরণস্বরূপ, ৩২০x২০০ পিক্সেলের একটি গ্রেস্কেল ছবি ২০০x৩২০ অ্যারেতে সংরক্ষিত হবে, এবং একই মাত্রার একটি রঙিন ছবির আকৃতি হবে ২০০x৩২০x৩ (৩টি রঙ চ্যানেলের জন্য)।\n", + "পাইথনে ইমেজ সহজেই NumPy অ্যারের মাধ্যমে উপস্থাপন করা যায়। উদাহরণস্বরূপ, ৩২০x২০০ পিক্সেলের একটি গ্রেস্কেল ইমেজ ২০০x৩২০ আকারের একটি অ্যারেতে সংরক্ষিত হবে, এবং একই মাত্রার একটি রঙিন ইমেজের আকার হবে ২০০x৩২০x৩ (৩টি রঙ চ্যানেলের জন্য)।\n", "\n", - "চলুন একটি ছবি লোড করা দিয়ে শুরু করি:\n" + "চলুন একটি ইমেজ লোড করার মাধ্যমে শুরু করি:\n" ] }, { @@ -94,7 +94,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "যেমনটি আপনি দেখতে পাচ্ছেন, এটি ব্রেইল টেক্সটের একটি ছবি। যেহেতু আমরা প্রকৃত রঙে খুব বেশি আগ্রহী নই, আমরা এটিকে সাদা-কালোতে রূপান্তর করতে পারি:\n" + "যেমনটি আপনি দেখতে পাচ্ছেন, এটি ব্রেইল লেখার একটি ছবি। যেহেতু আমরা প্রকৃত রঙ নিয়ে খুব বেশি আগ্রহী নই, আমরা এটিকে সাদা-কালোতে রূপান্তর করতে পারি:\n" ] }, { @@ -135,7 +135,7 @@ "source": [ "bw_im = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)\n", "print(bw_im.shape)\n", - "plt.imshow(bw_im)" + "plt.imshow(bw_im, cmap='gray')" ] }, { @@ -144,7 +144,7 @@ "source": [ "## ব্রেইল ইমেজ প্রসেসিং\n", "\n", - "যদি আমরা টেক্সট সনাক্ত করার জন্য ইমেজ শ্রেণীবিন্যাস প্রয়োগ করতে চাই, তাহলে আমাদের পৃথক প্রতীকগুলো কাটতে হবে যাতে সেগুলো আগের দেখা MNIST ইমেজগুলোর মতো হয়। এটি [অবজেক্ট ডিটেকশন](../11-ObjectDetection/README.md) পদ্ধতি ব্যবহার করে করা যেতে পারে, যা আমরা পরে আলোচনা করব, তবে আমরা শুধুমাত্র কম্পিউটার ভিশন ব্যবহার করেও এটি চেষ্টা করতে পারি। কম্পিউটার ভিশন কীভাবে চরিত্র পৃথকীকরণের জন্য ব্যবহার করা যেতে পারে তার একটি ভালো বর্ণনা [এই ব্লগ পোস্টে](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) পাওয়া যাবে - এখানে আমরা শুধুমাত্র কিছু কম্পিউটার ভিশন কৌশলের উপর ফোকাস করব।\n", + "যদি আমরা টেক্সট সনাক্ত করার জন্য ইমেজ শ্রেণীবিন্যাস প্রয়োগ করতে চাই, তাহলে আমাদের পৃথক প্রতীকগুলো কাটতে হবে যাতে সেগুলো আগের দেখা MNIST ইমেজগুলোর মতো হয়। এটি [অবজেক্ট ডিটেকশন](../11-ObjectDetection/README.md) পদ্ধতি ব্যবহার করে করা যেতে পারে, যা আমরা পরে আলোচনা করব। তবে, আমরা শুধুমাত্র কম্পিউটার ভিশন ব্যবহার করেও এটি চেষ্টা করতে পারি। কম্পিউটার ভিশন কীভাবে চরিত্র পৃথকীকরণের জন্য ব্যবহার করা যেতে পারে তার একটি ভালো বর্ণনা [এই ব্লগ পোস্টে](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) পাওয়া যাবে - এখানে আমরা শুধুমাত্র কিছু কম্পিউটার ভিশন কৌশলের উপর ফোকাস করব।\n", "\n", "প্রথমে, চলুন ইমেজটি একটু উন্নত করার চেষ্টা করি। আমরা **থ্রেশহোল্ডিং** ধারণাটি ব্যবহার করতে পারি (যা [এই OpenCV আর্টিকেলে](https://docs.opencv.org/4.x/d7/d4d/tutorial_py_thresholding.html) ভালোভাবে বর্ণনা করা হয়েছে):\n" ] @@ -192,7 +192,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "ছবির সাথে কাজ করতে, আমাদের \"বিচ্ছিন্ন\" পৃথক বিন্দুগুলি বের করতে হবে, অর্থাৎ ছবিগুলিকে পৃথক বিন্দুর সমন্বয়ের সেটে রূপান্তর করতে হবে। আমরা এটি **ফিচার এক্সট্রাকশন** প্রযুক্তি ব্যবহার করে করতে পারি, যেমন SIFT, SURF বা [ORB](https://docs.opencv.org/4.x/d1/d89/tutorial_py_orb.html):\n" + "চিত্র নিয়ে কাজ করতে, আমাদের \"বিচ্ছিন্ন\" বিন্দুগুলো আলাদা করতে হবে, অর্থাৎ চিত্রগুলোকে পৃথক বিন্দুর স্থানাঙ্কে রূপান্তর করতে হবে। আমরা এটি **ফিচার এক্সট্রাকশন** কৌশল ব্যবহার করে করতে পারি, যেমন SIFT, SURF বা [ORB](https://docs.opencv.org/4.x/d1/d89/tutorial_py_orb.html):\n" ] }, { @@ -254,7 +254,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "সমস্ত টেক্সটের বাউন্ডিং বক্স জানতে হলে আমাদের পৃথক অক্ষরগুলো আলাদা করতে হবে। এটি খুঁজে বের করতে, আমরা শুধু সর্বনিম্ন এবং সর্বাধিক কোঅর্ডিনেট গণনা করতে পারি:\n" + "স্বতন্ত্র অক্ষর আলাদা করতে, আমাদের পুরো লেখার বাউন্ডিং বক্স জানতে হবে। এটি খুঁজে বের করতে, আমরা কেবল ন্যূনতম এবং সর্বাধিক স্থানাঙ্ক গণনা করতে পারি:\n" ] }, { @@ -295,7 +295,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "এছাড়াও, এই পাঠ্যটি আংশিকভাবে ঘোরানো যেতে পারে, এবং এটিকে পুরোপুরি সজ্জিত করতে আমাদের তথাকথিত **পার্সপেক্টিভ ট্রান্সফরমেশন** করতে হবে। আমরা $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ দ্বারা সংজ্ঞায়িত পয়েন্টগুলির একটি আয়তক্ষেত্র নেব এবং এটি নতুন চিত্রের সাথে প্রাসঙ্গিক মাত্রায় সজ্জিত করব:\n" + "এছাড়াও, এই পাঠ্যটি আংশিকভাবে ঘোরানো যেতে পারে, এবং এটিকে পুরোপুরি সঙ্গতিপূর্ণ করতে আমাদের তথাকথিত **পার্সপেক্টিভ ট্রান্সফরমেশন** করতে হবে। আমরা $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ দ্বারা সংজ্ঞায়িত পয়েন্টগুলির একটি আয়তক্ষেত্র নেব এবং এটি নতুন চিত্রের সাথে প্রাসঙ্গিক মাত্রায় সঙ্গতিপূর্ণ করব:\n" ] }, { @@ -342,7 +342,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "এই সুশৃঙ্খল চিত্রটি পাওয়ার পর, এটিকে টুকরো টুকরো করা তুলনামূলকভাবে সহজ হওয়া উচিত:\n" + "যখন আমরা এই সঠিকভাবে সজ্জিত চিত্রটি পাই, তখন এটি টুকরো টুকরো করে কাটা তুলনামূলকভাবে সহজ হওয়া উচিত:\n" ] }, { @@ -386,20 +386,20 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "আপনি দেখেছেন যে অনেক কাজ শুধুমাত্র বিশুদ্ধ ইমেজ প্রসেসিং ব্যবহার করে করা যেতে পারে, কৃত্রিম বুদ্ধিমত্তা ছাড়াই। যদি আমরা কম্পিউটার ভিশন প্রযুক্তি ব্যবহার করে একটি নিউরাল নেটওয়ার্কের কাজকে সহজ করতে পারি - তাহলে অবশ্যই তা করা উচিত, কারণ এটি আমাদের কম প্রশিক্ষণ ডেটা ব্যবহার করে সমস্যাগুলি সমাধান করতে সাহায্য করবে।\n" + "আপনি দেখেছেন যে অনেক কাজ শুধুমাত্র বিশুদ্ধ ইমেজ প্রসেসিং ব্যবহার করেই করা যেতে পারে, কৃত্রিম বুদ্ধিমত্তা ছাড়াই। যদি আমরা কম্পিউটার ভিশন প্রযুক্তি ব্যবহার করে একটি নিউরাল নেটওয়ার্কের কাজকে সহজ করতে পারি - তবে অবশ্যই তা করা উচিত, কারণ এটি আমাদের কম প্রশিক্ষণ ডেটা ব্যবহার করে সমস্যাগুলি সমাধান করতে সাহায্য করবে।\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## ফ্রেম ডিফারেন্স ব্যবহার করে মুভমেন্ট ডিটেকশন\n", + "## ফ্রেম ডিফারেন্স ব্যবহার করে মুভমেন্ট শনাক্তকরণ\n", "\n", - "ভিডিও স্ট্রিমে মুভমেন্ট ডিটেকশন একটি খুব সাধারণ কাজ। উদাহরণস্বরূপ, এটি আমাদের সতর্কতা পেতে সাহায্য করে যখন কোনো কিছু নজরদারি ক্যামেরায় ঘটে। যদি আমরা বুঝতে চাই ক্যামেরায় কী ঘটছে, তখন আমরা একটি নিউরাল নেটওয়ার্ক ব্যবহার করতে পারি - তবে এটি অনেক সস্তা হয় নিউরাল নেটওয়ার্ক ব্যবহার করা যখন আমরা জানি যে কিছু ঘটছে।\n", + "ভিডিও স্ট্রিমে মুভমেন্ট শনাক্ত করা একটি খুব সাধারণ কাজ। উদাহরণস্বরূপ, এটি আমাদেরকে সতর্কবার্তা দিতে পারে যখন কোনো ঘটনা ঘটে নজরদারি ক্যামেরায়। যদি আমরা বুঝতে চাই ক্যামেরায় কী ঘটছে, তখন আমরা একটি নিউরাল নেটওয়ার্ক ব্যবহার করতে পারি - তবে নিউরাল নেটওয়ার্ক ব্যবহার করা অনেক সস্তা হয় যখন আমরা জানি যে কিছু ঘটছে।\n", "\n", - "মুভমেন্ট ডিটেকশনের মূল ধারণাটি সহজ। যদি ক্যামেরাটি স্থির থাকে, তাহলে ক্যামেরা থেকে প্রাপ্ত ফ্রেমগুলো একে অপরের সাথে বেশ মিল থাকবে। যেহেতু ফ্রেমগুলো অ্যারে হিসেবে উপস্থাপিত হয়, তাই পরপর দুটি ফ্রেমের অ্যারে বিয়োগ করলেই আমরা পিক্সেলের পার্থক্য পেয়ে যাব, যা স্থির ফ্রেমের জন্য কম হবে এবং ছবিতে উল্লেখযোগ্য মুভমেন্ট হলে তা বৃদ্ধি পাবে।\n", + "মুভমেন্ট শনাক্তকরণের মূল ধারণাটি খুবই সহজ। যদি ক্যামেরাটি স্থির থাকে, তাহলে ক্যামেরা থেকে প্রাপ্ত ফ্রেমগুলো একে অপরের সাথে বেশ মিল থাকবে। যেহেতু ফ্রেমগুলো অ্যারে হিসেবে উপস্থাপিত হয়, দুটি পরপর ফ্রেমের অ্যারে থেকে বিয়োগ করলে আমরা পিক্সেলের পার্থক্য পাবো, যা স্থির ফ্রেমের ক্ষেত্রে কম থাকবে এবং ছবিতে উল্লেখযোগ্য মুভমেন্ট হলে তা বৃদ্ধি পাবে।\n", "\n", - "আমরা শুরু করব কীভাবে একটি ভিডিও খুলে সেটিকে ফ্রেমের সিকোয়েন্সে রূপান্তর করা যায় তা শিখে:\n" + "আমরা শুরু করবো কীভাবে একটি ভিডিও খুলতে হয় এবং সেটিকে ফ্রেমের ধারাবাহিকতায় রূপান্তর করতে হয় তা শিখে:\n" ] }, { @@ -447,7 +447,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "রঙ গতিসঞ্চারণ সনাক্তকরণের জন্য এতটা গুরুত্বপূর্ণ নয়, তাই আমরা সমস্ত ফ্রেমকে ধূসর স্কেলে রূপান্তর করব। এরপর, আমরা ফ্রেমের পার্থক্যগুলি গণনা করব এবং তাদের নর্মগুলি প্লট করব যাতে কার্যকলাপের পরিমাণ দৃশ্যমানভাবে দেখা যায়:\n" + "রঙ গতিসঞ্চারণ সনাক্তকরণের জন্য এতটা গুরুত্বপূর্ণ নয়, তাই আমরা সমস্ত ফ্রেমকে গ্রেস্কেলে রূপান্তর করব। এরপর, আমরা ফ্রেমের পার্থক্যগুলি গণনা করব এবং তাদের নর্মগুলি প্লট করব যাতে কার্যকলাপের পরিমাণ দৃশ্যমানভাবে দেখা যায়:\n" ] }, { @@ -492,7 +492,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "ধরে নিন আমরা একটি রিপোর্ট তৈরি করতে চাই যা ক্যামেরার সামনে কী ঘটেছে তা দেখানোর জন্য প্রতিবার কিছু ঘটলে উপযুক্ত ছবি প্রদর্শন করে। এটি করতে, আমরা সম্ভবত একটি \"ইভেন্ট\"-এর শুরুর এবং শেষ ফ্রেম খুঁজে বের করতে চাই এবং মাঝের ফ্রেমটি প্রদর্শন করতে চাই। কিছু শব্দ দূর করতে, আমরা উপরের কার্ভটি মুভিং অ্যাভারেজ ফাংশন দিয়ে মসৃণ করব:\n" + "ধরুন আমরা একটি রিপোর্ট তৈরি করতে চাই যা ক্যামেরার সামনে কী ঘটেছে তা দেখানোর জন্য প্রতিবার কিছু ঘটলে উপযুক্ত ছবি প্রদর্শন করে। এটি করতে, আমরা সম্ভবত একটি \"ইভেন্ট\"-এর শুরু এবং শেষ ফ্রেম খুঁজে বের করতে চাই এবং মাঝের ফ্রেমটি প্রদর্শন করতে চাই। কিছু শব্দ দূর করতে, আমরা উপরের বক্ররেখাটিকে মুভিং অ্যাভারেজ ফাংশন দিয়ে মসৃণ করব:\n" ] }, { @@ -537,7 +537,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "এখন আমরা `np.where` ব্যবহার করে সেই ফ্রেমগুলি খুঁজে বের করতে পারি যেগুলির পরিবর্তনের পরিমাণ থ্রেশহোল্ডের উপরে রয়েছে, এবং ৩০টির বেশি ফ্রেমের একটি ধারাবাহিক ক্রম বের করতে পারি:\n" + "এখন আমরা `np.where` ব্যবহার করে সেই ফ্রেমগুলো খুঁজে বের করতে পারি যেগুলোর পরিবর্তনের পরিমাণ থ্রেশহোল্ডের উপরে, এবং ৩০ ফ্রেমের চেয়ে দীর্ঘ একটি ধারাবাহিক ফ্রেম বের করতে পারি:\n" ] }, { @@ -612,7 +612,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "আপনি লক্ষ্য করতে পারেন যে এই ছবির রঙের স্কিম সঠিক দেখাচ্ছে না! এর কারণ হলো OpenCV ঐতিহাসিক কারণে ছবিগুলোকে BGR রঙের স্পেসে লোড করে, যেখানে matplotlib আরও প্রচলিত RGB রঙের ক্রম ব্যবহার করে। বেশিরভাগ সময়, ছবিগুলো লোড করার পরপরই RGB-তে রূপান্তর করা যুক্তিসঙ্গত।\n" + "আপনি লক্ষ্য করতে পারেন যে এই ছবির রঙের স্কিম সঠিক দেখাচ্ছে না! এর কারণ হলো ঐতিহাসিক কারণে OpenCV ছবিগুলোকে BGR রঙের স্থানে লোড করে, যেখানে matplotlib আরও প্রচলিত RGB রঙের ক্রম ব্যবহার করে। বেশিরভাগ সময়, ছবিগুলো লোড করার পরপরই সেগুলোকে RGB-তে রূপান্তর করা যৌক্তিক।\n" ] }, { @@ -653,12 +653,12 @@ "source": [ "## অপটিক্যাল ফ্লো ব্যবহার করে মুভমেন্ট বের করা\n", "\n", - "যদিও দুটি পরপর ফ্রেম তুলনা করে পরিবর্তনের পরিমাণ দেখা সম্ভব, এটি আসলে কী মুভ করছে এবং কোথায় মুভ করছে সে সম্পর্কে কোনো তথ্য দেয় না। এই তথ্য পেতে, একটি পদ্ধতি রয়েছে যাকে **[অপটিক্যাল ফ্লো](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)** বলা হয়:\n", + "যদিও দুটি পরপর ফ্রেম তুলনা করে পরিবর্তনের পরিমাণ দেখা সম্ভব, এটি আসলে কী মুভ করছে এবং কোথায় মুভ করছে সে সম্পর্কে কোনো তথ্য দেয় না। এই তথ্য পাওয়ার জন্য একটি পদ্ধতি রয়েছে, যাকে **[অপটিক্যাল ফ্লো](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)** বলা হয়:\n", "\n", "* **ডেন্স অপটিক্যাল ফ্লো** প্রতিটি পিক্সেলের জন্য একটি ভেক্টর ফিল্ড গণনা করে যা দেখায় এটি কোথায় মুভ করছে।\n", "* **স্পার্স অপটিক্যাল ফ্লো** ছবির কিছু বিশেষ বৈশিষ্ট্য (যেমন: প্রান্ত) নিয়ে কাজ করে এবং ফ্রেম থেকে ফ্রেমে তাদের গতিপথ তৈরি করে।\n", "\n", - "অপটিক্যাল ফ্লো সম্পর্কে আরও পড়ুন [এই চমৎকার টিউটোরিয়ালে](https://learnopencv.com/optical-flow-in-opencv/)।\n", + "অপটিক্যাল ফ্লো সম্পর্কে আরও জানতে [এই চমৎকার টিউটোরিয়ালটি](https://learnopencv.com/optical-flow-in-opencv/) পড়ুন।\n", "\n", "চলুন আমাদের ফ্রেমগুলোর মধ্যে ডেন্স অপটিক্যাল ফ্লো গণনা করি:\n" ] @@ -689,9 +689,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "প্রতিটি ফ্রেমের জন্য ফ্লো ফ্রেমের মাত্রা এবং ২টি চ্যানেল নিয়ে গঠিত, যা অপটিক্যাল ফ্লো ভেক্টরের x এবং y উপাদানগুলোর সাথে সম্পর্কিত।\n", + "প্রতিটি ফ্রেমের জন্য, ফ্লো-এর মাত্রা ফ্রেমের সমান থাকে এবং এতে ২টি চ্যানেল থাকে, যা অপটিক্যাল ফ্লো ভেক্টরের x এবং y উপাদানগুলোর সাথে সম্পর্কিত।\n", "\n", - "২ডি-তে অপটিক্যাল ফ্লো প্রদর্শন করা কিছুটা চ্যালেঞ্জিং, তবে আমরা একটি চতুর ধারণা ব্যবহার করতে পারি। যদি আমরা অপটিক্যাল ফ্লোকে পোলার কোঅর্ডিনেটে রূপান্তর করি, তাহলে প্রতিটি পিক্সেলের জন্য দুটি উপাদান পাব: *দিক* এবং *তীব্রতা*। আমরা পিক্সেলের তীব্রতা দিয়ে তীব্রতাকে উপস্থাপন করতে পারি, এবং বিভিন্ন রঙ দিয়ে দিক নির্দেশ করতে পারি। আমরা [HSV (Hue-Saturation-Value) কালার স্পেস](https://en.wikipedia.org/wiki/HSV_color_space)-এ একটি ইমেজ তৈরি করব, যেখানে হিউ দ্বারা দিক নির্ধারিত হবে, ভ্যালু দ্বারা তীব্রতা, এবং স্যাচুরেশন হবে ২৫৫।\n" + "২D-তে অপটিক্যাল ফ্লো প্রদর্শন করা কিছুটা চ্যালেঞ্জিং, তবে আমরা একটি চতুর ধারণা ব্যবহার করতে পারি। যদি আমরা অপটিক্যাল ফ্লোকে পোলার কোঅর্ডিনেটে রূপান্তর করি, তাহলে প্রতিটি পিক্সেলের জন্য আমরা দুটি উপাদান পাব: *দিক* এবং *তীব্রতা*। আমরা তীব্রতাকে পিক্সেলের তীব্রতা দিয়ে উপস্থাপন করতে পারি এবং দিককে বিভিন্ন রঙ দিয়ে প্রকাশ করতে পারি। আমরা একটি ছবি তৈরি করব [HSV (Hue-Saturation-Value) কালার স্পেস](https://en.wikipedia.org/wiki/HSV_color_space)-এ, যেখানে হিউ দ্বারা দিক নির্ধারণ করা হবে, ভ্যালু দ্বারা তীব্রতা এবং স্যাচুরেশন হবে ২৫৫।\n" ] }, { @@ -740,16 +740,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "সুতরাং, ঐ ফ্রেমগুলোতে সবুজাভ রঙ বাম দিকে চলার সাথে সম্পর্কিত, আর নীল রঙ ডান দিকে চলার সাথে সম্পর্কিত।\n", + "সুতরাং, সেই ফ্রেমগুলিতে সবুজাভ রঙ বাম দিকে যাওয়ার সাথে সম্পর্কিত, আর নীল রঙ ডান দিকে যাওয়ার সাথে সম্পর্কিত।\n", "\n", - "অপটিক্যাল ফ্লো সাধারণ গতির দিক সম্পর্কে ধারণা করার জন্য একটি চমৎকার উপায় হতে পারে। উদাহরণস্বরূপ, যদি আপনি দেখেন যে একটি ফ্রেমের সব পিক্সেল কমবেশি এক দিকেই চলেছে - আপনি ধারণা করতে পারেন যে ক্যামেরা নড়াচড়া করছে এবং সেটি ক্ষতিপূরণ করার চেষ্টা করতে পারেন।\n" + "অপটিক্যাল ফ্লো সাধারণ গতির দিক সম্পর্কে সিদ্ধান্ত নেওয়ার জন্য একটি চমৎকার টুল হতে পারে। উদাহরণস্বরূপ, যদি আপনি দেখেন যে একটি ফ্রেমের সমস্ত পিক্সেল কমবেশি একদিকে যাচ্ছে - আপনি ধারণা করতে পারেন যে ক্যামেরা সরছে, এবং সেই অনুযায়ী তা ক্ষতিপূরণ করার চেষ্টা করতে পারেন।\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**অস্বীকৃতি**: \nএই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিকতার জন্য চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।\n" + "\n---\n\n**অস্বীকৃতি**: \nএই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। নথিটির মূল ভাষায় লেখা সংস্করণটিকেই প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ ব্যবহার করার পরামর্শ দেওয়া হচ্ছে। এই অনুবাদ ব্যবহারের ফলে সৃষ্ট কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যার জন্য আমরা দায়ী নই।\n" ] } ], @@ -776,8 +776,8 @@ }, "orig_nbformat": 4, "coopTranslator": { - "original_hash": "ad5bdca62175c7a3d4336ef8c761aef3", - "translation_date": "2025-08-28T11:08:08+00:00", + "original_hash": "339b2129f86b24024393ff92b8bd376f", + "translation_date": "2025-09-07T14:59:47+00:00", "source_file": "lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb", "language_code": "bn" } diff --git a/translations/br/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb b/translations/br/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb index f1b0f10d..a8386e78 100644 --- a/translations/br/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb +++ b/translations/br/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb @@ -135,7 +135,7 @@ "source": [ "bw_im = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)\n", "print(bw_im.shape)\n", - "plt.imshow(bw_im)" + "plt.imshow(bw_im, cmap='gray')" ] }, { @@ -144,7 +144,7 @@ "source": [ "## Processamento de Imagens em Braille\n", "\n", - "Se quisermos aplicar classificação de imagens para reconhecer o texto, precisamos recortar símbolos individuais para torná-los semelhantes às imagens do MNIST que vimos anteriormente. Isso pode ser feito usando a técnica de [detecção de objetos](../11-ObjectDetection/README.md), que discutiremos mais tarde, mas também podemos tentar usar visão computacional pura para isso. Uma boa descrição de como a visão computacional pode ser usada para separar caracteres pode ser encontrada [neste post do blog](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) - aqui, vamos nos concentrar apenas em algumas técnicas de visão computacional.\n", + "Se quisermos aplicar classificação de imagens para reconhecer o texto, precisamos recortar os símbolos individuais para torná-los semelhantes às imagens MNIST que vimos anteriormente. Isso pode ser feito usando a técnica de [detecção de objetos](../11-ObjectDetection/README.md), que discutiremos mais tarde, mas também podemos tentar usar visão computacional pura para isso. Uma boa descrição de como a visão computacional pode ser usada para separação de caracteres pode ser encontrada [neste post do blog](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) - aqui vamos focar apenas em algumas técnicas de visão computacional.\n", "\n", "Primeiro, vamos tentar melhorar um pouco a imagem. Podemos usar a ideia de **limiarização** (bem descrita [neste artigo do OpenCV](https://docs.opencv.org/4.x/d7/d4d/tutorial_py_thresholding.html)):\n" ] @@ -252,7 +252,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Para separar caracteres individuais, precisamos saber a caixa delimitadora de todo o texto. Para descobri-la, podemos simplesmente calcular as coordenadas mínimas e máximas:\n" + "Para separar caracteres individuais, precisamos conhecer a caixa delimitadora de todo o texto. Para descobri-la, podemos simplesmente calcular as coordenadas mínimas e máximas:\n" ] }, { @@ -293,7 +293,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Além disso, este texto pode estar parcialmente rotacionado, e para alinhá-lo perfeitamente, precisamos realizar a chamada **transformação de perspectiva**. Vamos pegar um retângulo definido pelos pontos $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ e alinhá-lo com uma nova imagem de dimensões proporcionais:\n" + "Além disso, este texto pode ser parcialmente rotacionado, e para alinhá-lo perfeitamente, precisamos realizar a chamada **transformação de perspectiva**. Vamos pegar um retângulo definido pelos pontos $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ e alinhá-lo com uma nova imagem de dimensões proporcionais:\n" ] }, { @@ -391,9 +391,9 @@ "source": [ "## Detecção de Movimento usando Diferença de Quadros\n", "\n", - "Detectar movimento em um fluxo de vídeo é uma tarefa muito comum. Por exemplo, isso nos permite receber alertas quando algo acontece em uma câmera de vigilância. Se quisermos entender o que está acontecendo na câmera, podemos então usar uma rede neural - mas é muito mais barato usar a rede neural apenas quando sabemos que algo está acontecendo.\n", + "Detectar movimento em um fluxo de vídeo é uma tarefa muito comum. Por exemplo, isso nos permite receber alertas quando algo acontece em uma câmera de vigilância. Se quisermos entender o que está acontecendo na câmera, podemos usar uma rede neural - mas é muito mais barato usar a rede neural apenas quando sabemos que algo está acontecendo.\n", "\n", - "A ideia principal da detecção de movimento é simples. Se a câmera estiver fixa, os quadros capturados pela câmera devem ser bastante semelhantes entre si. Como os quadros são representados como matrizes, ao subtrair essas matrizes de dois quadros consecutivos, obteremos a diferença de pixels, que deve ser baixa para quadros estáticos e se tornar maior quando houver um movimento substancial na imagem.\n", + "A ideia principal da detecção de movimento é simples. Se a câmera estiver fixa, os quadros capturados pela câmera devem ser bastante semelhantes entre si. Como os quadros são representados como matrizes, ao subtrair essas matrizes de dois quadros consecutivos, obtemos a diferença de pixels, que deve ser baixa para quadros estáticos e se tornar maior quando há movimento significativo na imagem.\n", "\n", "Vamos começar aprendendo como abrir um vídeo e convertê-lo em uma sequência de quadros:\n" ] @@ -443,7 +443,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Como a cor não é tão importante para a detecção de movimento, vamos converter todos os quadros para escala de cinza. Em seguida, calcularemos as diferenças entre os quadros e plotaremos suas normas para visualizar a quantidade de atividade acontecendo:\n" + "Como a cor não é tão importante para a detecção de movimento, converteremos todos os quadros para tons de cinza. Em seguida, calcularemos as diferenças entre os quadros e plotaremos suas normas para visualizar a quantidade de atividade ocorrendo:\n" ] }, { @@ -488,7 +488,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Suponha que queremos criar um relatório que mostre o que aconteceu em frente à câmera exibindo a imagem adequada cada vez que algo acontece. Para isso, provavelmente queremos descobrir o quadro inicial e final de um \"evento\" e exibir o quadro do meio. Para remover algum ruído, também iremos suavizar a curva acima com a função de média móvel:\n" + "Suponha que queremos criar um relatório que mostre o que aconteceu na frente da câmera exibindo a imagem adequada cada vez que algo acontece. Para isso, provavelmente queremos descobrir o quadro inicial e final de um \"evento\" e exibir o quadro do meio. Para remover alguns ruídos, também suavizaremos a curva acima com a função de média móvel:\n" ] }, { @@ -533,7 +533,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Agora podemos encontrar quadros que possuem a quantidade de alterações acima do limite usando `np.where`, e extrair uma sequência de quadros consecutivos que seja maior que 30 quadros:\n" + "Agora podemos encontrar quadros que têm a quantidade de alterações acima do limite usando `np.where` e extrair uma sequência de quadros consecutivos que seja maior que 30 quadros:\n" ] }, { @@ -650,7 +650,7 @@ "Embora comparar dois quadros consecutivos nos permita ver a quantidade de mudanças, isso não fornece informações sobre o que está realmente se movendo e onde. Para obter essas informações, existe uma técnica chamada **[fluxo óptico](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)**:\n", "\n", "* **Fluxo Óptico Denso** calcula o campo vetorial que mostra para cada pixel para onde ele está se movendo.\n", - "* **Fluxo Óptico Esparso** baseia-se em selecionar algumas características distintivas na imagem (por exemplo, bordas) e construir sua trajetória de quadro a quadro.\n", + "* **Fluxo Óptico Esparso** baseia-se em identificar algumas características distintivas na imagem (por exemplo, bordas) e construir sua trajetória de quadro a quadro.\n", "\n", "Leia mais sobre fluxo óptico [neste excelente tutorial](https://learnopencv.com/optical-flow-in-opencv/).\n", "\n", @@ -683,9 +683,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Como você pode ver, para cada quadro o fluxo tem a dimensão do quadro e 2 canais, correspondendo aos componentes x e y do vetor de fluxo óptico.\n", + "Como você pode ver, para cada quadro, o fluxo tem a dimensão do quadro e 2 canais, correspondendo aos componentes x e y do vetor de fluxo óptico.\n", "\n", - "Exibir fluxo óptico em 2D é um pouco desafiador, mas podemos usar uma ideia inteligente. Se convertermos o fluxo óptico para coordenadas polares, obteremos dois componentes para cada pixel: *direção* e *intensidade*. Podemos representar a intensidade pela intensidade do pixel e a direção por diferentes cores. Vamos criar uma imagem no [espaço de cores HSV (Matiz-Saturação-Valor)](https://en.wikipedia.org/wiki/HSV_color_space), onde o matiz será definido pela direção, o valor pela intensidade e a saturação será 255.\n" + "Exibir o fluxo óptico em 2D é um pouco desafiador, mas podemos usar uma ideia inteligente. Se convertermos o fluxo óptico para coordenadas polares, obteremos dois componentes para cada pixel: *direção* e *intensidade*. Podemos representar a intensidade pela intensidade do pixel e a direção por diferentes cores. Vamos criar uma imagem no [espaço de cores HSV (Matiz-Saturação-Valor)](https://en.wikipedia.org/wiki/HSV_color_space), onde o matiz será definido pela direção, o valor pela intensidade e a saturação será 255.\n" ] }, { @@ -743,7 +743,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**Aviso Legal**: \nEste documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações equivocadas decorrentes do uso desta tradução.\n" + "\n---\n\n**Aviso Legal**: \nEste documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automáticas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte oficial. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações incorretas decorrentes do uso desta tradução.\n" ] } ], @@ -770,8 +770,8 @@ }, "orig_nbformat": 4, "coopTranslator": { - "original_hash": "ad5bdca62175c7a3d4336ef8c761aef3", - "translation_date": "2025-08-28T13:12:43+00:00", + "original_hash": "339b2129f86b24024393ff92b8bd376f", + "translation_date": "2025-09-07T15:03:29+00:00", "source_file": "lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb", "language_code": "br" } diff --git a/translations/cs/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb b/translations/cs/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb index 8221b570..078328c6 100644 --- a/translations/cs/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb +++ b/translations/cs/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb @@ -44,7 +44,7 @@ "source": [ "## Načítání obrázků\n", "\n", - "Obrázky v Pythonu lze pohodlně reprezentovat pomocí polí NumPy. Například černobílý obrázek o velikosti 320x200 pixelů by byl uložen v poli o rozměrech 200x320, a barevný obrázek stejné velikosti by měl tvar 200x320x3 (pro 3 barevné kanály).\n", + "Obrázky v Pythonu mohou být pohodlně reprezentovány pomocí polí NumPy. Například černobílý obrázek o velikosti 320x200 pixelů by byl uložen v poli o rozměrech 200x320 a barevný obrázek stejné velikosti by měl tvar 200x320x3 (pro 3 barevné kanály).\n", "\n", "Začněme načtením obrázku:\n" ] @@ -135,7 +135,7 @@ "source": [ "bw_im = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)\n", "print(bw_im.shape)\n", - "plt.imshow(bw_im)" + "plt.imshow(bw_im, cmap='gray')" ] }, { @@ -293,7 +293,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Také tento text může být částečně otočen, a aby byl dokonale zarovnaný, musíme provést takzvanou **perspektivní transformaci**. Vezmeme obdélník definovaný body $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ a zarovnáme jej s novým obrazem s proporčními rozměry:\n" + "Tento text může být také částečně otočen, a aby byl dokonale zarovnaný, musíme provést takzvanou **perspektivní transformaci**. Vezmeme obdélník definovaný body $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ a zarovnáme jej s novým obrázkem s proporčními rozměry:\n" ] }, { @@ -340,7 +340,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Poté, co získáme tento dobře zarovnaný obrázek, by mělo být relativně snadné jej rozřezat na kousky:\n" + "Poté, co získáme tento dobře zarovnaný obrázek, by mělo být relativně snadné jej rozdělit na části:\n" ] }, { @@ -393,9 +393,9 @@ "source": [ "## Detekce pohybu pomocí rozdílu snímků\n", "\n", - "Detekce pohybu ve video streamu je velmi častý úkol. Například nám umožňuje dostávat upozornění, když se něco děje na bezpečnostní kameře. Pokud chceme pochopit, co se na kameře děje, můžeme následně použít neuronovou síť – ale je mnohem levnější použít neuronovou síť, když víme, že se něco děje.\n", + "Detekce pohybu ve video streamu je velmi častý úkol. Například nám umožňuje dostávat upozornění, když se něco děje na bezpečnostní kameře. Pokud chceme pochopit, co se na kameře děje, můžeme použít neuronovou síť – ale je mnohem levnější použít neuronovou síť, když víme, že se něco děje.\n", "\n", - "Hlavní myšlenka detekce pohybu je jednoduchá. Pokud je kamera pevná, pak by snímky z kamery měly být velmi podobné. Protože jsou snímky reprezentovány jako pole, stačí odečíst tato pole pro dva po sobě jdoucí snímky a získáme rozdíl pixelů, který by měl být nízký pro statické snímky a vyšší, jakmile dojde k výraznému pohybu v obraze.\n", + "Hlavní myšlenka detekce pohybu je jednoduchá. Pokud je kamera pevná, pak by snímky z kamery měly být navzájem velmi podobné. Protože jsou snímky reprezentovány jako pole, stačí odečíst tato pole pro dva po sobě jdoucí snímky a získáme rozdíl pixelů, který by měl být nízký pro statické snímky a vyšší, jakmile dojde k výraznému pohybu v obraze.\n", "\n", "Začneme tím, že se naučíme, jak otevřít video a převést ho na sekvenci snímků:\n" ] @@ -490,7 +490,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Předpokládejme, že chceme vytvořit zprávu, která ukazuje, co se stalo před kamerou, tím, že zobrazíme vhodný obrázek pokaždé, když se něco stane. K tomu pravděpodobně chceme zjistit počáteční a koncový snímek \"události\" a zobrazit prostřední snímek. Abychom odstranili nějaký šum, také vyhladíme křivku výše pomocí funkce klouzavého průměru:\n" + "Předpokládejme, že chceme vytvořit zprávu, která ukazuje, co se stalo před kamerou, tím, že zobrazíme vhodný obrázek pokaždé, když se něco stane. Abychom to udělali, pravděpodobně budeme chtít zjistit počáteční a koncový snímek \"události\" a zobrazit prostřední snímek. Abychom odstranili nějaký šum, také vyhladíme křivku výše pomocí funkce klouzavého průměru:\n" ] }, { @@ -649,12 +649,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Extrahování pohybu pomocí optického toku\n", + "## Extrakce pohybu pomocí optického toku\n", "\n", - "Pouhé porovnání dvou po sobě jdoucích snímků nám umožňuje vidět množství změn, ale neposkytuje žádné informace o tom, co se skutečně pohybuje a kde. K získání těchto informací existuje technika nazvaná **[optický tok](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)**:\n", + "Pouhé porovnání dvou po sobě jdoucích snímků nám umožňuje vidět množství změn, ale neposkytuje žádné informace o tom, co se vlastně pohybuje a kde. K získání těchto informací existuje technika nazývaná **[optický tok](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)**:\n", "\n", - "* **Hustý optický tok** vypočítává vektorové pole, které ukazuje, kam se každý pixel pohybuje.\n", - "* **Řídký optický tok** je založen na výběru některých výrazných prvků v obraze (např. hran) a sledování jejich trajektorie mezi snímky.\n", + "* **Hustý optický tok** vypočítává vektorové pole, které ukazuje, kam se každý pixel pohybuje\n", + "* **Řídký optický tok** je založen na výběru některých výrazných prvků v obraze (např. hran) a sledování jejich trajektorie mezi jednotlivými snímky.\n", "\n", "Více o optickém toku si můžete přečíst [v tomto skvělém tutoriálu](https://learnopencv.com/optical-flow-in-opencv/).\n", "\n", @@ -689,7 +689,7 @@ "source": [ "Jak vidíte, pro každý snímek má tok rozměr snímku a 2 kanály, které odpovídají x a y složkám vektoru optického toku.\n", "\n", - "Zobrazení optického toku ve 2D je trochu náročné, ale můžeme použít jeden chytrý nápad. Pokud převedeme optický tok na polární souřadnice, získáme dvě složky pro každý pixel: *směr* a *intenzitu*. Intenzitu můžeme reprezentovat intenzitou pixelu a směr různými barvami. Vytvoříme obraz v [HSV (Hue-Saturation-Value) barevném prostoru](https://en.wikipedia.org/wiki/HSV_color_space), kde odstín (hue) bude definován směrem, hodnota (value) intenzitou a sytost (saturation) bude 255.\n" + "Zobrazení optického toku ve 2D je trochu náročné, ale můžeme použít jeden chytrý nápad. Pokud převedeme optický tok na polární souřadnice, získáme pro každý pixel dvě složky: *směr* a *intenzitu*. Intenzitu můžeme reprezentovat intenzitou pixelu a směr různými barvami. Vytvoříme obraz v [HSV (Hue-Saturation-Value) barevném prostoru](https://en.wikipedia.org/wiki/HSV_color_space), kde odstín (hue) bude definován směrem, hodnota (value) intenzitou a sytost (saturation) bude 255.\n" ] }, { @@ -774,8 +774,8 @@ }, "orig_nbformat": 4, "coopTranslator": { - "original_hash": "ad5bdca62175c7a3d4336ef8c761aef3", - "translation_date": "2025-08-29T14:00:32+00:00", + "original_hash": "339b2129f86b24024393ff92b8bd376f", + "translation_date": "2025-09-07T15:16:53+00:00", "source_file": "lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb", "language_code": "cs" } diff --git a/translations/da/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb b/translations/da/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb index 5789f5c5..65b7074d 100644 --- a/translations/da/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb +++ b/translations/da/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb @@ -8,9 +8,9 @@ "\n", "Denne notebook er en del af [AI for Beginners Curriculum](http://aka.ms/ai-beginners).\n", "\n", - "[OpenCV](https://opencv.org/) anses for at være *de facto* standarden inden for billedbehandling. Det indeholder mange nyttige algoritmer, implementeret i C++. Du kan også bruge OpenCV fra Python.\n", + "[OpenCV](https://opencv.org/) anses for at være *de facto* standarden inden for billedbehandling. Den indeholder mange nyttige algoritmer, implementeret i C++. Du kan også bruge OpenCV fra Python.\n", "\n", - "I denne notebook vil vi give dig nogle eksempler på brugen af OpenCV. For mere information kan du besøge onlinekurset [Learn OpenCV](https://learnopencv.com/getting-started-with-opencv/).\n", + "I denne notebook vil vi give dig nogle eksempler på brugen af OpenCV. For flere detaljer kan du besøge onlinekurset [Learn OpenCV](https://learnopencv.com/getting-started-with-opencv/).\n", "\n", "Først skal vi `importere cv2`, samt nogle andre nyttige biblioteker:\n" ] @@ -44,7 +44,7 @@ "source": [ "## Indlæsning af billeder\n", "\n", - "Billeder i Python kan nemt repræsenteres ved hjælp af NumPy-arrays. For eksempel vil et gråtonebillede med en størrelse på 320x200 pixels blive gemt i et 200x320 array, og et farvebillede med samme dimensioner vil have formen 200x320x3 (for 3 farvekanaler).\n", + "Billeder i Python kan nemt repræsenteres ved hjælp af NumPy-arrays. For eksempel vil et gråtonebillede med en størrelse på 320x200 pixels blive gemt i et 200x320 array, og et farvebillede med samme dimension vil have formen 200x320x3 (for 3 farvekanaler).\n", "\n", "Lad os starte med at indlæse et billede:\n" ] @@ -94,7 +94,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Som du kan se, er det et billede af braille-tekst. Da vi ikke er særlig interesserede i den faktiske farve, kan vi konvertere det til sort-hvid:\n" + "Som du kan se, er det et billede af brailletekst. Da vi ikke er særlig interesserede i den faktiske farve, kan vi konvertere det til sort-hvid:\n" ] }, { @@ -135,7 +135,7 @@ "source": [ "bw_im = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)\n", "print(bw_im.shape)\n", - "plt.imshow(bw_im)" + "plt.imshow(bw_im, cmap='gray')" ] }, { @@ -144,7 +144,7 @@ "source": [ "## Braille-billedbehandling\n", "\n", - "Hvis vi vil anvende billedklassifikation til at genkende teksten, skal vi skære individuelle symboler ud for at gøre dem mere lig MNIST-billeder, som vi har set før. Dette kan gøres ved hjælp af [objektdetektion](../11-ObjectDetection/README.md), som vi vil diskutere senere, men vi kan også forsøge at bruge ren computer vision til det. En god beskrivelse af, hvordan computer vision kan bruges til tegnseparation, kan findes [i dette blogindlæg](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) - vi vil kun fokusere på nogle computer vision-teknikker her.\n", + "Hvis vi vil anvende billedklassifikation til at genkende teksten, skal vi skære individuelle symboler ud for at gøre dem mere lig MNIST-billeder, som vi har set før. Dette kan gøres ved hjælp af [objektdetektion](../11-ObjectDetection/README.md), som vi vil diskutere senere, men vi kan også forsøge at bruge ren computer vision til dette. En god beskrivelse af, hvordan computer vision kan bruges til tegnseparation, kan findes [i denne blogpost](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) - her vil vi kun fokusere på nogle computer vision-teknikker.\n", "\n", "Lad os først prøve at forbedre billedet en smule. Vi kan bruge ideen om **thresholding** (godt beskrevet [i denne OpenCV-artikel](https://docs.opencv.org/4.x/d7/d4d/tutorial_py_thresholding.html)):\n" ] @@ -252,7 +252,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "For at adskille individuelle tegn, skal vi kende afgrænsningsboksen for hele teksten. For at finde den, kan vi blot beregne min- og max-koordinater:\n" + "For at adskille individuelle tegn skal vi kende afgrænsningsboksen for hele teksten. For at finde den kan vi blot beregne min- og max-koordinater:\n" ] }, { @@ -293,7 +293,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Teksten kan være delvist roteret, og for at gøre den perfekt justeret skal vi udføre den såkaldte **perspektivtransformation**. Vi vil tage et rektangel defineret af punkterne $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ og justere det med et nyt billede med proportionale dimensioner:\n" + "For at gøre teksten perfekt justeret, kan vi udføre en såkaldt **perspektivtransformation**. Vi tager et rektangel defineret af punkterne $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ og justerer det til et nyt billede med proportionale dimensioner:\n" ] }, { @@ -340,7 +340,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Efter vi har fået dette veljusterede billede, burde det være relativt nemt at skære det i stykker:\n" + "Efter vi har fået dette veljusterede billede, bør det være relativt nemt at skære det i stykker:\n" ] }, { @@ -445,7 +445,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Da farve ikke er så vigtig for bevægelsesdetektion, vil vi konvertere alle billeder til gråtoner. Derefter vil vi beregne forskellene mellem billederne og plotte deres normer for visuelt at se mængden af aktivitet:\n" + "Da farve ikke er så vigtig for bevægelsesdetektion, vil vi konvertere alle rammer til gråtoner. Derefter vil vi beregne forskellene mellem rammerne og plotte deres normer for visuelt at se mængden af aktivitet:\n" ] }, { @@ -490,7 +490,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Antag, at vi ønsker at oprette en rapport, der viser, hvad der skete foran kameraet ved at vise det passende billede hver gang noget sker. For at gøre det vil vi sandsynligvis finde start- og slutrammen for en \"begivenhed\" og vise den midterste ramme. For at fjerne noget støj vil vi også udjævne kurven ovenfor med en glidende gennemsnitsfunktion:\n" + "Antag, at vi ønsker at oprette en rapport, der viser, hvad der skete foran kameraet, ved at vise det passende billede hver gang noget sker. For at gøre det vil vi sandsynligvis finde start- og slutrammen for en \"begivenhed\" og vise midterrammen. For at fjerne noget støj vil vi også udjævne kurven ovenfor med en glidende gennemsnitsfunktion:\n" ] }, { @@ -535,7 +535,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Nu kan vi finde de frames, der har mængden af ændringer over tærskelværdien ved at bruge `np.where`, og udtrække en sekvens af sammenhængende frames, der er længere end 30 frames:\n" + "Nu kan vi finde de rammer, der har mængden af ændringer over tærsklen ved at bruge `np.where`, og udtrække en sekvens af sammenhængende rammer, der er længere end 30 rammer:\n" ] }, { @@ -610,7 +610,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Du bemærker måske, at farveskemaet på dette billede ikke ser korrekt ud! Dette skyldes, at OpenCV af historiske årsager indlæser billeder i BGR-farverum, mens matplotlib bruger den mere traditionelle RGB-farverækkefølge. Oftest giver det mening at konvertere billeder til RGB umiddelbart efter indlæsning.\n" + "Du bemærker måske, at farveskemaet på dette billede ikke ser rigtigt ud! Dette skyldes, at OpenCV af historiske årsager indlæser billeder i BGR-farverum, mens matplotlib bruger den mere traditionelle RGB-farveorden. For det meste giver det mening at konvertere billeder til RGB umiddelbart efter indlæsning.\n" ] }, { @@ -651,14 +651,14 @@ "source": [ "## Udtræk bevægelse ved hjælp af optisk flow\n", "\n", - "Selvom det at sammenligne to på hinanden følgende frames giver os mulighed for at se mængden af ændringer, giver det ingen information om, hvad der faktisk bevæger sig, og hvor. For at få den information findes der en teknik kaldet **[optisk flow](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)**:\n", + "Selvom det at sammenligne to på hinanden følgende billeder giver os mulighed for at se mængden af ændringer, giver det ingen information om, hvad der faktisk bevæger sig, og hvor. For at få den information findes der en teknik kaldet **[optisk flow](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)**:\n", "\n", "* **Tæt optisk flow** beregner vektorfeltet, der viser, hvor hver pixel bevæger sig hen.\n", - "* **Spars optisk flow** er baseret på at tage nogle karakteristiske træk i billedet (f.eks. kanter) og bygge deres bane fra frame til frame.\n", + "* **Spars optisk flow** er baseret på at tage nogle karakteristiske træk i billedet (f.eks. kanter) og bygge deres bane fra billede til billede.\n", "\n", - "Læs mere om optisk flow [i denne fremragende tutorial](https://learnopencv.com/optical-flow-in-opencv/).\n", + "Læs mere om optisk flow [i denne fremragende vejledning](https://learnopencv.com/optical-flow-in-opencv/).\n", "\n", - "Lad os beregne tæt optisk flow mellem vores frames:\n" + "Lad os beregne tæt optisk flow mellem vores billeder:\n" ] }, { @@ -687,9 +687,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Som du kan se, har flowet for hver frame samme dimension som framen og 2 kanaler, der svarer til x- og y-komponenterne af den optiske flowvektor.\n", + "Som du kan se, har flowet for hver frame dimensionen af framen og 2 kanaler, der svarer til x- og y-komponenterne af den optiske flowvektor.\n", "\n", - "At vise optisk flow i 2D kan være lidt udfordrende, men vi kan bruge en smart idé. Hvis vi konverterer det optiske flow til polære koordinater, får vi to komponenter for hver pixel: *retning* og *intensitet*. Vi kan repræsentere intensiteten med pixelens lysstyrke og retningen med forskellige farver. Vi vil skabe et billede i [HSV (Hue-Saturation-Value) farverum](https://en.wikipedia.org/wiki/HSV_color_space), hvor farvetonen (hue) defineres af retningen, værdien (value) af intensiteten, og mætningen (saturation) vil være 255.\n" + "At vise optisk flow i 2D kan være lidt udfordrende, men vi kan bruge en smart idé. Hvis vi konverterer optisk flow til polære koordinater, får vi to komponenter for hver pixel: *retning* og *intensitet*. Vi kan repræsentere intensiteten med pixelens lysstyrke og retningen med forskellige farver. Vi vil skabe et billede i [HSV (Hue-Saturation-Value) farverum](https://en.wikipedia.org/wiki/HSV_color_space), hvor hue defineres af retningen, value af intensiteten, og saturation vil være 255.\n" ] }, { @@ -740,14 +740,14 @@ "source": [ "Så i disse frames svarer den grønne farve til bevægelse mod venstre, mens blå svarer til bevægelse mod højre.\n", "\n", - "Optisk flow kan være et fremragende værktøj til at drage konklusioner om den generelle bevægelsesretning. For eksempel, hvis du ser, at alle pixels i en frame bevæger sig mere eller mindre i én retning - kan du konkludere, at der er kamerabevægelse, og forsøge at kompensere for det.\n" + "Optisk flow kan være et fremragende værktøj til at drage konklusioner om den generelle bevægelsesretning. For eksempel, hvis du ser, at alle pixels i en frame bevæger sig mere eller mindre i én retning, kan du konkludere, at der er kamerabevægelse og forsøge at kompensere for det.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**Ansvarsfraskrivelse**: \nDette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på at sikre nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi er ikke ansvarlige for eventuelle misforståelser eller fejltolkninger, der opstår som følge af brugen af denne oversættelse.\n" + "\n---\n\n**Ansvarsfraskrivelse**: \nDette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os intet ansvar for misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse.\n" ] } ], @@ -774,8 +774,8 @@ }, "orig_nbformat": 4, "coopTranslator": { - "original_hash": "ad5bdca62175c7a3d4336ef8c761aef3", - "translation_date": "2025-08-28T16:38:17+00:00", + "original_hash": "339b2129f86b24024393ff92b8bd376f", + "translation_date": "2025-09-07T15:08:46+00:00", "source_file": "lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb", "language_code": "da" } diff --git a/translations/de/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb b/translations/de/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb index fd862bc7..9d7190f6 100644 --- a/translations/de/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb +++ b/translations/de/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb @@ -8,11 +8,11 @@ "\n", "Dieses Notebook ist Teil des [AI for Beginners Curriculum](http://aka.ms/ai-beginners).\n", "\n", - "[OpenCV](https://opencv.org/) gilt als *de facto* Standard für Bildverarbeitung. Es enthält viele nützliche Algorithmen, die in C++ implementiert sind. Sie können OpenCV auch mit Python verwenden.\n", + "[OpenCV](https://opencv.org/) gilt als *de facto* Standard für Bildverarbeitung. Es enthält viele nützliche Algorithmen, die in C++ implementiert sind. OpenCV kann auch in Python verwendet werden.\n", "\n", - "In diesem Notebook geben wir Ihnen einige Beispiele für die Nutzung von OpenCV. Für weitere Details können Sie den Online-Kurs [Learn OpenCV](https://learnopencv.com/getting-started-with-opencv/) besuchen.\n", + "In diesem Notebook zeigen wir Ihnen einige Beispiele für die Nutzung von OpenCV. Für weitere Details können Sie den Online-Kurs [Learn OpenCV](https://learnopencv.com/getting-started-with-opencv/) besuchen.\n", "\n", - "Zuerst importieren wir `cv2` sowie einige andere nützliche Bibliotheken:\n" + "Zuerst `importieren` wir `cv2` sowie einige andere nützliche Bibliotheken:\n" ] }, { @@ -46,7 +46,7 @@ "\n", "Bilder in Python können bequem durch NumPy-Arrays dargestellt werden. Zum Beispiel würde ein Graustufenbild mit einer Größe von 320x200 Pixeln in einem 200x320-Array gespeichert werden, und ein Farbbild mit denselben Abmessungen hätte die Form 200x320x3 (für 3 Farbkanäle).\n", "\n", - "Beginnen wir damit, ein Bild zu laden:\n" + "Beginnen wir mit dem Laden eines Bildes:\n" ] }, { @@ -94,7 +94,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Wie Sie sehen können, handelt es sich um ein Bild von Braille-Schrift. Da wir uns nicht besonders für die tatsächliche Farbe interessieren, können wir es in Schwarz-Weiß umwandeln:\n" + "Wie Sie sehen, handelt es sich um ein Bild von Braille-Schrift. Da wir uns nicht besonders für die tatsächliche Farbe interessieren, können wir es in Schwarz-Weiß umwandeln:\n" ] }, { @@ -135,7 +135,7 @@ "source": [ "bw_im = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)\n", "print(bw_im.shape)\n", - "plt.imshow(bw_im)" + "plt.imshow(bw_im, cmap='gray')" ] }, { @@ -144,7 +144,7 @@ "source": [ "## Braille-Bildverarbeitung\n", "\n", - "Wenn wir Bildklassifikation anwenden möchten, um den Text zu erkennen, müssen wir einzelne Symbole ausschneiden, damit sie den MNIST-Bildern ähneln, die wir zuvor gesehen haben. Dies kann mit der [Objekterkennung](../11-ObjectDetection/README.md) erreicht werden, die wir später besprechen werden. Aber wir können auch versuchen, dafür reine Computer-Vision-Techniken zu verwenden. Eine gute Beschreibung, wie Computer Vision für die Zeichen-Trennung genutzt werden kann, findet sich [in diesem Blogbeitrag](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) - wir konzentrieren uns hier nur auf einige Computer-Vision-Techniken.\n", + "Wenn wir Bildklassifikation anwenden möchten, um den Text zu erkennen, müssen wir einzelne Symbole ausschneiden, damit sie den MNIST-Bildern ähneln, die wir zuvor gesehen haben. Dies kann mit der [Objekterkennung](../11-ObjectDetection/README.md) erreicht werden, die wir später besprechen werden. Aber wir können auch versuchen, dafür reine Computer-Vision-Techniken zu verwenden. Eine gute Beschreibung, wie Computer Vision für die Zeichen-Trennung genutzt werden kann, findet sich [in diesem Blogbeitrag](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) – wir konzentrieren uns hier nur auf einige Computer-Vision-Techniken.\n", "\n", "Zunächst versuchen wir, das Bild ein wenig zu verbessern. Wir können die Idee des **Thresholdings** verwenden (gut beschrieben [in diesem OpenCV-Artikel](https://docs.opencv.org/4.x/d7/d4d/tutorial_py_thresholding.html)):\n" ] @@ -192,7 +192,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Um mit Bildern zu arbeiten, müssen wir einzelne Punkte \"extrahieren\", d. h. die Bilder in einen Satz von Koordinaten einzelner Punkte umwandeln. Das können wir mit **Merkmalextraktion**-Techniken wie SIFT, SURF oder [ORB](https://docs.opencv.org/4.x/d1/d89/tutorial_py_orb.html) tun:\n" + "Um mit Bildern zu arbeiten, müssen wir einzelne Punkte \"extrahieren\", d. h. die Bilder in eine Menge von Koordinaten einzelner Punkte umwandeln. Das können wir mit **Merkmalsextraktion**-Techniken wie SIFT, SURF oder [ORB](https://docs.opencv.org/4.x/d1/d89/tutorial_py_orb.html) tun:\n" ] }, { @@ -252,7 +252,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Um einzelne Zeichen zu trennen, müssen wir die Begrenzungsbox des gesamten Textes kennen. Um dies herauszufinden, können wir einfach die minimalen und maximalen Koordinaten berechnen:\n" + "Um einzelne Zeichen zu trennen, müssen wir die Begrenzungsbox des gesamten Textes kennen. Um diese zu ermitteln, können wir einfach die minimalen und maximalen Koordinaten berechnen:\n" ] }, { @@ -293,7 +293,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Außerdem kann dieser Text teilweise gedreht werden, und um ihn perfekt auszurichten, müssen wir eine sogenannte **Perspektivtransformation** durchführen. Wir nehmen ein Rechteck, das durch die Punkte $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ definiert ist, und richten es mit einem neuen Bild mit proportionalen Abmessungen aus:\n" + "Außerdem kann dieser Text teilweise gedreht werden, und um ihn perfekt auszurichten, müssen wir eine sogenannte **Perspektivtransformation** durchführen. Wir nehmen ein Rechteck, das durch die Punkte $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ definiert ist, und richten es an einem neuen Bild mit proportionalen Abmessungen aus:\n" ] }, { @@ -340,7 +340,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Nachdem wir dieses gut ausgerichtete Bild erhalten haben, sollte es relativ einfach sein, es in Stücke zu schneiden:\n" + "Nachdem wir dieses gut ausgerichtete Bild haben, sollte es relativ einfach sein, es in Stücke zu schneiden:\n" ] }, { @@ -384,7 +384,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Sie haben gesehen, dass viele Aufgaben mit reiner Bildverarbeitung erledigt werden können, ohne künstliche Intelligenz. Wenn wir Computer-Vision-Techniken nutzen können, um die Arbeit eines neuronalen Netzwerks zu vereinfachen, sollten wir dies auf jeden Fall tun, da es uns ermöglicht, Probleme mit einer geringeren Anzahl von Trainingsdaten zu lösen.\n" + "Sie haben gesehen, dass viele Aufgaben mit reiner Bildverarbeitung erledigt werden können, ohne künstliche Intelligenz. Wenn wir Computer-Vision-Techniken nutzen können, um die Arbeit eines neuronalen Netzwerks zu vereinfachen, sollten wir das auf jeden Fall tun, da es uns ermöglicht, Probleme mit einer geringeren Menge an Trainingsdaten zu lösen.\n" ] }, { @@ -393,9 +393,9 @@ "source": [ "## Bewegungserkennung mit Frame-Differenz\n", "\n", - "Die Erkennung von Bewegungen in einem Videostream ist eine sehr häufige Aufgabe. Zum Beispiel ermöglicht sie uns, Benachrichtigungen zu erhalten, wenn etwas auf einer Überwachungskamera passiert. Wenn wir verstehen möchten, was auf der Kamera geschieht, können wir ein neuronales Netzwerk verwenden – allerdings ist es viel kostengünstiger, ein neuronales Netzwerk erst dann einzusetzen, wenn wir wissen, dass tatsächlich etwas passiert.\n", + "Die Erkennung von Bewegungen in einem Videostream ist eine sehr häufige Aufgabe. Zum Beispiel ermöglicht sie uns, Benachrichtigungen zu erhalten, wenn etwas auf einer Überwachungskamera passiert. Wenn wir verstehen möchten, was auf der Kamera geschieht, können wir ein neuronales Netzwerk verwenden – aber es ist wesentlich kostengünstiger, ein neuronales Netzwerk erst dann einzusetzen, wenn wir wissen, dass tatsächlich etwas passiert.\n", "\n", - "Die Hauptidee der Bewegungserkennung ist einfach. Wenn die Kamera fest installiert ist, sollten die Frames der Kamera einander ziemlich ähnlich sein. Da Frames als Arrays dargestellt werden, können wir durch das Subtrahieren dieser Arrays von zwei aufeinanderfolgenden Frames die Pixelunterschiede ermitteln. Diese sollten bei statischen Frames gering sein und größer werden, sobald es erhebliche Bewegungen im Bild gibt.\n", + "Die Hauptidee der Bewegungserkennung ist einfach. Wenn die Kamera fest installiert ist, sollten die Frames der Kamera ziemlich ähnlich zueinander sein. Da Frames als Arrays dargestellt werden, können wir durch das Subtrahieren dieser Arrays von zwei aufeinanderfolgenden Frames die Pixelunterschiede erhalten. Diese sollten bei statischen Frames gering sein und bei erheblicher Bewegung im Bild größer werden.\n", "\n", "Wir beginnen damit, zu lernen, wie man ein Video öffnet und es in eine Sequenz von Frames umwandelt:\n" ] @@ -445,7 +445,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Da Farbe für die Bewegungserkennung nicht so wichtig ist, werden wir alle Frames in Graustufen umwandeln. Anschließend berechnen wir die Frame-Differenzen und plotten ihre Normen, um die Menge der Aktivität visuell zu erkennen:\n" + "Da Farbe für die Bewegungserkennung nicht so wichtig ist, werden wir alle Frames in Graustufen umwandeln. Anschließend berechnen wir die Frame-Differenzen und plotten ihre Normen, um die Menge der Aktivitäten visuell zu erkennen:\n" ] }, { @@ -490,7 +490,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Angenommen, wir möchten einen Bericht erstellen, der zeigt, was vor der Kamera passiert ist, indem jedes Mal das passende Bild angezeigt wird, wenn etwas passiert. Dazu möchten wir wahrscheinlich den Start- und Endframe eines \"Ereignisses\" herausfinden und den mittleren Frame anzeigen. Um etwas Rauschen zu entfernen, werden wir außerdem die oben stehende Kurve mit einer gleitenden Durchschnittsfunktion glätten:\n" + "Angenommen, wir möchten einen Bericht erstellen, der zeigt, was vor der Kamera passiert ist, indem jedes Mal das passende Bild angezeigt wird, wenn etwas passiert. Dazu möchten wir wahrscheinlich den Start- und Endframe eines \"Ereignisses\" herausfinden und den mittleren Frame anzeigen. Um etwas Rauschen zu entfernen, werden wir die Kurve oben außerdem mit einer gleitenden Durchschnittsfunktion glätten:\n" ] }, { @@ -535,7 +535,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Jetzt können wir mit `np.where` herausfinden, welche Frames die Anzahl der Änderungen über dem Schwellenwert haben, und eine Sequenz von aufeinanderfolgenden Frames extrahieren, die länger als 30 Frames ist:\n" + "Jetzt können wir mit `np.where` herausfinden, welche Frames Änderungen über dem Schwellenwert aufweisen, und eine Sequenz aufeinanderfolgender Frames extrahieren, die länger als 30 Frames ist:\n" ] }, { @@ -653,8 +653,8 @@ "\n", "Das bloße Vergleichen von zwei aufeinanderfolgenden Frames zeigt zwar die Menge der Änderungen, liefert jedoch keine Informationen darüber, was sich tatsächlich bewegt und wo. Um diese Informationen zu erhalten, gibt es eine Technik namens **[optischer Fluss](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)**:\n", "\n", - "* **Dichter optischer Fluss** berechnet das Vektorfeld, das für jeden Pixel zeigt, wohin er sich bewegt.\n", - "* **Spärlicher optischer Fluss** basiert darauf, einige markante Merkmale im Bild (z. B. Kanten) zu nehmen und deren Bewegung von Frame zu Frame nachzuverfolgen.\n", + "* **Dichter optischer Fluss** berechnet das Vektorfeld, das für jedes Pixel zeigt, wohin es sich bewegt.\n", + "* **Spärlicher optischer Fluss** basiert darauf, einige markante Merkmale im Bild (z. B. Kanten) zu identifizieren und deren Bewegung von Frame zu Frame nachzuverfolgen.\n", "\n", "Lies mehr über optischen Fluss [in diesem großartigen Tutorial](https://learnopencv.com/optical-flow-in-opencv/).\n", "\n", @@ -687,9 +687,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Wie Sie sehen können, hat der Fluss für jedes Frame die Dimension des Frames und 2 Kanäle, die den x- und y-Komponenten des optischen Flussvektors entsprechen.\n", + "Wie Sie sehen, hat der Fluss für jedes Frame die Dimension des Frames und 2 Kanäle, die den x- und y-Komponenten des optischen Flussvektors entsprechen.\n", "\n", - "Das Anzeigen des optischen Flusses in 2D ist etwas herausfordernd, aber wir können eine clevere Idee nutzen. Wenn wir den optischen Fluss in Polarkoordinaten umwandeln, erhalten wir zwei Komponenten für jedes Pixel: *Richtung* und *Intensität*. Die Intensität können wir durch die Pixelhelligkeit darstellen und die Richtung durch verschiedene Farben. Wir erstellen ein Bild im [HSV-Farbraum (Farbton-Sättigung-Helligkeit)](https://en.wikipedia.org/wiki/HSV_color_space), wobei der Farbton durch die Richtung definiert wird, die Helligkeit durch die Intensität und die Sättigung auf 255 gesetzt wird.\n" + "Das Anzeigen des optischen Flusses in 2D ist etwas herausfordernd, aber wir können eine clevere Idee nutzen. Wenn wir den optischen Fluss in Polarkoordinaten umwandeln, erhalten wir zwei Komponenten für jedes Pixel: *Richtung* und *Intensität*. Die Intensität können wir durch die Pixelhelligkeit darstellen und die Richtung durch verschiedene Farben. Wir werden ein Bild im [HSV (Hue-Saturation-Value)-Farbraum](https://en.wikipedia.org/wiki/HSV_color_space) erstellen, wobei der Farbton durch die Richtung definiert wird, der Wert durch die Intensität und die Sättigung auf 255 gesetzt wird.\n" ] }, { @@ -738,7 +738,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "In diesen Frames entspricht die grünliche Farbe einer Bewegung nach links, während Blau eine Bewegung nach rechts anzeigt.\n", + "In diesen Frames entspricht die grünliche Farbe einer Bewegung nach links, während die blaue Farbe eine Bewegung nach rechts anzeigt.\n", "\n", "Optischer Fluss kann ein großartiges Werkzeug sein, um Rückschlüsse auf die allgemeine Bewegungsrichtung zu ziehen. Zum Beispiel, wenn Sie sehen, dass sich alle Pixel in einem Frame mehr oder weniger in eine Richtung bewegen, können Sie daraus schließen, dass es eine Kamerabewegung gibt, und versuchen, diese auszugleichen.\n" ] @@ -774,8 +774,8 @@ }, "orig_nbformat": 4, "coopTranslator": { - "original_hash": "ad5bdca62175c7a3d4336ef8c761aef3", - "translation_date": "2025-08-31T16:06:49+00:00", + "original_hash": "339b2129f86b24024393ff92b8bd376f", + "translation_date": "2025-09-07T14:50:58+00:00", "source_file": "lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb", "language_code": "de" } diff --git a/translations/el/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb b/translations/el/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb index aa15e1bb..114a6d66 100644 --- a/translations/el/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb +++ b/translations/el/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb @@ -8,11 +8,11 @@ "\n", "Αυτό το σημειωματάριο αποτελεί μέρος του [Προγράμματος Σπουδών AI για Αρχάριους](http://aka.ms/ai-beginners).\n", "\n", - "Το [OpenCV](https://opencv.org/) θεωρείται το *de facto* πρότυπο για επεξεργασία εικόνας. Περιέχει πολλούς χρήσιμους αλγορίθμους, υλοποιημένους σε C++. Μπορείτε επίσης να καλέσετε το OpenCV από την Python.\n", + "Το [OpenCV](https://opencv.org/) θεωρείται το *de facto* πρότυπο για επεξεργασία εικόνας. Περιέχει πολλούς χρήσιμους αλγόριθμους, υλοποιημένους σε C++. Μπορείτε επίσης να χρησιμοποιήσετε το OpenCV από την Python.\n", "\n", "Σε αυτό το σημειωματάριο, θα σας δώσουμε μερικά παραδείγματα για τη χρήση του OpenCV. Για περισσότερες λεπτομέρειες, μπορείτε να επισκεφθείτε το διαδικτυακό μάθημα [Learn OpenCV](https://learnopencv.com/getting-started-with-opencv/).\n", "\n", - "Πρώτα, ας κάνουμε `import cv2`, καθώς και κάποιες άλλες χρήσιμες βιβλιοθήκες:\n" + "Πρώτα, ας κάνουμε `import cv2`, καθώς και μερικές άλλες χρήσιμες βιβλιοθήκες:\n" ] }, { @@ -44,7 +44,7 @@ "source": [ "## Φόρτωση Εικόνων\n", "\n", - "Οι εικόνες στην Python μπορούν να αναπαρασταθούν εύκολα με πίνακες NumPy. Για παράδειγμα, μια ασπρόμαυρη εικόνα με μέγεθος 320x200 pixels θα αποθηκευόταν σε έναν πίνακα 200x320, ενώ μια έγχρωμη εικόνα με τις ίδιες διαστάσεις θα είχε σχήμα 200x320x3 (για τα 3 κανάλια χρώματος).\n", + "Οι εικόνες στην Python μπορούν να αναπαρασταθούν εύκολα με πίνακες NumPy. Για παράδειγμα, μια ασπρόμαυρη εικόνα με μέγεθος 320x200 pixels θα αποθηκευτεί σε έναν πίνακα 200x320, ενώ μια έγχρωμη εικόνα με τις ίδιες διαστάσεις θα έχει σχήμα 200x320x3 (για τα 3 κανάλια χρώματος).\n", "\n", "Ας ξεκινήσουμε φορτώνοντας μια εικόνα:\n" ] @@ -94,7 +94,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Όπως μπορείτε να δείτε, είναι μια εικόνα κειμένου σε μπράιγ. Επειδή δεν μας ενδιαφέρει ιδιαίτερα το πραγματικό χρώμα, μπορούμε να το μετατρέψουμε σε ασπρόμαυρο:\n" + "Όπως μπορείτε να δείτε, είναι μια εικόνα κειμένου σε μπράιγ. Δεδομένου ότι δεν μας ενδιαφέρει ιδιαίτερα το πραγματικό χρώμα, μπορούμε να το μετατρέψουμε σε ασπρόμαυρο:\n" ] }, { @@ -135,7 +135,7 @@ "source": [ "bw_im = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)\n", "print(bw_im.shape)\n", - "plt.imshow(bw_im)" + "plt.imshow(bw_im, cmap='gray')" ] }, { @@ -146,7 +146,7 @@ "\n", "Αν θέλουμε να εφαρμόσουμε ταξινόμηση εικόνας για την αναγνώριση του κειμένου, πρέπει να απομονώσουμε τα μεμονωμένα σύμβολα ώστε να μοιάζουν με τις εικόνες MNIST που έχουμε δει προηγουμένως. Αυτό μπορεί να γίνει χρησιμοποιώντας την τεχνική [ανίχνευσης αντικειμένων](../11-ObjectDetection/README.md), την οποία θα συζητήσουμε αργότερα, αλλά μπορούμε επίσης να δοκιμάσουμε να χρησιμοποιήσουμε καθαρά τεχνικές υπολογιστικής όρασης για αυτό. Μια καλή περιγραφή του πώς η υπολογιστική όραση μπορεί να χρησιμοποιηθεί για τον διαχωρισμό χαρακτήρων μπορεί να βρεθεί [σε αυτήν την ανάρτηση ιστολογίου](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) - εδώ θα επικεντρωθούμε μόνο σε ορισμένες τεχνικές υπολογιστικής όρασης.\n", "\n", - "Πρώτα, ας προσπαθήσουμε να βελτιώσουμε λίγο την εικόνα. Μπορούμε να χρησιμοποιήσουμε την ιδέα του **κατωφλίου** (καλά περιγραφόμενο [σε αυτό το άρθρο του OpenCV](https://docs.opencv.org/4.x/d7/d4d/tutorial_py_thresholding.html)):\n" + "Αρχικά, ας προσπαθήσουμε να βελτιώσουμε λίγο την εικόνα. Μπορούμε να χρησιμοποιήσουμε την ιδέα του **thresholding** (καλά περιγραφόμενο [σε αυτό το άρθρο του OpenCV](https://docs.opencv.org/4.x/d7/d4d/tutorial_py_thresholding.html)):\n" ] }, { @@ -293,7 +293,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Επίσης, αυτό το κείμενο μπορεί να περιστραφεί μερικώς, και για να ευθυγραμμιστεί τέλεια πρέπει να γίνει η λεγόμενη **μετασχηματισμός προοπτικής**. Θα πάρουμε ένα ορθογώνιο που ορίζεται από τα σημεία $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ και θα το ευθυγραμμίσουμε με τη νέα εικόνα με αναλογικές διαστάσεις:\n" + "Επίσης, αυτό το κείμενο μπορεί να περιστραφεί μερικώς, και για να ευθυγραμμιστεί τέλεια πρέπει να κάνουμε τη λεγόμενη **μετασχηματισμό προοπτικής**. Θα πάρουμε ένα ορθογώνιο που ορίζεται από τα σημεία $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ και θα το ευθυγραμμίσουμε με μια νέα εικόνα με αναλογικές διαστάσεις:\n" ] }, { @@ -384,20 +384,20 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Έχετε δει ότι αρκετές εργασίες μπορούν να γίνουν χρησιμοποιώντας καθαρή επεξεργασία εικόνας, χωρίς καμία τεχνητή νοημοσύνη. Εάν μπορούμε να χρησιμοποιήσουμε τεχνικές υπολογιστικής όρασης για να κάνουμε τη δουλειά ενός νευρωνικού δικτύου απλούστερη - πρέπει οπωσδήποτε να το κάνουμε, γιατί αυτό θα μας επιτρέψει να λύσουμε προβλήματα με μικρότερο αριθμό δεδομένων εκπαίδευσης.\n" + "Έχετε δει ότι αρκετές εργασίες μπορούν να γίνουν χρησιμοποιώντας καθαρή επεξεργασία εικόνας, χωρίς καμία τεχνητή νοημοσύνη. Αν μπορούμε να χρησιμοποιήσουμε τεχνικές υπολογιστικής όρασης για να κάνουμε τη δουλειά ενός νευρωνικού δικτύου πιο απλή - θα πρέπει οπωσδήποτε να το κάνουμε, γιατί αυτό θα μας επιτρέψει να λύσουμε προβλήματα με μικρότερο αριθμό δεδομένων εκπαίδευσης.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Ανίχνευση Κίνησης με Χρήση Διαφοράς Καρέ\n", + "## Ανίχνευση Κίνησης με Διαφορά Καρέ\n", "\n", - "Η ανίχνευση κίνησης σε ροή βίντεο είναι μια πολύ συχνή εργασία. Για παράδειγμα, μας επιτρέπει να λαμβάνουμε ειδοποιήσεις όταν συμβαίνει κάτι σε μια κάμερα παρακολούθησης. Αν θέλουμε να κατανοήσουμε τι συμβαίνει στην κάμερα, μπορούμε να χρησιμοποιήσουμε ένα νευρωνικό δίκτυο - αλλά είναι πολύ πιο οικονομικό να χρησιμοποιήσουμε το νευρωνικό δίκτυο μόνο όταν γνωρίζουμε ότι κάτι συμβαίνει.\n", + "Η ανίχνευση κίνησης σε βίντεο είναι μια πολύ συχνή εργασία. Για παράδειγμα, μας επιτρέπει να λαμβάνουμε ειδοποιήσεις όταν συμβαίνει κάτι σε μια κάμερα παρακολούθησης. Αν θέλουμε να κατανοήσουμε τι συμβαίνει στην κάμερα, μπορούμε να χρησιμοποιήσουμε ένα νευρωνικό δίκτυο - αλλά είναι πολύ πιο οικονομικό να χρησιμοποιούμε το νευρωνικό δίκτυο μόνο όταν γνωρίζουμε ότι κάτι συμβαίνει.\n", "\n", - "Η βασική ιδέα της ανίχνευσης κίνησης είναι απλή. Αν η κάμερα είναι σταθερή, τότε τα καρέ από την κάμερα θα πρέπει να είναι αρκετά παρόμοια μεταξύ τους. Επειδή τα καρέ αναπαρίστανται ως πίνακες, απλώς αφαιρώντας αυτούς τους πίνακες για δύο διαδοχικά καρέ, θα πάρουμε τη διαφορά των εικονοστοιχείων, η οποία θα πρέπει να είναι χαμηλή για στατικά καρέ και να αυξάνεται όταν υπάρχει σημαντική κίνηση στην εικόνα.\n", + "Η βασική ιδέα της ανίχνευσης κίνησης είναι απλή. Αν η κάμερα είναι σταθερή, τότε τα καρέ από την κάμερα θα πρέπει να είναι αρκετά παρόμοια μεταξύ τους. Επειδή τα καρέ αναπαρίστανται ως πίνακες, απλώς αφαιρώντας αυτούς τους πίνακες για δύο διαδοχικά καρέ, θα πάρουμε τη διαφορά των pixel, η οποία θα πρέπει να είναι χαμηλή για στατικά καρέ και να αυξάνεται όταν υπάρχει σημαντική κίνηση στην εικόνα.\n", "\n", - "Θα ξεκινήσουμε μαθαίνοντας πώς να ανοίγουμε ένα βίντεο και να το μετατρέπουμε σε ακολουθία καρέ:\n" + "Θα ξεκινήσουμε μαθαίνοντας πώς να ανοίξουμε ένα βίντεο και να το μετατρέψουμε σε μια ακολουθία καρέ:\n" ] }, { @@ -445,7 +445,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Δεδομένου ότι το χρώμα δεν είναι τόσο σημαντικό για την ανίχνευση κίνησης, θα μετατρέψουμε όλα τα καρέ σε αποχρώσεις του γκρι. Στη συνέχεια, θα υπολογίσουμε τις διαφορές των καρέ και θα σχεδιάσουμε τις νόρμες τους για να δούμε οπτικά την ποσότητα δραστηριότητας που συμβαίνει:\n" + "Δεδομένου ότι το χρώμα δεν είναι τόσο σημαντικό για την ανίχνευση κίνησης, θα μετατρέψουμε όλα τα καρέ σε αποχρώσεις του γκρι. Στη συνέχεια, θα υπολογίσουμε τις διαφορές των καρέ και θα σχεδιάσουμε τους κανόνες τους για να δούμε οπτικά την ποσότητα δραστηριότητας που συμβαίνει:\n" ] }, { @@ -535,7 +535,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Τώρα μπορούμε να βρούμε καρέ που έχουν την ποσότητα αλλαγών πάνω από το όριο χρησιμοποιώντας `np.where`, και να εξαγάγουμε μια ακολουθία διαδοχικών καρέ που είναι μεγαλύτερη από 30 καρέ:\n" + "Τώρα μπορούμε να βρούμε καρέ που έχουν την ποσότητα αλλαγών πάνω από το όριο χρησιμοποιώντας `np.where`, και να εξαγάγουμε μια ακολουθία συνεχόμενων καρέ που είναι μεγαλύτερη από 30 καρέ:\n" ] }, { @@ -649,12 +649,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Εξαγωγή Κίνησης χρησιμοποιώντας Οπτική Ροή\n", + "## Εξαγωγή Κίνησης με Οπτική Ροή\n", "\n", - "Ενώ η σύγκριση δύο διαδοχικών καρέ μας επιτρέπει να δούμε την ποσότητα των αλλαγών, δεν μας δίνει πληροφορίες για το τι ακριβώς κινείται και πού. Για να αποκτήσουμε αυτές τις πληροφορίες, υπάρχει μια τεχνική που ονομάζεται **[οπτική ροή](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)**:\n", + "Η απλή σύγκριση δύο διαδοχικών καρέ μας επιτρέπει να δούμε την ποσότητα των αλλαγών, αλλά δεν μας δίνει πληροφορίες για το τι κινείται και πού. Για να αποκτήσουμε αυτές τις πληροφορίες, υπάρχει μια τεχνική που ονομάζεται **[οπτική ροή](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)**:\n", "\n", "* **Πυκνή Οπτική Ροή** υπολογίζει το πεδίο διανυσμάτων που δείχνει για κάθε pixel πού κινείται.\n", - "* **Αραιή Οπτική Ροή** βασίζεται στην επιλογή κάποιων χαρακτηριστικών στοιχείων στην εικόνα (π.χ. άκρες) και στην κατασκευή της τροχιάς τους από καρέ σε καρέ.\n", + "* **Αραιή Οπτική Ροή** βασίζεται στη λήψη κάποιων χαρακτηριστικών στοιχείων της εικόνας (π.χ. άκρες) και στην κατασκευή της τροχιάς τους από καρέ σε καρέ.\n", "\n", "Διαβάστε περισσότερα για την οπτική ροή [σε αυτό το εξαιρετικό tutorial](https://learnopencv.com/optical-flow-in-opencv/).\n", "\n", @@ -689,7 +689,7 @@ "source": [ "Όπως μπορείτε να δείτε, για κάθε καρέ η ροή έχει τη διάσταση του καρέ και 2 κανάλια, που αντιστοιχούν στα x και y συστατικά του διανύσματος οπτικής ροής.\n", "\n", - "Η απεικόνιση της οπτικής ροής σε 2D είναι λίγο δύσκολη, αλλά μπορούμε να χρησιμοποιήσουμε μια έξυπνη ιδέα. Αν μετατρέψουμε την οπτική ροή σε πολικές συντεταγμένες, τότε θα έχουμε δύο συστατικά για κάθε pixel: *κατεύθυνση* και *ένταση*. Μπορούμε να αναπαραστήσουμε την ένταση μέσω της φωτεινότητας του pixel και την κατεύθυνση μέσω διαφορετικών χρωμάτων. Θα δημιουργήσουμε μια εικόνα στον [χρωματικό χώρο HSV (Απόχρωση-Κορεσμός-Φωτεινότητα)](https://en.wikipedia.org/wiki/HSV_color_space), όπου η απόχρωση θα ορίζεται από την κατεύθυνση, η φωτεινότητα από την ένταση και ο κορεσμός θα είναι 255.\n" + "Η απεικόνιση της οπτικής ροής σε 2D είναι λίγο δύσκολη, αλλά μπορούμε να χρησιμοποιήσουμε μια έξυπνη ιδέα. Αν μετατρέψουμε την οπτική ροή σε πολικές συντεταγμένες, τότε θα έχουμε δύο συστατικά για κάθε pixel: *κατεύθυνση* και *ένταση*. Μπορούμε να αναπαραστήσουμε την ένταση μέσω της φωτεινότητας του pixel και την κατεύθυνση μέσω διαφορετικών χρωμάτων. Θα δημιουργήσουμε μια εικόνα στον [χρωματικό χώρο HSV (Hue-Saturation-Value)](https://en.wikipedia.org/wiki/HSV_color_space), όπου η απόχρωση (hue) θα καθορίζεται από την κατεύθυνση, η φωτεινότητα (value) από την ένταση και ο κορεσμός (saturation) θα είναι 255.\n" ] }, { @@ -738,16 +738,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Σε αυτά τα πλαίσια, το πρασινωπό χρώμα αντιστοιχεί στην κίνηση προς τα αριστερά, ενώ το μπλε - στην κίνηση προς τα δεξιά.\n", + "Έτσι, σε αυτά τα καρέ το πρασινωπό χρώμα αντιστοιχεί στην κίνηση προς τα αριστερά, ενώ το μπλε - στην κίνηση προς τα δεξιά.\n", "\n", - "Η οπτική ροή μπορεί να είναι ένα εξαιρετικό εργαλείο για να βγάλουμε συμπεράσματα σχετικά με τη γενική κατεύθυνση της κίνησης. Για παράδειγμα, αν παρατηρήσετε ότι όλα τα pixels σε ένα πλαίσιο κινούνται λίγο-πολύ προς μία κατεύθυνση - μπορείτε να συμπεράνετε ότι υπάρχει κίνηση της κάμερας και να προσπαθήσετε να την αντισταθμίσετε.\n" + "Η οπτική ροή μπορεί να είναι ένα εξαιρετικό εργαλείο για να βγάλουμε συμπεράσματα σχετικά με τη γενική κατεύθυνση της κίνησης. Για παράδειγμα, αν δείτε ότι όλα τα pixels σε ένα καρέ κινούνται λίγο-πολύ προς μία κατεύθυνση - μπορείτε να συμπεράνετε ότι υπάρχει κίνηση της κάμερας και να προσπαθήσετε να την αντισταθμίσετε.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**Αποποίηση ευθύνης**: \nΑυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης AI [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτόματες μεταφράσεις ενδέχεται να περιέχουν σφάλματα ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης.\n" + "\n---\n\n**Αποποίηση ευθύνης**: \nΑυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτόματες μεταφράσεις ενδέχεται να περιέχουν σφάλματα ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης.\n" ] } ], @@ -774,8 +774,8 @@ }, "orig_nbformat": 4, "coopTranslator": { - "original_hash": "ad5bdca62175c7a3d4336ef8c761aef3", - "translation_date": "2025-08-29T09:58:09+00:00", + "original_hash": "339b2129f86b24024393ff92b8bd376f", + "translation_date": "2025-09-07T15:06:29+00:00", "source_file": "lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb", "language_code": "el" } diff --git a/translations/en/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb b/translations/en/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb index 3ec2391b..54039fe9 100644 --- a/translations/en/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb +++ b/translations/en/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb @@ -8,7 +8,7 @@ "\n", "This notebook is part of the [AI for Beginners Curriculum](http://aka.ms/ai-beginners).\n", "\n", - "[OpenCV](https://opencv.org/) is widely regarded as the *de facto* standard for image processing. It offers a variety of useful algorithms implemented in C++. You can also use OpenCV with Python.\n", + "[OpenCV](https://opencv.org/) is widely regarded as the *de facto* standard for image processing. It includes numerous useful algorithms implemented in C++. You can also use OpenCV with Python.\n", "\n", "In this notebook, we will provide some examples of how to use OpenCV. For more detailed information, you can check out the [Learn OpenCV](https://learnopencv.com/getting-started-with-opencv/) online course.\n", "\n", @@ -44,7 +44,7 @@ "source": [ "## Loading Images\n", "\n", - "Images in Python can easily be represented using NumPy arrays. For instance, a grayscale image with dimensions of 320x200 pixels would be stored in a 200x320 array, while a color image of the same size would have a shape of 200x320x3 (representing the 3 color channels).\n", + "Images in Python can be easily represented using NumPy arrays. For instance, a grayscale image with dimensions of 320x200 pixels would be stored in a 200x320 array, while a color image of the same size would have a shape of 200x320x3 (to account for the 3 color channels).\n", "\n", "Let's begin by loading an image:\n" ] @@ -135,7 +135,7 @@ "source": [ "bw_im = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)\n", "print(bw_im.shape)\n", - "plt.imshow(bw_im)" + "plt.imshow(bw_im, cmap='gray')" ] }, { @@ -144,9 +144,9 @@ "source": [ "## Braille Image Processing\n", "\n", - "If we want to use image classification to recognize text, we need to isolate individual symbols to make them resemble MNIST images we've seen before. This can be achieved using [object detection](../11-ObjectDetection/README.md), which we will discuss later, but we can also attempt to use pure computer vision techniques for this purpose. A detailed explanation of how computer vision can be applied for character separation can be found [in this blog post](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/)—here, we will focus on a few specific computer vision methods.\n", + "To apply image classification for text recognition, we need to isolate individual symbols to make them resemble MNIST images we've encountered before. This can be achieved using the [object detection](../11-ObjectDetection/README.md) technique, which we will discuss later. However, we can also attempt to use pure computer vision methods for this task. A detailed explanation of how computer vision can be utilized for character separation is available [in this blog post](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/). Here, we will focus on a few specific computer vision techniques.\n", "\n", - "First, let's try to improve the image slightly. We can use the concept of **thresholding** (well explained [in this OpenCV article](https://docs.opencv.org/4.x/d7/d4d/tutorial_py_thresholding.html)):\n" + "First, let's enhance the image slightly. We can use the concept of **thresholding** (well explained [in this OpenCV article](https://docs.opencv.org/4.x/d7/d4d/tutorial_py_thresholding.html)):\n" ] }, { @@ -393,9 +393,9 @@ "source": [ "## Motion Detection using Frame Difference\n", "\n", - "Detecting motion in a video stream is a common task. For instance, it enables us to receive alerts when something occurs on a surveillance camera. If we want to analyze what's happening on the camera, we can use a neural network—but using a neural network becomes much more efficient when we already know that some activity is taking place.\n", + "Detecting motion in a video stream is a common task. For instance, it enables us to receive alerts when something occurs on a surveillance camera. If we want to analyze what's happening on the camera, we can use a neural network—but employing a neural network becomes much more efficient when we already know that some activity is taking place.\n", "\n", - "The core concept of motion detection is straightforward. If the camera is stationary, the frames captured by the camera should be quite similar to one another. Since frames are represented as arrays, subtracting the arrays of two consecutive frames will reveal the pixel differences. These differences will be minimal for static frames and increase significantly when there is notable motion in the image.\n", + "The core concept of motion detection is straightforward. If the camera is stationary, the frames captured by the camera should be quite similar to one another. Since frames are stored as arrays, subtracting the arrays of two consecutive frames will reveal the pixel differences. These differences will be minimal for static frames but will increase significantly when there is notable motion in the image.\n", "\n", "We'll begin by learning how to open a video and convert it into a sequence of frames:\n" ] @@ -651,12 +651,12 @@ "source": [ "## Extract Motion using Optical Flow\n", "\n", - "While simply comparing two consecutive frames can show the extent of changes, it doesn't provide information about what is moving and where. To obtain that information, we use a technique called **[optical flow](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)**:\n", + "While simply comparing two consecutive frames can show the extent of changes, it doesn't provide information about what is moving and where. To obtain that information, there is a technique called **[optical flow](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)**:\n", "\n", "* **Dense Optical Flow** calculates a vector field that indicates the movement of each pixel.\n", - "* **Sparse Optical Flow** focuses on identifying distinctive features in the image (e.g., edges) and tracking their movement from one frame to the next.\n", + "* **Sparse Optical Flow** focuses on identifying distinctive features in the image (e.g., edges) and tracking their movement from frame to frame.\n", "\n", - "You can learn more about optical flow [in this excellent tutorial](https://learnopencv.com/optical-flow-in-opencv/).\n", + "Learn more about optical flow [in this excellent tutorial](https://learnopencv.com/optical-flow-in-opencv/).\n", "\n", "Now, let's compute dense optical flow between our frames:\n" ] @@ -687,9 +687,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "For each frame, the flow matches the dimensions of the frame and consists of 2 channels, representing the x and y components of the optical flow vector.\n", + "For each frame, the flow has the same dimensions as the frame and consists of 2 channels, representing the x and y components of the optical flow vector.\n", "\n", - "Visualizing optical flow in 2D can be somewhat tricky, but there's a clever approach we can use. By converting the optical flow into polar coordinates, we obtain two components for each pixel: *direction* and *magnitude*. We can represent magnitude using pixel intensity and direction using different colors. To achieve this, we'll create an image in the [HSV (Hue-Saturation-Value) color space](https://en.wikipedia.org/wiki/HSV_color_space), where hue corresponds to direction, value represents magnitude, and saturation is set to 255.\n" + "Visualizing optical flow in 2D can be a bit tricky, but there's a clever approach we can use. By converting the optical flow to polar coordinates, we obtain two components for each pixel: *direction* and *magnitude*. We can represent the magnitude using pixel intensity and the direction using different colors. To achieve this, we'll create an image in the [HSV (Hue-Saturation-Value) color space](https://en.wikipedia.org/wiki/HSV_color_space), where hue corresponds to direction, value represents magnitude, and saturation is set to 255.\n" ] }, { @@ -740,14 +740,14 @@ "source": [ "So, in those frames, greenish color indicates movement to the left, while blue represents movement to the right.\n", "\n", - "Optical flow can be a useful tool for understanding the overall direction of movement. For instance, if you notice that most pixels in a frame are moving in roughly the same direction, you can infer that there is camera movement and attempt to compensate for it.\n" + "Optical flow can be a useful tool for understanding the overall direction of movement. For instance, if you notice that all pixels in a frame are moving in roughly the same direction, you can infer that there is camera movement and attempt to compensate for it.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**Disclaimer**: \nThis document has been translated using the AI translation service [Co-op Translator](https://github.com/Azure/co-op-translator). While we aim for accuracy, please note that automated translations may include errors or inaccuracies. The original document in its native language should be regarded as the authoritative source. For critical information, professional human translation is advised. We are not responsible for any misunderstandings or misinterpretations resulting from the use of this translation.\n" + "\n---\n\n**Disclaimer**: \nThis document has been translated using the AI translation service [Co-op Translator](https://github.com/Azure/co-op-translator). While we strive for accuracy, please note that automated translations may contain errors or inaccuracies. The original document in its native language should be regarded as the authoritative source. For critical information, professional human translation is recommended. We are not responsible for any misunderstandings or misinterpretations resulting from the use of this translation.\n" ] } ], @@ -774,8 +774,8 @@ }, "orig_nbformat": 4, "coopTranslator": { - "original_hash": "ad5bdca62175c7a3d4336ef8c761aef3", - "translation_date": "2025-08-31T18:14:22+00:00", + "original_hash": "339b2129f86b24024393ff92b8bd376f", + "translation_date": "2025-09-07T14:48:53+00:00", "source_file": "lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb", "language_code": "en" } diff --git a/translations/es/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb b/translations/es/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb index 25196301..31a2b0fe 100644 --- a/translations/es/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb +++ b/translations/es/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb @@ -135,18 +135,18 @@ "source": [ "bw_im = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)\n", "print(bw_im.shape)\n", - "plt.imshow(bw_im)" + "plt.imshow(bw_im, cmap='gray')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Procesamiento de Imágenes en Braille\n", + "## Procesamiento de Imágenes Braille\n", "\n", - "Si queremos aplicar clasificación de imágenes para reconocer el texto, necesitamos recortar símbolos individuales para que sean similares a las imágenes de MNIST que hemos visto antes. Esto se puede lograr utilizando la técnica de [detección de objetos](../11-ObjectDetection/README.md), que discutiremos más adelante, pero también podemos intentar usar visión por computadora pura para ello. Una buena descripción de cómo se puede usar la visión por computadora para la separación de caracteres se encuentra [en este artículo de blog](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) - aquí nos centraremos únicamente en algunas técnicas de visión por computadora.\n", + "Si queremos aplicar clasificación de imágenes para reconocer el texto, necesitamos recortar los símbolos individuales para que sean similares a las imágenes MNIST que hemos visto antes. Esto se puede hacer utilizando la técnica de [detección de objetos](../11-ObjectDetection/README.md), que discutiremos más adelante, pero también podemos intentar usar visión por computadora pura para ello. Una buena descripción de cómo se puede usar la visión por computadora para la separación de caracteres se encuentra [en este artículo de blog](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) - aquí nos enfocaremos únicamente en algunas técnicas de visión por computadora.\n", "\n", - "Primero, intentemos mejorar un poco la imagen. Podemos usar la idea de **binarización** (bien descrita [en este artículo de OpenCV](https://docs.opencv.org/4.x/d7/d4d/tutorial_py_thresholding.html)):\n" + "Primero, intentemos mejorar un poco la imagen. Podemos usar la idea de **umbralización** (bien descrita [en este artículo de OpenCV](https://docs.opencv.org/4.x/d7/d4d/tutorial_py_thresholding.html)):\n" ] }, { @@ -384,18 +384,18 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Has visto que se pueden realizar bastantes tareas utilizando procesamiento de imágenes puro, sin ninguna inteligencia artificial. Si podemos usar técnicas de visión por computadora para simplificar el trabajo de una red neuronal, definitivamente deberíamos hacerlo, porque nos permitirá resolver problemas con una menor cantidad de datos de entrenamiento.\n" + "Has visto que se pueden realizar bastantes tareas utilizando únicamente el procesamiento de imágenes, sin necesidad de inteligencia artificial. Si podemos usar técnicas de visión por computadora para simplificar el trabajo de una red neuronal, definitivamente deberíamos hacerlo, porque nos permitirá resolver problemas con una menor cantidad de datos de entrenamiento.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Detección de movimiento usando diferencia de fotogramas\n", + "## Detección de Movimiento usando Diferencia de Fotogramas\n", "\n", - "Detectar movimiento en una transmisión de video es una tarea muy común. Por ejemplo, nos permite recibir alertas cuando ocurre algo en una cámara de vigilancia. Si queremos entender qué está sucediendo en la cámara, podemos usar una red neuronal, pero es mucho más económico utilizarla solo cuando sabemos que algo está ocurriendo.\n", + "Detectar movimiento en una transmisión de video es una tarea muy común. Por ejemplo, nos permite recibir alertas cuando algo sucede en una cámara de vigilancia. Si queremos entender qué está ocurriendo en la cámara, podemos usar una red neuronal, pero es mucho más económico utilizarla solo cuando sabemos que algo está pasando.\n", "\n", - "La idea principal de la detección de movimiento es sencilla. Si la cámara está fija, los fotogramas de la cámara deberían ser bastante similares entre sí. Dado que los fotogramas se representan como matrices, al restar esas matrices de dos fotogramas consecutivos obtendremos la diferencia de píxeles, que debería ser baja para fotogramas estáticos y aumentar cuando hay un movimiento significativo en la imagen.\n", + "La idea principal de la detección de movimiento es sencilla. Si la cámara está fija, los fotogramas de la cámara deberían ser bastante similares entre sí. Dado que los fotogramas se representan como matrices, al restar estas matrices de dos fotogramas consecutivos obtendremos la diferencia de píxeles, que debería ser baja para fotogramas estáticos y aumentar significativamente cuando hay un movimiento sustancial en la imagen.\n", "\n", "Comenzaremos aprendiendo cómo abrir un video y convertirlo en una secuencia de fotogramas:\n" ] @@ -445,7 +445,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Dado que el color no es tan importante para la detección de movimiento, convertiremos todos los fotogramas a escala de grises. Luego, calcularemos las diferencias entre fotogramas y graficaremos sus normas para ver visualmente la cantidad de actividad que ocurre:\n" + "Dado que el color no es tan importante para la detección de movimiento, convertiremos todos los fotogramas a escala de grises. Luego, calcularemos las diferencias entre fotogramas y graficaremos sus normas para visualizar la cantidad de actividad que ocurre:\n" ] }, { @@ -535,7 +535,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Ahora podemos encontrar los fotogramas que tienen la cantidad de cambios por encima del umbral utilizando `np.where`, y extraer una secuencia de fotogramas consecutivos que sea más larga que 30 fotogramas:\n" + "Ahora podemos encontrar los fotogramas que tienen la cantidad de cambios por encima del umbral utilizando `np.where`, y extraer una secuencia de fotogramas consecutivos que sea más larga de 30 fotogramas:\n" ] }, { @@ -610,7 +610,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Es posible que notes que el esquema de colores en esta imagen no se vea bien. Esto se debe a que OpenCV, por razones históricas, carga imágenes en el espacio de color BGR, mientras que matplotlib utiliza el orden de color RGB más tradicional. La mayoría de las veces, tiene sentido convertir las imágenes a RGB inmediatamente después de cargarlas.\n" + "¡Puede notar que el esquema de colores en esta imagen no se ve correcto! Esto se debe a que OpenCV, por razones históricas, carga imágenes en el espacio de color BGR, mientras que matplotlib utiliza el orden de color RGB más tradicional. La mayoría de las veces, tiene sentido convertir las imágenes a RGB inmediatamente después de cargarlas.\n" ] }, { @@ -687,9 +687,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Como puedes ver, para cada fotograma el flujo tiene las dimensiones del fotograma y 2 canales, que corresponden a los componentes x e y del vector de flujo óptico.\n", + "Como puedes ver, para cada fotograma el flujo tiene las dimensiones del fotograma y 2 canales, que corresponden a las componentes x e y del vector de flujo óptico.\n", "\n", - "Mostrar el flujo óptico en 2D es un poco complicado, pero podemos usar una idea ingeniosa. Si convertimos el flujo óptico a coordenadas polares, obtendremos dos componentes para cada píxel: *dirección* e *intensidad*. Podemos representar la intensidad mediante la intensidad del píxel, y la dirección con diferentes colores. Crearemos una imagen en el [espacio de color HSV (Tono-Saturación-Valor)](https://en.wikipedia.org/wiki/HSV_color_space), donde el tono será definido por la dirección, el valor por la intensidad, y la saturación será 255.\n" + "Mostrar el flujo óptico en 2D es un poco complicado, pero podemos usar una idea ingeniosa. Si convertimos el flujo óptico a coordenadas polares, obtendremos dos componentes para cada píxel: *dirección* e *intensidad*. Podemos representar la intensidad mediante la intensidad del píxel, y la dirección con diferentes colores. Crearemos una imagen en el [espacio de color HSV (Tono-Saturación-Valor)](https://en.wikipedia.org/wiki/HSV_color_space), donde el tono estará definido por la dirección, el valor por la intensidad, y la saturación será 255.\n" ] }, { @@ -738,16 +738,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Entonces, en esos fotogramas, el color verdoso corresponde al movimiento hacia la izquierda, mientras que el azul indica movimiento hacia la derecha.\n", + "Entonces, en esos fotogramas el color verdoso corresponde al movimiento hacia la izquierda, mientras que el azul indica movimiento hacia la derecha.\n", "\n", - "El flujo óptico puede ser una herramienta excelente para sacar conclusiones sobre la dirección general del movimiento. Por ejemplo, si observas que todos los píxeles en un fotograma se mueven más o menos en una misma dirección, puedes concluir que hay movimiento de cámara y tratar de compensarlo.\n" + "El flujo óptico puede ser una herramienta excelente para sacar conclusiones sobre la dirección general del movimiento. Por ejemplo, si observas que todos los píxeles en un fotograma se mueven más o menos en una misma dirección, puedes concluir que hay movimiento de cámara e intentar compensarlo.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**Descargo de responsabilidad**: \nEste documento ha sido traducido utilizando el servicio de traducción automática [Co-op Translator](https://github.com/Azure/co-op-translator). Si bien nos esforzamos por garantizar la precisión, tenga en cuenta que las traducciones automatizadas pueden contener errores o imprecisiones. El documento original en su idioma nativo debe considerarse la fuente autorizada. Para información crítica, se recomienda una traducción profesional realizada por humanos. No nos hacemos responsables de malentendidos o interpretaciones erróneas que puedan surgir del uso de esta traducción.\n" + "\n---\n\n**Descargo de responsabilidad**: \nEste documento ha sido traducido utilizando el servicio de traducción automática [Co-op Translator](https://github.com/Azure/co-op-translator). Si bien nos esforzamos por lograr precisión, tenga en cuenta que las traducciones automáticas pueden contener errores o imprecisiones. El documento original en su idioma nativo debe considerarse como la fuente autorizada. Para información crítica, se recomienda una traducción profesional realizada por humanos. No nos hacemos responsables de malentendidos o interpretaciones erróneas que puedan surgir del uso de esta traducción.\n" ] } ], @@ -774,8 +774,8 @@ }, "orig_nbformat": 4, "coopTranslator": { - "original_hash": "ad5bdca62175c7a3d4336ef8c761aef3", - "translation_date": "2025-08-31T16:07:32+00:00", + "original_hash": "339b2129f86b24024393ff92b8bd376f", + "translation_date": "2025-09-07T14:50:16+00:00", "source_file": "lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb", "language_code": "es" } diff --git a/translations/fa/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb b/translations/fa/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb index 20004de1..180b03c1 100644 --- a/translations/fa/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb +++ b/translations/fa/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb @@ -6,13 +6,13 @@ "source": [ "# بینایی کامپیوتر و OpenCV\n", "\n", - "این نوت‌بوک بخشی از [برنامه درسی هوش مصنوعی برای مبتدیان](http://aka.ms/ai-beginners) است.\n", + "این دفترچه بخشی از [برنامه آموزشی AI برای مبتدیان](http://aka.ms/ai-beginners) است.\n", "\n", - "[OpenCV](https://opencv.org/) به عنوان استاندارد *د فاکتو* برای پردازش تصویر شناخته می‌شود. این کتابخانه شامل الگوریتم‌های بسیار مفیدی است که به زبان C++ پیاده‌سازی شده‌اند. شما می‌توانید OpenCV را از طریق پایتون نیز فراخوانی کنید.\n", + "[OpenCV](https://opencv.org/) به عنوان استاندارد *de facto* برای پردازش تصویر شناخته می‌شود. این کتابخانه شامل تعداد زیادی الگوریتم مفید است که به زبان C++ پیاده‌سازی شده‌اند. شما می‌توانید OpenCV را از طریق زبان Python نیز فراخوانی کنید.\n", "\n", - "در این نوت‌بوک، چند مثال برای استفاده از OpenCV ارائه خواهیم داد. برای جزئیات بیشتر، می‌توانید به دوره آنلاین [آموزش OpenCV](https://learnopencv.com/getting-started-with-opencv/) مراجعه کنید.\n", + "در این دفترچه، چند مثال برای استفاده از OpenCV ارائه خواهیم داد. برای جزئیات بیشتر، می‌توانید به دوره آنلاین [Learn OpenCV](https://learnopencv.com/getting-started-with-opencv/) مراجعه کنید.\n", "\n", - "ابتدا بیایید `cv2` و همچنین چند کتابخانه مفید دیگر را وارد کنیم:\n" + "ابتدا بیایید `cv2` را به همراه چند کتابخانه مفید دیگر وارد کنیم:\n" ] }, { @@ -94,7 +94,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "همانطور که می‌بینید، این تصویر متن بریل است. از آنجا که ما به رنگ واقعی خیلی علاقه‌مند نیستیم، می‌توانیم آن را به سیاه و سفید تبدیل کنیم:\n" + "همان‌طور که می‌بینید، این تصویر متن بریل است. از آنجا که به رنگ واقعی آن خیلی علاقه‌مند نیستیم، می‌توانیم آن را به سیاه‌وسفید تبدیل کنیم:\n" ] }, { @@ -135,7 +135,7 @@ "source": [ "bw_im = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)\n", "print(bw_im.shape)\n", - "plt.imshow(bw_im)" + "plt.imshow(bw_im, cmap='gray')" ] }, { @@ -144,7 +144,7 @@ "source": [ "## پردازش تصویر بریل\n", "\n", - "اگر بخواهیم از طبقه‌بندی تصویر برای شناسایی متن استفاده کنیم، باید نمادهای جداگانه را برش دهیم تا آنها شبیه تصاویر MNIST شوند که قبلاً دیده‌ایم. این کار را می‌توان با استفاده از تکنیک [تشخیص اشیاء](../11-ObjectDetection/README.md) که بعداً درباره آن صحبت خواهیم کرد انجام داد، اما همچنین می‌توانیم تلاش کنیم از بینایی کامپیوتری خالص برای این منظور استفاده کنیم. توضیح خوبی درباره اینکه چگونه بینایی کامپیوتری می‌تواند برای جداسازی کاراکترها استفاده شود [در این پست وبلاگ](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) یافت می‌شود - ما فقط بر روی برخی تکنیک‌های بینایی کامپیوتری در اینجا تمرکز خواهیم کرد.\n", + "اگر بخواهیم از طبقه‌بندی تصویر برای شناسایی متن استفاده کنیم، باید نمادهای جداگانه را برش دهیم تا شبیه تصاویر MNIST شوند که قبلاً دیده‌ایم. این کار می‌تواند با استفاده از تکنیک [تشخیص اشیاء](../11-ObjectDetection/README.md) که بعداً درباره آن صحبت خواهیم کرد انجام شود، اما همچنین می‌توانیم تلاش کنیم از بینایی کامپیوتری خالص برای این منظور استفاده کنیم. توضیح خوبی درباره اینکه چگونه بینایی کامپیوتری می‌تواند برای جداسازی کاراکترها استفاده شود [در این پست وبلاگ](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) یافت می‌شود - ما فقط بر روی برخی تکنیک‌های بینایی کامپیوتری در اینجا تمرکز خواهیم کرد.\n", "\n", "ابتدا، بیایید سعی کنیم تصویر را کمی بهبود دهیم. می‌توانیم از ایده **آستانه‌گذاری** استفاده کنیم (به خوبی [در این مقاله OpenCV](https://docs.opencv.org/4.x/d7/d4d/tutorial_py_thresholding.html) توضیح داده شده است):\n" ] @@ -252,7 +252,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "برای جدا کردن کاراکترهای فردی، باید جعبه محدود کننده کل متن را بدانیم. برای پیدا کردن آن، می‌توانیم فقط مختصات حداقل و حداکثر را محاسبه کنیم:\n" + "برای جدا کردن کاراکترهای منفرد، باید جعبه محدودکننده کل متن را بدانیم. برای پیدا کردن آن، می‌توانیم به سادگی مختصات حداقل و حداکثر را محاسبه کنیم:\n" ] }, { @@ -293,7 +293,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "همچنین، این متن می‌تواند تا حدی چرخانده شود و برای تراز کردن کامل آن نیاز به انجام به اصطلاح **تبدیل پرسپکتیو** داریم. ما یک مستطیل تعریف‌شده توسط نقاط $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ را گرفته و آن را با تصویر جدید با ابعاد متناسب تراز خواهیم کرد:\n" + "همچنین، این متن می‌تواند تا حدی چرخانده شود و برای تراز کردن کامل آن نیاز به انجام **تبدیل پرسپکتیو** داریم. ما یک مستطیل تعریف‌شده با نقاط $(x_{min},y_{min})، (x_{min},y_{max})، (x_{max},y_{min})، (x_{max},y_{max})$ را می‌گیریم و آن را با تصویر جدید با ابعاد متناسب تراز می‌کنیم:\n" ] }, { @@ -384,7 +384,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "شما دیده‌اید که تعداد زیادی از وظایف را می‌توان با استفاده از پردازش تصویر خالص انجام داد، بدون هیچ هوش مصنوعی. اگر بتوانیم از تکنیک‌های بینایی کامپیوتری برای ساده‌تر کردن کار شبکه عصبی استفاده کنیم - قطعاً باید این کار را انجام دهیم، زیرا این کار به ما امکان می‌دهد مشکلات را با تعداد کمتری از داده‌های آموزشی حل کنیم.\n" + "شما دیده‌اید که تعداد زیادی از وظایف را می‌توان با استفاده از پردازش تصویر خالص انجام داد، بدون هیچ هوش مصنوعی. اگر بتوانیم از تکنیک‌های بینایی کامپیوتر برای ساده‌تر کردن کار شبکه عصبی استفاده کنیم - قطعاً باید این کار را انجام دهیم، زیرا این کار به ما امکان می‌دهد مشکلات را با تعداد کمتری از داده‌های آموزشی حل کنیم.\n" ] }, { @@ -393,11 +393,11 @@ "source": [ "## تشخیص حرکت با استفاده از تفاوت فریم‌ها\n", "\n", - "تشخیص حرکت در جریان ویدئو یک وظیفه بسیار رایج است. به عنوان مثال، این کار به ما امکان می‌دهد زمانی که چیزی در دوربین نظارتی اتفاق می‌افتد، هشدار دریافت کنیم. اگر بخواهیم بفهمیم چه چیزی در دوربین در حال رخ دادن است، می‌توانیم از یک شبکه عصبی استفاده کنیم - اما استفاده از شبکه عصبی زمانی که بدانیم چیزی در حال وقوع است، بسیار ارزان‌تر خواهد بود.\n", + "تشخیص حرکت در جریان ویدئو یک وظیفه بسیار رایج است. به عنوان مثال، این امکان را به ما می‌دهد که وقتی چیزی روی دوربین نظارتی اتفاق می‌افتد، هشدار دریافت کنیم. اگر بخواهیم بفهمیم چه اتفاقی روی دوربین در حال رخ دادن است، می‌توانیم از یک شبکه عصبی استفاده کنیم - اما استفاده از شبکه عصبی زمانی که بدانیم چیزی در حال رخ دادن است، بسیار ارزان‌تر خواهد بود.\n", "\n", - "ایده اصلی تشخیص حرکت ساده است. اگر دوربین ثابت باشد، فریم‌های دوربین باید تا حد زیادی شبیه به یکدیگر باشند. از آنجا که فریم‌ها به صورت آرایه‌ها نمایش داده می‌شوند، تنها با کم کردن این آرایه‌ها برای دو فریم متوالی می‌توانیم تفاوت پیکسل‌ها را به دست آوریم، که این تفاوت برای فریم‌های ثابت کم خواهد بود و زمانی که حرکت قابل توجهی در تصویر وجود داشته باشد، افزایش می‌یابد.\n", + "ایده اصلی تشخیص حرکت ساده است. اگر دوربین ثابت باشد، فریم‌های دوربین باید تا حد زیادی مشابه یکدیگر باشند. از آنجا که فریم‌ها به صورت آرایه‌ها نمایش داده می‌شوند، فقط با کم کردن این آرایه‌ها برای دو فریم متوالی، تفاوت پیکسل‌ها را به دست می‌آوریم، که برای فریم‌های ثابت باید کم باشد و زمانی که حرکت قابل توجهی در تصویر وجود داشته باشد، افزایش پیدا کند.\n", "\n", - "ما با یادگیری نحوه باز کردن یک ویدئو و تبدیل آن به یک توالی از فریم‌ها شروع خواهیم کرد:\n" + "ما با یادگیری نحوه باز کردن یک ویدئو و تبدیل آن به یک دنباله از فریم‌ها شروع خواهیم کرد:\n" ] }, { @@ -445,7 +445,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "از آنجا که رنگ برای تشخیص حرکت چندان مهم نیست، تمام فریم‌ها را به حالت خاکستری تبدیل می‌کنیم. سپس تفاوت‌های فریم‌ها را محاسبه کرده و نُرم‌های آن‌ها را رسم می‌کنیم تا میزان فعالیت در حال وقوع را به صورت بصری مشاهده کنیم:\n" + "از آنجا که رنگ برای تشخیص حرکت چندان مهم نیست، تمام فریم‌ها را به مقیاس خاکستری تبدیل می‌کنیم. سپس، تفاوت‌های فریم را محاسبه کرده و نُرم‌های آن‌ها را ترسیم می‌کنیم تا به صورت بصری میزان فعالیت را مشاهده کنیم:\n" ] }, { @@ -490,7 +490,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "فرض کنید می‌خواهیم گزارشی ایجاد کنیم که نشان دهد چه اتفاقی جلوی دوربین افتاده است، با نمایش تصویر مناسب هر بار که چیزی اتفاق می‌افتد. برای انجام این کار، احتمالاً می‌خواهیم فریم شروع و پایان یک \"رویداد\" را پیدا کنیم و فریم میانی را نمایش دهیم. برای حذف برخی نویزها، همچنین منحنی بالا را با تابع میانگین متحرک صاف خواهیم کرد.\n" + "فرض کنید می‌خواهیم گزارشی تهیه کنیم که نشان دهد چه اتفاقی در مقابل دوربین افتاده است، با نمایش تصویر مناسب هر بار که چیزی رخ می‌دهد. برای انجام این کار، احتمالاً می‌خواهیم فریم شروع و پایان یک \"رویداد\" را پیدا کنیم و فریم میانی را نمایش دهیم. برای حذف برخی نویزها، همچنین منحنی بالا را با استفاده از تابع میانگین متحرک هموار خواهیم کرد:\n" ] }, { @@ -651,10 +651,10 @@ "source": [ "## استخراج حرکت با استفاده از جریان نوری\n", "\n", - "در حالی که مقایسه دو فریم متوالی به ما امکان می‌دهد میزان تغییرات را ببینیم، اما اطلاعاتی درباره اینکه چه چیزی در حال حرکت است و کجا، ارائه نمی‌دهد. برای به دست آوردن این اطلاعات، تکنیکی به نام **[جریان نوری](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)** وجود دارد:\n", + "در حالی که مقایسه دو فریم متوالی به ما امکان مشاهده میزان تغییرات را می‌دهد، اطلاعاتی درباره اینکه چه چیزی واقعاً در حال حرکت است و کجا حرکت می‌کند ارائه نمی‌دهد. برای به دست آوردن این اطلاعات، تکنیکی به نام **[جریان نوری](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)** وجود دارد:\n", "\n", "* **جریان نوری متراکم** میدان برداری را محاسبه می‌کند که نشان می‌دهد هر پیکسل به کجا حرکت می‌کند.\n", - "* **جریان نوری پراکنده** بر اساس انتخاب برخی ویژگی‌های متمایز در تصویر (مانند لبه‌ها) و ساخت مسیر حرکت آن‌ها از یک فریم به فریم دیگر است.\n", + "* **جریان نوری پراکنده** بر اساس انتخاب برخی ویژگی‌های متمایز در تصویر (مانند لبه‌ها) و ساخت مسیر حرکت آنها از یک فریم به فریم دیگر است.\n", "\n", "بیشتر درباره جریان نوری [در این آموزش عالی](https://learnopencv.com/optical-flow-in-opencv/) بخوانید.\n", "\n", @@ -687,9 +687,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "همان‌طور که می‌بینید، برای هر فریم، جریان دارای ابعاد فریم و دو کانال است که به اجزای x و y بردار جریان نوری مربوط می‌شوند.\n", + "همانطور که مشاهده می‌کنید، برای هر فریم جریان دارای ابعاد فریم و دو کانال است که به اجزای x و y بردار جریان نوری مربوط می‌شوند.\n", "\n", - "نمایش جریان نوری در دو بعد کمی چالش‌برانگیز است، اما می‌توانیم از یک ایده هوشمندانه استفاده کنیم. اگر جریان نوری را به مختصات قطبی تبدیل کنیم، برای هر پیکسل دو مؤلفه خواهیم داشت: *جهت* و *شدت*. می‌توانیم شدت را با شدت پیکسل و جهت را با رنگ‌های مختلف نمایش دهیم. تصویری در فضای رنگی [HSV (رنگ-اشباع-ارزش)](https://en.wikipedia.org/wiki/HSV_color_space) ایجاد خواهیم کرد، که در آن رنگ (hue) با جهت، ارزش (value) با شدت، و اشباع (saturation) برابر با ۲۵۵ تعریف می‌شود.\n" + "نمایش جریان نوری در دو بعد کمی چالش‌برانگیز است، اما می‌توانیم از یک ایده هوشمندانه استفاده کنیم. اگر جریان نوری را به مختصات قطبی تبدیل کنیم، برای هر پیکسل دو مؤلفه خواهیم داشت: *جهت* و *شدت*. می‌توانیم شدت را با شدت پیکسل نشان دهیم و جهت را با رنگ‌های مختلف نمایش دهیم. ما تصویری در [فضای رنگی HSV (رنگ-اشباع-ارزش)](https://en.wikipedia.org/wiki/HSV_color_space) ایجاد خواهیم کرد، که در آن رنگ (hue) توسط جهت تعریف می‌شود، ارزش (value) توسط شدت، و اشباع (saturation) برابر با ۲۵۵ خواهد بود.\n" ] }, { @@ -740,14 +740,14 @@ "source": [ "بنابراین، در این فریم‌ها، رنگ سبز نشان‌دهنده حرکت به سمت چپ است، در حالی که رنگ آبی نشان‌دهنده حرکت به سمت راست است.\n", "\n", - "جریان نوری می‌تواند ابزار بسیار خوبی برای نتیجه‌گیری درباره جهت کلی حرکت باشد. برای مثال، اگر ببینید که تمام پیکسل‌ها در یک فریم کم‌وبیش در یک جهت حرکت می‌کنند، می‌توانید نتیجه بگیرید که دوربین در حال حرکت است و سعی کنید این حرکت را جبران کنید.\n" + "جریان نوری می‌تواند ابزار بسیار مفیدی برای نتیجه‌گیری درباره جهت کلی حرکت باشد. برای مثال، اگر ببینید که تمام پیکسل‌ها در یک فریم کم‌وبیش در یک جهت حرکت می‌کنند، می‌توانید نتیجه بگیرید که دوربین در حال حرکت است و سعی کنید این حرکت را جبران کنید.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**سلب مسئولیت**: \nاین سند با استفاده از سرویس ترجمه هوش مصنوعی [Co-op Translator](https://github.com/Azure/co-op-translator) ترجمه شده است. در حالی که ما تلاش می‌کنیم دقت را حفظ کنیم، لطفاً توجه داشته باشید که ترجمه‌های خودکار ممکن است شامل خطاها یا نادرستی‌ها باشند. سند اصلی به زبان اصلی آن باید به عنوان منبع معتبر در نظر گرفته شود. برای اطلاعات حساس، توصیه می‌شود از ترجمه حرفه‌ای انسانی استفاده کنید. ما مسئولیتی در قبال سوءتفاهم‌ها یا تفسیرهای نادرست ناشی از استفاده از این ترجمه نداریم.\n" + "\n---\n\n**سلب مسئولیت**: \nاین سند با استفاده از سرویس ترجمه هوش مصنوعی [Co-op Translator](https://github.com/Azure/co-op-translator) ترجمه شده است. در حالی که ما برای دقت تلاش می‌کنیم، لطفاً توجه داشته باشید که ترجمه‌های خودکار ممکن است شامل خطاها یا نادقتی‌هایی باشند. سند اصلی به زبان اصلی آن باید به عنوان منبع معتبر در نظر گرفته شود. برای اطلاعات حساس، ترجمه حرفه‌ای انسانی توصیه می‌شود. ما هیچ مسئولیتی در قبال سوءتفاهم‌ها یا تفسیرهای نادرست ناشی از استفاده از این ترجمه نداریم.\n" ] } ], @@ -774,8 +774,8 @@ }, "orig_nbformat": 4, "coopTranslator": { - "original_hash": "ad5bdca62175c7a3d4336ef8c761aef3", - "translation_date": "2025-08-31T16:08:21+00:00", + "original_hash": "339b2129f86b24024393ff92b8bd376f", + "translation_date": "2025-09-07T14:53:14+00:00", "source_file": "lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb", "language_code": "fa" } diff --git a/translations/fi/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb b/translations/fi/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb index bf445cd8..abf5e9ea 100644 --- a/translations/fi/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb +++ b/translations/fi/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb @@ -44,9 +44,9 @@ "source": [ "## Kuvien lataaminen\n", "\n", - "Pythonissa kuvia voidaan kätevästi esittää NumPy-taulukoina. Esimerkiksi harmaasävykuva, jonka koko on 320x200 pikseliä, tallennetaan 200x320-taulukkoon, ja saman kokoisella värikuvalla olisi muoto 200x320x3 (3 värikanavaa varten).\n", + "Kuvat Pythonissa voidaan kätevästi esittää NumPy-taulukoina. Esimerkiksi harmaasävykuva, jonka koko on 320x200 pikseliä, tallennettaisiin 200x320-taulukkoon, ja saman kokoisella värikuvalla olisi muoto 200x320x3 (3 värikanavaa varten).\n", "\n", - "Aloitetaan lataamalla kuva:\n" + "Aloitetaan kuvan lataamisella:\n" ] }, { @@ -94,7 +94,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Kuten näet, kyseessä on pistekirjoitustekstin kuva. Koska emme ole kovin kiinnostuneita itse väristä, voimme muuntaa sen mustavalkoiseksi:\n" + "Kuten näet, se on pistekirjoitustekstin kuva. Koska emme ole kovin kiinnostuneita varsinaisesta väristä, voimme muuntaa sen mustavalkoiseksi:\n" ] }, { @@ -135,7 +135,7 @@ "source": [ "bw_im = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)\n", "print(bw_im.shape)\n", - "plt.imshow(bw_im)" + "plt.imshow(bw_im, cmap='gray')" ] }, { @@ -192,7 +192,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Jotta voimme työskennellä kuvien kanssa, meidän täytyy \"erottaa\" yksittäiset pisteet, eli muuntaa kuvat yksittäisten pisteiden koordinaattijoukoksi. Voimme tehdä sen käyttämällä **piirteen eristämisen** tekniikoita, kuten SIFT, SURF tai [ORB](https://docs.opencv.org/4.x/d1/d89/tutorial_py_orb.html):\n" + "Jotta voimme työskennellä kuvien kanssa, meidän on \"erotettava\" yksittäiset pisteet, eli muunnettava kuvat yksittäisten pisteiden koordinaattijoukoksi. Voimme tehdä sen käyttämällä **piirteen eristämisen** tekniikoita, kuten SIFT, SURF tai [ORB](https://docs.opencv.org/4.x/d1/d89/tutorial_py_orb.html):\n" ] }, { @@ -252,7 +252,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Jotta voimme erottaa yksittäiset merkit, meidän täytyy tietää koko tekstin rajauslaatikko. Sen selvittämiseksi voimme yksinkertaisesti laskea minimi- ja maksimiarvot:\n" + "Jotta voimme erottaa yksittäiset merkit, meidän on tiedettävä koko tekstin rajauslaatikko. Sen selvittämiseksi voimme yksinkertaisesti laskea minimi- ja maksimiarvot koordinaateille:\n" ] }, { @@ -293,7 +293,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "My apologies, but I cannot comply with your request.\n" + "Myös tämä teksti voi olla osittain kiertynyt, ja jotta se saadaan täydellisesti linjaan, meidän täytyy tehdä niin sanottu **perspektiivimuunnos**. Otamme suorakulmion, joka on määritelty pisteillä $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ ja linjaamme sen uuden kuvan kanssa, jolla on suhteelliset mitat:\n" ] }, { @@ -384,20 +384,20 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Olet nähnyt, että melko paljon tehtäviä voidaan suorittaa käyttämällä pelkkää kuvankäsittelyä, ilman minkäänlaista tekoälyä. Jos voimme käyttää konenäön tekniikoita tehdäksemme neuroverkon työn yksinkertaisemmaksi - meidän pitäisi ehdottomasti tehdä niin, koska se mahdollistaa ongelmien ratkaisemisen pienemmällä määrällä opetusdataa.\n" + "Olet nähnyt, että melko paljon tehtäviä voidaan suorittaa pelkällä kuvankäsittelyllä ilman tekoälyä. Jos voimme käyttää konenäön tekniikoita helpottamaan neuroverkon työtä - meidän pitäisi ehdottomasti tehdä niin, koska se mahdollistaa ongelmien ratkaisemisen pienemmällä määrällä opetusdataa.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Liikkeentunnistus käyttämällä kehysten eroa\n", + "## Liikkeentunnistus kehysten erotuksen avulla\n", "\n", - "Liikkeen tunnistaminen videovirroista on hyvin yleinen tehtävä. Esimerkiksi se mahdollistaa hälytysten saamisen, kun jotain tapahtuu valvontakamerassa. Jos haluamme ymmärtää, mitä kamerassa tapahtuu, voimme käyttää neuroverkkoa – mutta neuroverkon käyttö on paljon edullisempaa, kun tiedämme, että jotain on meneillään.\n", + "Liikkeen tunnistaminen videovirrasta on hyvin yleinen tehtävä. Esimerkiksi se mahdollistaa hälytysten saamisen, kun valvontakamerassa tapahtuu jotain. Jos haluamme ymmärtää, mitä kamerassa tapahtuu, voimme käyttää neuroverkkoa – mutta neuroverkon käyttö on huomattavasti edullisempaa, kun tiedämme, että jotain on meneillään.\n", "\n", - "Liikkeentunnistuksen perusidea on yksinkertainen. Jos kamera on kiinteä, kameran kehysten pitäisi olla melko samanlaisia keskenään. Koska kehykset esitetään taulukkoina, pelkästään vähentämällä kahden peräkkäisen kehyksen taulukot toisistaan saamme pikselieron, joka on pieni staattisissa kehyksissä ja kasvaa merkittävästi, kun kuvassa tapahtuu huomattavaa liikettä.\n", + "Liikkeentunnistuksen perusidea on yksinkertainen. Jos kamera on kiinteä, kameran kehysten pitäisi olla melko samanlaisia keskenään. Koska kehykset esitetään taulukkoina, voimme yksinkertaisesti vähentää kahden peräkkäisen kehyksen taulukot toisistaan ja saada pikselierotuksen. Tämä erotus on pieni staattisissa kehyksissä ja kasvaa merkittävästi, kun kuvassa on huomattavaa liikettä.\n", "\n", - "Aloitamme opettelemalla, kuinka avata video ja muuntaa se kehysten sarjaksi:\n" + "Aloitamme opettelemalla, kuinka avata video ja muuntaa se kehysjaksoksi:\n" ] }, { @@ -445,7 +445,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Koska väri ei ole niin tärkeä liikkeentunnistuksessa, muutamme kaikki kehykset harmaasävyiksi. Sen jälkeen laskemme kehysten erot ja piirrämme niiden normit, jotta voimme visuaalisesti nähdä tapahtuvan toiminnan määrän:\n" + "Koska väri ei ole niin tärkeä liikkeentunnistuksessa, muutamme kaikki kehykset harmaasävyiksi. Sitten laskemme kehysten erot ja piirrämme niiden normit, jotta voimme visuaalisesti nähdä tapahtuvan toiminnan määrän:\n" ] }, { @@ -490,7 +490,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Oletetaan, että haluamme luoda raportin, joka näyttää, mitä kameran edessä tapahtui, näyttämällä sopivan kuvan aina, kun jotain tapahtuu. Tätä varten haluamme todennäköisesti selvittää \"tapahtuman\" alku- ja loppukehyksen ja näyttää keskimmäisen kehyksen. Poistaaksemme jonkin verran kohinaa, tasoitamme myös yllä olevaa käyrää liukuvan keskiarvotoiminnon avulla:\n" + "Oletetaan, että haluamme luoda raportin, joka näyttää, mitä kameran edessä tapahtui, näyttämällä sopivan kuvan aina, kun jotain tapahtuu. Tämän tekemiseksi haluamme luultavasti selvittää \"tapahtuman\" alku- ja loppukehyksen ja näyttää keskimmäisen kehyksen. Poistaaksemme jonkin verran kohinaa, tasoitamme myös yllä olevaa käyrää liukuvan keskiarvon funktiolla:\n" ] }, { @@ -535,7 +535,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Nyt voimme löytää kehykset, joissa muutosten määrä ylittää kynnyksen käyttämällä `np.where`, ja poimia yli 30 kehystä pitkän peräkkäisten kehysten jakson:\n" + "Nyt voimme löytää kehykset, joissa muutosten määrä ylittää kynnyksen, käyttämällä `np.where`, ja poimia yli 30 kehystä pitkän peräkkäisten kehysten jakson:\n" ] }, { @@ -649,16 +649,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Liikkeen erottaminen optisella virtauksella\n", + "## Liikkeen erottaminen optisen virtauksen avulla\n", "\n", - "Vaikka kahden peräkkäisen kehyksen vertaaminen antaa meille tietoa muutosten määrästä, se ei kerro, mikä tarkalleen liikkuu ja missä. Tämän tiedon saamiseksi on olemassa tekniikka nimeltä **[optinen virtaus](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)**:\n", + "Vaikka kahden peräkkäisen ruudun vertailu näyttää muutosten määrän, se ei kerro, mikä oikeastaan liikkuu ja missä. Tämän tiedon saamiseksi on olemassa tekniikka nimeltä **[optinen virtaus](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)**:\n", "\n", - "* **Tiheä optinen virtaus** laskee vektorikentän, joka näyttää jokaiselle pikselille, mihin suuntaan se liikkuu.\n", - "* **Harva optinen virtaus** perustuu siihen, että kuvasta valitaan joitakin erottuvia piirteitä (esim. reunat) ja niiden liikerata rakennetaan kehyksestä toiseen.\n", + "* **Tiheä optinen virtaus** laskee vektorikentän, joka näyttää, mihin suuntaan kukin pikseli liikkuu.\n", + "* **Harva optinen virtaus** perustuu siihen, että kuvasta otetaan joitakin tunnistettavia piirteitä (esim. reunat) ja niiden liikerata rakennetaan ruudusta toiseen.\n", "\n", - "Lue lisää optisesta virtauksesta [tästä erinomaisesta oppaasta](https://learnopencv.com/optical-flow-in-opencv/).\n", + "Lue lisää optisesta virtauksesta [tästä erinomaisesta tutoriaalista](https://learnopencv.com/optical-flow-in-opencv/).\n", "\n", - "Lasketaan tiheä optinen virtaus kehystemme välillä:\n" + "Lasketaan tiheä optinen virtaus ruutujemme välillä:\n" ] }, { @@ -687,9 +687,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Kuten näet, jokaisella kehyksellä virtaus vastaa kehyksen ulottuvuuksia ja sisältää 2 kanavaa, jotka vastaavat optisen virtausvektorin x- ja y-komponentteja.\n", + "Kuten huomaat, jokaisella kehyksellä virtaus vastaa kehyksen ulottuvuutta ja sisältää kaksi kanavaa, jotka vastaavat optisen virtauksen vektorin x- ja y-komponentteja.\n", "\n", - "Optisen virtauksen esittäminen 2D-muodossa on hieman haastavaa, mutta voimme käyttää yhtä nerokasta ideaa. Jos muutamme optisen virtauksen napakoordinaatteihin, saamme jokaiselle pikselille kaksi komponenttia: *suunta* ja *voimakkuus*. Voimakkuuden voimme esittää pikselin kirkkaudella ja suunnan eri väreillä. Luomme kuvan [HSV (Hue-Saturation-Value) -värimallissa](https://en.wikipedia.org/wiki/HSV_color_space), jossa sävy määritellään suunnan mukaan, kirkkaus voimakkuuden mukaan ja kylläisyys on 255.\n" + "Optisen virtauksen esittäminen 2D-muodossa on hieman haastavaa, mutta voimme hyödyntää erästä nerokasta ideaa. Jos muutamme optisen virtauksen napakoordinaatteihin, saamme jokaiselle pikselille kaksi komponenttia: *suunnan* ja *voimakkuuden*. Voimme esittää voimakkuuden pikselin kirkkaudella ja suunnan eri väreillä. Luomme kuvan [HSV (sävy-kylläisyys-arvo) -väriavaruudessa](https://en.wikipedia.org/wiki/HSV_color_space), jossa sävy määräytyy suunnan mukaan, arvo voimakkuuden mukaan ja kylläisyys on 255.\n" ] }, { @@ -738,7 +738,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Joten näissä kehyksissä vihertävä väri tarkoittaa liikettä vasemmalle, kun taas sininen - liikettä oikealle.\n", + "Joten näissä kehyksissä vihertävä väri vastaa liikettä vasemmalle, kun taas sininen - liikettä oikealle.\n", "\n", "Optinen virtaus voi olla erinomainen työkalu päätelmien tekemiseen liikkeen yleisestä suunnasta. Esimerkiksi, jos huomaat, että kaikki pikselit kehyksessä liikkuvat suunnilleen yhteen suuntaan - voit päätellä, että kyseessä on kameran liike, ja yrittää kompensoida sitä.\n" ] @@ -747,7 +747,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**Vastuuvapauslauseke**: \nTämä asiakirja on käännetty käyttämällä tekoälypohjaista käännöspalvelua [Co-op Translator](https://github.com/Azure/co-op-translator). Vaikka pyrimme tarkkuuteen, huomioithan, että automaattiset käännökset voivat sisältää virheitä tai epätarkkuuksia. Alkuperäistä asiakirjaa sen alkuperäisellä kielellä tulisi pitää ensisijaisena lähteenä. Kriittisen tiedon osalta suositellaan ammattimaista ihmiskäännöstä. Emme ole vastuussa väärinkäsityksistä tai virhetulkinnoista, jotka johtuvat tämän käännöksen käytöstä.\n" + "\n---\n\n**Vastuuvapauslauseke**: \nTämä asiakirja on käännetty käyttämällä tekoälypohjaista käännöspalvelua [Co-op Translator](https://github.com/Azure/co-op-translator). Vaikka pyrimme tarkkuuteen, huomioithan, että automaattiset käännökset voivat sisältää virheitä tai epätarkkuuksia. Alkuperäinen asiakirja sen alkuperäisellä kielellä tulisi pitää ensisijaisena lähteenä. Kriittisen tiedon osalta suositellaan ammattimaista ihmiskäännöstä. Emme ole vastuussa väärinkäsityksistä tai virhetulkinnoista, jotka johtuvat tämän käännöksen käytöstä.\n" ] } ], @@ -774,8 +774,8 @@ }, "orig_nbformat": 4, "coopTranslator": { - "original_hash": "ad5bdca62175c7a3d4336ef8c761aef3", - "translation_date": "2025-08-28T20:44:23+00:00", + "original_hash": "339b2129f86b24024393ff92b8bd376f", + "translation_date": "2025-09-07T15:10:12+00:00", "source_file": "lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb", "language_code": "fi" } diff --git a/translations/fr/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb b/translations/fr/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb index 08cf418a..7c9dbd6c 100644 --- a/translations/fr/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb +++ b/translations/fr/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb @@ -44,7 +44,7 @@ "source": [ "## Chargement des images\n", "\n", - "Les images en Python peuvent être facilement représentées par des tableaux NumPy. Par exemple, une image en niveaux de gris de 320x200 pixels serait stockée dans un tableau de 200x320, et une image en couleur des mêmes dimensions aurait une forme de 200x320x3 (pour les 3 canaux de couleur).\n", + "Les images en Python peuvent être facilement représentées par des tableaux NumPy. Par exemple, une image en niveaux de gris de taille 320x200 pixels serait stockée dans un tableau de 200x320, et une image en couleur des mêmes dimensions aurait une forme de 200x320x3 (pour les 3 canaux de couleur).\n", "\n", "Commençons par charger une image :\n" ] @@ -94,7 +94,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Comme vous pouvez le voir, c'est une image de texte en braille. Étant donné que nous ne sommes pas très intéressés par la couleur réelle, nous pouvons la convertir en noir et blanc :\n" + "Comme vous pouvez le voir, c'est une image de texte en braille. Comme nous ne sommes pas très intéressés par la couleur réelle, nous pouvons la convertir en noir et blanc :\n" ] }, { @@ -135,7 +135,7 @@ "source": [ "bw_im = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)\n", "print(bw_im.shape)\n", - "plt.imshow(bw_im)" + "plt.imshow(bw_im, cmap='gray')" ] }, { @@ -146,7 +146,7 @@ "\n", "Si nous voulons appliquer la classification d'images pour reconnaître le texte, nous devons découper les symboles individuels afin de les rendre similaires aux images MNIST que nous avons vues auparavant. Cela peut être réalisé en utilisant la technique de [détection d'objets](../11-ObjectDetection/README.md), que nous aborderons plus tard, mais nous pouvons également essayer d'utiliser uniquement la vision par ordinateur pour cela. Une bonne description de la manière dont la vision par ordinateur peut être utilisée pour séparer les caractères se trouve [dans cet article de blog](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) - ici, nous nous concentrerons uniquement sur certaines techniques de vision par ordinateur.\n", "\n", - "Tout d'abord, essayons d'améliorer un peu l'image. Nous pouvons utiliser l'idée de **seuils** (bien expliquée [dans cet article OpenCV](https://docs.opencv.org/4.x/d7/d4d/tutorial_py_thresholding.html)) :\n" + "Tout d'abord, essayons d'améliorer un peu l'image. Nous pouvons utiliser l'idée de **seuiling** (bien expliquée [dans cet article d'OpenCV](https://docs.opencv.org/4.x/d7/d4d/tutorial_py_thresholding.html)) :\n" ] }, { @@ -252,7 +252,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Pour séparer les caractères individuels, nous devons connaître la boîte englobante de l'ensemble du texte. Pour la déterminer, nous pouvons simplement calculer les coordonnées min et max :\n" + "Pour séparer les caractères individuels, nous devons connaître la boîte englobante de tout le texte. Pour la trouver, nous pouvons simplement calculer les coordonnées min et max :\n" ] }, { @@ -293,7 +293,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Aussi, ce texte peut être partiellement tourné, et pour le rendre parfaitement aligné, nous devons effectuer ce qu'on appelle une **transformation de perspective**. Nous prendrons un rectangle défini par les points $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ et l'alignerons avec une nouvelle image aux dimensions proportionnelles :\n" + "De plus, ce texte peut être partiellement tourné, et pour le rendre parfaitement aligné, nous devons effectuer ce que l'on appelle une **transformation de perspective**. Nous prendrons un rectangle défini par les points $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ et l'alignerons avec une nouvelle image aux dimensions proportionnelles :\n" ] }, { @@ -395,9 +395,9 @@ "\n", "La détection de mouvement dans un flux vidéo est une tâche très courante. Par exemple, elle permet de recevoir des alertes lorsqu'un événement se produit sur une caméra de surveillance. Si nous voulons comprendre ce qui se passe sur la caméra, nous pouvons ensuite utiliser un réseau neuronal - mais il est beaucoup plus économique d'utiliser un réseau neuronal uniquement lorsque nous savons qu'il se passe quelque chose.\n", "\n", - "L'idée principale de la détection de mouvement est simple. Si la caméra est fixe, alors les images capturées par la caméra devraient être assez similaires les unes aux autres. Comme les images sont représentées sous forme de tableaux, il suffit de soustraire ces tableaux pour deux images consécutives afin d'obtenir la différence de pixels. Cette différence devrait être faible pour des images statiques et devenir plus importante lorsqu'il y a un mouvement significatif dans l'image.\n", + "L'idée principale de la détection de mouvement est simple. Si la caméra est fixe, les images capturées par la caméra devraient être assez similaires les unes aux autres. Étant donné que les images sont représentées sous forme de tableaux, il suffit de soustraire ces tableaux pour deux images consécutives afin d'obtenir la différence de pixels, qui devrait être faible pour des images statiques, et devenir plus élevée lorsqu'il y a un mouvement significatif dans l'image.\n", "\n", - "Nous allons commencer par apprendre à ouvrir une vidéo et à la convertir en une séquence d'images :\n" + "Nous allons commencer par apprendre à ouvrir une vidéo et la convertir en une séquence d'images :\n" ] }, { @@ -445,7 +445,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Étant donné que la couleur n'est pas si importante pour la détection de mouvement, nous convertirons tous les cadres en niveaux de gris. Ensuite, nous calculerons les différences entre les cadres et tracerons leurs normes pour visualiser la quantité d'activité en cours :\n" + "Puisque la couleur n'est pas si importante pour la détection de mouvement, nous convertirons tous les cadres en niveaux de gris. Ensuite, nous calculerons les différences entre les cadres et tracerons leurs normes pour visualiser la quantité d'activité en cours :\n" ] }, { @@ -490,7 +490,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Supposons que nous voulons créer un rapport qui montre ce qui s'est passé devant la caméra en affichant l'image appropriée chaque fois que quelque chose se produit. Pour ce faire, nous voudrons probablement identifier le début et la fin d'une \"événement\", et afficher l'image du cadre central. Pour éliminer un peu de bruit, nous allons également lisser la courbe ci-dessus avec une fonction de moyenne mobile :\n" + "Supposons que nous voulons créer un rapport qui montre ce qui s'est passé devant la caméra en affichant l'image appropriée chaque fois que quelque chose se produit. Pour ce faire, nous voudrons probablement identifier le début et la fin d'un \"événement\", et afficher l'image du milieu. Pour éliminer un peu de bruit, nous allons également lisser la courbe ci-dessus avec une fonction de moyenne mobile :\n" ] }, { @@ -535,7 +535,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Maintenant, nous pouvons trouver les images qui ont une quantité de changements au-dessus du seuil en utilisant `np.where`, et extraire une séquence d'images consécutives qui est plus longue que 30 images :\n" + "Maintenant, nous pouvons trouver les images qui ont un nombre de changements supérieur au seuil en utilisant `np.where`, et extraire une séquence d'images consécutives de plus de 30 images :\n" ] }, { @@ -608,7 +608,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Vous pouvez remarquer que le schéma de couleurs sur cette image ne semble pas correct ! Cela est dû au fait qu'OpenCV, pour des raisons historiques, charge les images dans l'espace colorimétrique BGR, tandis que matplotlib utilise un ordre de couleurs RGB plus traditionnel. La plupart du temps, il est logique de convertir les images en RGB immédiatement après les avoir chargées.\n" + "Vous pouvez remarquer que le schéma de couleurs sur cette image ne semble pas correct ! Cela est dû au fait qu'OpenCV, pour des raisons historiques, charge les images dans l'espace colorimétrique BGR, tandis que matplotlib utilise un ordre de couleurs RGB plus traditionnel. La plupart du temps, il est logique de convertir les images en RGB immédiatement après leur chargement.\n" ] }, { @@ -647,16 +647,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Extraire le Mouvement avec le Flux Optique\n", + "## Extraire le mouvement à l'aide du flux optique\n", "\n", - "Bien que comparer deux images consécutives permette de voir la quantité de changements, cela ne donne aucune information sur ce qui bouge réellement et où cela se produit. Pour obtenir ces informations, il existe une technique appelée **[flux optique](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)** :\n", + "Bien que comparer deux images consécutives permette de voir la quantité de changements, cela ne fournit aucune information sur ce qui bouge réellement et où. Pour obtenir ces informations, il existe une technique appelée **[flux optique](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)** :\n", "\n", - "* **Flux Optique Dense** calcule le champ vectoriel qui montre, pour chaque pixel, où il se déplace.\n", - "* **Flux Optique Épars** se base sur la sélection de certaines caractéristiques distinctives dans l'image (par exemple, les contours) et sur la construction de leur trajectoire d'une image à l'autre.\n", + "* **Flux optique dense** calcule le champ vectoriel qui indique pour chaque pixel où il se déplace.\n", + "* **Flux optique épars** repose sur la sélection de certaines caractéristiques distinctives dans l'image (par exemple, les contours) et sur la construction de leur trajectoire d'une image à l'autre.\n", "\n", - "Lisez-en davantage sur le flux optique [dans ce tutoriel excellent](https://learnopencv.com/optical-flow-in-opencv/).\n", + "Lisez-en davantage sur le flux optique [dans cet excellent tutoriel](https://learnopencv.com/optical-flow-in-opencv/).\n", "\n", - "Calculons maintenant le flux optique dense entre nos images :\n" + "Calculons le flux optique dense entre nos images :\n" ] }, { @@ -685,9 +685,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Comme vous pouvez le voir, pour chaque frame, le flux a les dimensions de la frame, ainsi que 2 canaux correspondant aux composantes x et y du vecteur de flux optique.\n", + "Comme vous pouvez le voir, pour chaque frame, le flux a les dimensions de la frame, et 2 canaux correspondant aux composantes x et y du vecteur de flux optique.\n", "\n", - "Afficher le flux optique en 2D est un peu complexe, mais nous pouvons utiliser une idée astucieuse. Si nous convertissons le flux optique en coordonnées polaires, nous obtiendrons alors deux composantes pour chaque pixel : *direction* et *intensité*. Nous pouvons représenter l'intensité par l'intensité du pixel, et la direction par différentes couleurs. Nous allons créer une image dans l'[espace colorimétrique HSV (Teinte-Saturation-Valeur)](https://en.wikipedia.org/wiki/HSV_color_space), où la teinte sera définie par la direction, la valeur par l'intensité, et la saturation sera fixée à 255.\n" + "Afficher le flux optique en 2D est un peu complexe, mais nous pouvons utiliser une idée astucieuse. Si nous convertissons le flux optique en coordonnées polaires, nous obtiendrons alors deux composantes pour chaque pixel : *direction* et *intensité*. Nous pouvons représenter l'intensité par l'intensité du pixel, et la direction par différentes couleurs. Nous allons créer une image dans l’[espace colorimétrique HSV (Teinte-Saturation-Valeur)](https://en.wikipedia.org/wiki/HSV_color_space), où la teinte sera définie par la direction, la valeur par l’intensité, et la saturation sera fixée à 255.\n" ] }, { @@ -738,14 +738,14 @@ "source": [ "Ainsi, dans ces images, la couleur verdâtre correspond à un mouvement vers la gauche, tandis que le bleu indique un mouvement vers la droite.\n", "\n", - "Le flux optique peut être un excellent outil pour tirer des conclusions sur la direction générale du mouvement. Par exemple, si vous constatez que tous les pixels d'une image se déplacent plus ou moins dans une même direction, vous pouvez en déduire qu'il y a un mouvement de la caméra et essayer de le compenser.\n" + "Le flux optique peut être un excellent outil pour tirer des conclusions sur la direction générale du mouvement. Par exemple, si vous constatez que tous les pixels d'une image se déplacent plus ou moins dans une seule direction, vous pouvez en déduire qu'il y a un mouvement de caméra et essayer de le compenser.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**Avertissement** : \nCe document a été traduit à l'aide du service de traduction automatique [Co-op Translator](https://github.com/Azure/co-op-translator). Bien que nous nous efforcions d'assurer l'exactitude, veuillez noter que les traductions automatisées peuvent contenir des erreurs ou des inexactitudes. Le document original dans sa langue d'origine doit être considéré comme la source faisant autorité. Pour des informations critiques, il est recommandé de recourir à une traduction professionnelle réalisée par un humain. Nous déclinons toute responsabilité en cas de malentendus ou d'interprétations erronées résultant de l'utilisation de cette traduction.\n" + "\n---\n\n**Avertissement** : \nCe document a été traduit à l'aide du service de traduction automatique [Co-op Translator](https://github.com/Azure/co-op-translator). Bien que nous nous efforcions d'assurer l'exactitude, veuillez noter que les traductions automatisées peuvent contenir des erreurs ou des inexactitudes. Le document original dans sa langue d'origine doit être considéré comme la source faisant autorité. Pour des informations critiques, il est recommandé de faire appel à une traduction humaine professionnelle. Nous déclinons toute responsabilité en cas de malentendus ou d'interprétations erronées résultant de l'utilisation de cette traduction.\n" ] } ], @@ -772,8 +772,8 @@ }, "orig_nbformat": 4, "coopTranslator": { - "original_hash": "ad5bdca62175c7a3d4336ef8c761aef3", - "translation_date": "2025-08-31T14:41:41+00:00", + "original_hash": "339b2129f86b24024393ff92b8bd376f", + "translation_date": "2025-09-07T14:49:35+00:00", "source_file": "lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb", "language_code": "fr" } diff --git a/translations/he/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb b/translations/he/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb index 7efc193c..f63b63b3 100644 --- a/translations/he/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb +++ b/translations/he/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb @@ -6,7 +6,7 @@ "source": [ "# ראייה ממוחשבת ו-OpenCV\n", "\n", - "מחברת זו היא חלק מ-[תוכנית הלימודים למתחילים בתחום הבינה המלאכותית](http://aka.ms/ai-beginners).\n", + "מחברת זו היא חלק מ-[AI for Beginners Curriculum](http://aka.ms/ai-beginners).\n", "\n", "[OpenCV](https://opencv.org/) נחשב לסטנדרט *דה פקטו* לעיבוד תמונה. הוא מכיל הרבה אלגוריתמים שימושיים, שמיושמים ב-C++. ניתן גם להשתמש ב-OpenCV דרך Python.\n", "\n", @@ -44,7 +44,7 @@ "source": [ "## טעינת תמונות\n", "\n", - "תמונות בפייתון יכולות להיות מיוצגות בצורה נוחה באמצעות מערכים של NumPy. לדוגמה, תמונה בגווני אפור בגודל של 320x200 פיקסלים תישמר במערך בגודל 200x320, ותמונה צבעונית באותו ממד תהיה בעלת צורה של 200x320x3 (עבור 3 ערוצי צבע).\n", + "תמונות בפייתון יכולות להיות מיוצגות בצורה נוחה באמצעות מערכים של NumPy. לדוגמה, תמונה בגווני אפור בגודל של 320x200 פיקסלים תישמר במערך בגודל 200x320, ותמונה צבעונית באותו גודל תהיה בעלת מבנה של 200x320x3 (עבור 3 ערוצי צבע).\n", "\n", "בואו נתחיל בטעינת תמונה:\n" ] @@ -94,7 +94,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "כפי שאתה יכול לראות, זו תמונה של טקסט בברייל. מכיוון שאיננו מתעניינים במיוחד בצבע עצמו, אנו יכולים להמיר אותו לשחור-לבן:\n" + "כפי שאתה יכול לראות, זו תמונה של טקסט בכתב ברייל. מכיוון שאיננו מתעניינים במיוחד בצבע עצמו, נוכל להמיר אותה לשחור-לבן:\n" ] }, { @@ -135,7 +135,7 @@ "source": [ "bw_im = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)\n", "print(bw_im.shape)\n", - "plt.imshow(bw_im)" + "plt.imshow(bw_im, cmap='gray')" ] }, { @@ -144,9 +144,9 @@ "source": [ "## עיבוד תמונה של כתב ברייל\n", "\n", - "אם אנחנו רוצים ליישם סיווג תמונות כדי לזהות את הטקסט, עלינו לחתוך סמלים בודדים כדי להפוך אותם לדומים לתמונות MNIST שראינו בעבר. ניתן לעשות זאת באמצעות [זיהוי אובייקטים](../11-ObjectDetection/README.md), טכניקה שנדון בה מאוחר יותר, אך ניתן גם לנסות להשתמש בראייה ממוחשבת טהורה לשם כך. תיאור טוב של איך ניתן להשתמש בראייה ממוחשבת להפרדת תווים ניתן למצוא [בפוסט הזה בבלוג](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) - אנחנו נתמקד כאן רק בכמה טכניקות של ראייה ממוחשבת.\n", + "אם נרצה ליישם סיווג תמונות כדי לזהות את הטקסט, נצטרך לחתוך סמלים בודדים כדי להפוך אותם לדומים לתמונות MNIST שראינו בעבר. ניתן לעשות זאת באמצעות [זיהוי אובייקטים](../11-ObjectDetection/README.md), טכניקה שנדון בה מאוחר יותר, אך ניתן גם לנסות להשתמש בראייה ממוחשבת טהורה לשם כך. תיאור טוב של איך ניתן להשתמש בראייה ממוחשבת להפרדת תווים ניתן למצוא [בפוסט הזה בבלוג](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) - כאן נתמקד רק בכמה טכניקות של ראייה ממוחשבת.\n", "\n", - "ראשית, בואו ננסה לשפר מעט את התמונה. נוכל להשתמש ברעיון של **סף** (מתואר היטב [במאמר הזה של OpenCV](https://docs.opencv.org/4.x/d7/d4d/tutorial_py_thresholding.html)):\n" + "ראשית, ננסה לשפר מעט את התמונה. ניתן להשתמש ברעיון של **סף** (מתואר היטב [במאמר הזה של OpenCV](https://docs.opencv.org/4.x/d7/d4d/tutorial_py_thresholding.html)):\n" ] }, { @@ -192,7 +192,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "כדי לעבוד עם תמונות, אנו צריכים \"לחלץ\" נקודות בודדות, כלומר להמיר את התמונות למערך של קואורדינטות של נקודות בודדות. ניתן לעשות זאת באמצעות טכניקות **חילוץ מאפיינים**, כגון SIFT, SURF או [ORB](https://docs.opencv.org/4.x/d1/d89/tutorial_py_orb.html):\n" + "כדי לעבוד עם תמונות, עלינו \"לחלץ\" נקודות בודדות, כלומר להמיר את התמונות לקבוצת קואורדינטות של נקודות בודדות. ניתן לעשות זאת באמצעות טכניקות **חילוץ מאפיינים**, כמו SIFT, SURF או [ORB](https://docs.opencv.org/4.x/d1/d89/tutorial_py_orb.html):\n" ] }, { @@ -218,7 +218,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "בואו נשרטט את כל הנקודות כדי לוודא שהכול נכון:\n" + "בואו נשרטט את כל הנקודות כדי לוודא שהבנו נכון:\n" ] }, { @@ -254,7 +254,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "כדי להפריד בין תווים בודדים, אנו צריכים לדעת את תיבת הגבול של הטקסט כולו. כדי לגלות זאת, אנו יכולים פשוט לחשב את הקואורדינטות המינימליות והמקסימליות:\n" + "כדי להפריד בין תווים בודדים, אנחנו צריכים לדעת את תיבת הגבול של כל הטקסט. כדי לגלות זאת, אנחנו יכולים פשוט לחשב את הקואורדינטות המינימליות והמקסימליות:\n" ] }, { @@ -295,7 +295,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "כמו כן, טקסט זה יכול להיות מסובב חלקית, וכדי ליישר אותו בצורה מושלמת אנו צריכים לבצע את מה שנקרא **טרנספורמציית פרספקטיבה**. ניקח מלבן המוגדר על ידי נקודות $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ וניישר אותו עם תמונה חדשה בעלת ממדים פרופורציונליים:\n" + "כמו כן, טקסט זה עשוי להיות מסובב חלקית, וכדי ליישר אותו באופן מושלם עלינו לבצע את מה שנקרא **טרנספורמציית פרספקטיבה**. ניקח מלבן המוגדר על ידי הנקודות $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ וניישר אותו עם תמונה חדשה בממדים פרופורציונליים:\n" ] }, { @@ -386,7 +386,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "ראיתם שניתן לבצע לא מעט משימות באמצעות עיבוד תמונה טהור, ללא כל בינה מלאכותית. אם נוכל להשתמש בטכניקות ראייה ממוחשבת כדי לפשט את עבודתה של רשת עצבית - בהחלט כדאי לעשות זאת, משום שזה יאפשר לנו לפתור בעיות עם כמות קטנה יותר של נתוני אימון.\n" + "ראית שניתן לבצע לא מעט משימות באמצעות עיבוד תמונה טהור, ללא כל בינה מלאכותית. אם נוכל להשתמש בטכניקות ראייה ממוחשבת כדי לפשט את עבודת הרשת העצבית - בהחלט כדאי לעשות זאת, משום שזה יאפשר לנו לפתור בעיות עם כמות קטנה יותר של נתוני אימון.\n" ] }, { @@ -395,9 +395,9 @@ "source": [ "## זיהוי תנועה באמצעות הבדל בין פריימים\n", "\n", - "זיהוי תנועה בזרם וידאו הוא משימה נפוצה מאוד. לדוגמה, זה מאפשר לנו לקבל התראות כאשר משהו מתרחש במצלמת אבטחה. אם נרצה להבין מה קורה במצלמה, נוכל להשתמש ברשת נוירונים - אבל הרבה יותר זול להשתמש ברשת נוירונים רק כשאנחנו יודעים שמשהו מתרחש.\n", + "זיהוי תנועה בזרם וידאו הוא משימה נפוצה מאוד. לדוגמה, זה מאפשר לנו לקבל התראות כאשר משהו מתרחש במצלמת אבטחה. אם נרצה להבין מה קורה במצלמה, נוכל להשתמש ברשת עצבית - אבל זה הרבה יותר זול להשתמש ברשת עצבית רק כשאנחנו יודעים שמשהו מתרחש.\n", "\n", - "הרעיון המרכזי של זיהוי תנועה הוא פשוט. אם המצלמה קבועה, אז הפריימים מהמצלמה אמורים להיות די דומים זה לזה. מכיוון שפריימים מיוצגים כמערכים, פשוט על ידי חיסור של המערכים הללו עבור שני פריימים עוקבים נקבל את ההבדל בפיקסלים, שאמור להיות נמוך עבור פריימים סטטיים, ולהפוך לגבוה יותר כאשר יש תנועה משמעותית בתמונה.\n", + "הרעיון המרכזי של זיהוי תנועה הוא פשוט. אם המצלמה קבועה, אז הפריימים מהמצלמה אמורים להיות די דומים זה לזה. מכיוון שפריימים מיוצגים כמערכים, על ידי חיסור המערכים של שני פריימים עוקבים נקבל את ההבדל בפיקסלים, שאמור להיות נמוך בפריימים סטטיים, ולהפוך לגבוה יותר כאשר יש תנועה משמעותית בתמונה.\n", "\n", "נתחיל בללמוד כיצד לפתוח וידאו ולהמיר אותו לרצף של פריימים:\n" ] @@ -492,7 +492,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "נניח שאנחנו רוצים ליצור דו\"ח שמראה מה קרה מול המצלמה על ידי הצגת התמונה המתאימה בכל פעם שמשהו קורה. כדי לעשות זאת, כנראה נרצה למצוא את הפריים ההתחלתי והסופי של \"אירוע\", ולהציג את הפריים האמצעי. כדי להסיר קצת רעש, נחליק גם את העקומה מעל עם פונקציית ממוצע נע:\n" + "נניח שאנחנו רוצים ליצור דוח שמראה מה קרה מול המצלמה על ידי הצגת התמונה המתאימה בכל פעם שמשהו קורה. כדי לעשות זאת, כנראה שנרצה למצוא את פריים ההתחלה והסיום של \"אירוע\", ולהציג את הפריים האמצעי. כדי להסיר רעש מסוים, נחליק גם את העקומה למעלה באמצעות פונקציית ממוצע נע:\n" ] }, { @@ -537,7 +537,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "עכשיו אנחנו יכולים למצוא פריימים שיש בהם כמות שינויים מעל הסף באמצעות `np.where`, ולהוציא רצף של פריימים רצופים שהוא ארוך מ-30 פריימים:\n" + "עכשיו נוכל למצוא פריימים שבהם כמות השינויים היא מעל הסף על ידי שימוש ב-`np.where`, ולחלץ רצף של פריימים רצופים שהוא ארוך מ-30 פריימים:\n" ] }, { @@ -612,7 +612,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "ייתכן שתבחין שסכמת הצבעים בתמונה זו אינה נראית נכונה! זאת משום ש-OpenCV מסיבות היסטוריות טוען תמונות במרחב הצבעים BGR, בעוד ש-matplotlib משתמש בסדר צבעים RGB המסורתי יותר. ברוב המקרים, הגיוני להמיר תמונות ל-RGB מיד לאחר טעינתן.\n" + "ייתכן שתבחין שסכמת הצבעים בתמונה זו אינה נראית נכונה! זאת מכיוון ש-OpenCV מסיבות היסטוריות טוענת תמונות במרחב הצבעים BGR, בעוד ש-matplotlib משתמשת בסדר הצבעים המסורתי יותר RGB. ברוב המקרים, יש היגיון להמיר תמונות ל-RGB מיד לאחר טעינתן.\n" ] }, { @@ -651,16 +651,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## חילוץ תנועה באמצעות Optical Flow\n", + "## חילוץ תנועה באמצעות זרימה אופטית\n", "\n", - "בעוד שהשוואה בין שני פריימים עוקבים מאפשרת לנו לראות את כמות השינויים, היא לא מספקת מידע על מה בדיוק זז ואיפה. כדי לקבל את המידע הזה, קיימת טכניקה שנקראת **[optical flow](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)**:\n", + "בעוד השוואת שני פריימים רצופים מאפשרת לנו לראות את כמות השינויים, היא אינה מספקת מידע על מה בדיוק זז ואיפה. כדי לקבל את המידע הזה, קיימת טכניקה שנקראת **[זרימה אופטית](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)**:\n", "\n", - "* **Dense Optical Flow** מחשב שדה וקטורים שמראה עבור כל פיקסל לאן הוא זז.\n", - "* **Sparse Optical Flow** מבוסס על זיהוי תכונות ייחודיות בתמונה (למשל, קצוות) ובניית המסלול שלהן מפריים לפריים.\n", + "* **זרימה אופטית צפופה** מחשבת את שדה הווקטורים שמראה עבור כל פיקסל לאן הוא זז.\n", + "* **זרימה אופטית דלילה** מתבססת על לקיחת תכונות ייחודיות בתמונה (לדוגמה, קצוות) ובניית המסלול שלהן מפריים לפריים.\n", "\n", - "קראו עוד על optical flow [במדריך המצוין הזה](https://learnopencv.com/optical-flow-in-opencv/).\n", + "קראו עוד על זרימה אופטית [במדריך הנהדר הזה](https://learnopencv.com/optical-flow-in-opencv/).\n", "\n", - "בואו נחשב dense optical flow בין הפריימים שלנו:\n" + "בואו נחשב זרימה אופטית צפופה בין הפריימים שלנו:\n" ] }, { @@ -689,9 +689,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "כפי שניתן לראות, עבור כל פריים, הזרימה מכילה את הממדים של הפריים ושני ערוצים, המתאימים לרכיבי ה-x וה-y של וקטור הזרימה האופטית.\n", + "כפי שניתן לראות, עבור כל פריים הזרימה כוללת את הממדים של הפריים ושני ערוצים, שמייצגים את הרכיבים x ו-y של וקטור הזרימה האופטית.\n", "\n", - "הצגת זרימה אופטית ב-2D היא מעט מאתגרת, אך ניתן להשתמש ברעיון חכם. אם נמיר את הזרימה האופטית לקואורדינטות פולריות, נקבל שני רכיבים עבור כל פיקסל: *כיוון* ו-*עוצמה*. ניתן לייצג את העוצמה באמצעות עוצמת הפיקסל, ואת הכיוון באמצעות צבעים שונים. ניצור תמונה במרחב הצבעים [HSV (גוון-רוויה-ערך)](https://en.wikipedia.org/wiki/HSV_color_space), כאשר הגוון יוגדר לפי הכיוון, הערך - לפי העוצמה, והרוויה תהיה 255.\n" + "הצגת זרימה אופטית ב-2D יכולה להיות מעט מאתגרת, אבל יש רעיון חכם שניתן להשתמש בו. אם נמיר את הזרימה האופטית לקואורדינטות פולריות, נקבל שני רכיבים עבור כל פיקסל: *כיוון* ו-*עוצמה*. ניתן לייצג את העוצמה באמצעות עוצמת הפיקסל, ואת הכיוון באמצעות צבעים שונים. ניצור תמונה במרחב הצבעים [HSV (Hue-Saturation-Value)](https://en.wikipedia.org/wiki/HSV_color_space), שבו הגוון (hue) יוגדר לפי הכיוון, הערך (value) לפי העוצמה, והרוויה (saturation) תהיה 255.\n" ] }, { @@ -776,8 +776,8 @@ }, "orig_nbformat": 4, "coopTranslator": { - "original_hash": "ad5bdca62175c7a3d4336ef8c761aef3", - "translation_date": "2025-08-28T20:45:59+00:00", + "original_hash": "339b2129f86b24024393ff92b8bd376f", + "translation_date": "2025-09-07T15:11:40+00:00", "source_file": "lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb", "language_code": "he" } diff --git a/translations/hi/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb b/translations/hi/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb index 7ed0b16d..3d335770 100644 --- a/translations/hi/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb +++ b/translations/hi/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb @@ -12,7 +12,7 @@ "\n", "इस नोटबुक में, हम आपको OpenCV का उपयोग करने के कुछ उदाहरण देंगे। अधिक जानकारी के लिए, आप [Learn OpenCV](https://learnopencv.com/getting-started-with-opencv/) ऑनलाइन कोर्स देख सकते हैं।\n", "\n", - "सबसे पहले, आइए `cv2` को इम्पोर्ट करें, साथ ही कुछ अन्य उपयोगी लाइब्रेरीज़ भी:\n" + "सबसे पहले, आइए `cv2` को इंपोर्ट करें, साथ ही कुछ अन्य उपयोगी लाइब्रेरीज़ को भी:\n" ] }, { @@ -44,7 +44,7 @@ "source": [ "## इमेज लोड करना\n", "\n", - "Python में इमेज को आसानी से NumPy arrays के रूप में प्रस्तुत किया जा सकता है। उदाहरण के लिए, 320x200 पिक्सल की ग्रेस्केल इमेज को 200x320 के array में संग्रहीत किया जाएगा, और उसी आयाम की रंगीन इमेज का आकार 200x320x3 होगा (3 रंग चैनलों के लिए)। \n", + "Python में इमेज को आसानी से NumPy arrays के रूप में प्रस्तुत किया जा सकता है। उदाहरण के लिए, 320x200 पिक्सल की ग्रेस्केल इमेज को 200x320 array में संग्रहीत किया जाएगा, और उसी आयाम की रंगीन इमेज का आकार 200x320x3 होगा (3 रंग चैनलों के लिए)। \n", "\n", "चलो एक इमेज लोड करके शुरू करते हैं:\n" ] @@ -135,7 +135,7 @@ "source": [ "bw_im = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)\n", "print(bw_im.shape)\n", - "plt.imshow(bw_im)" + "plt.imshow(bw_im, cmap='gray')" ] }, { @@ -192,7 +192,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "छवियों के साथ काम करने के लिए, हमें व्यक्तिगत बिंदुओं को \"निकालना\" होगा, यानी छवियों को व्यक्तिगत बिंदुओं के निर्देशांक के सेट में बदलना होगा। हम ऐसा **फीचर एक्सट्रैक्शन** तकनीकों का उपयोग करके कर सकते हैं, जैसे SIFT, SURF या [ORB](https://docs.opencv.org/4.x/d1/d89/tutorial_py_orb.html):\n" + "छवियों के साथ काम करने के लिए, हमें व्यक्तिगत डॉट्स को \"निकालना\" होगा, अर्थात छवियों को व्यक्तिगत डॉट्स के निर्देशांक के सेट में बदलना होगा। हम ऐसा **फीचर एक्सट्रैक्शन** तकनीकों का उपयोग करके कर सकते हैं, जैसे SIFT, SURF या [ORB](https://docs.opencv.org/4.x/d1/d89/tutorial_py_orb.html):\n" ] }, { @@ -252,7 +252,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "पूरे पाठ को अलग-अलग अक्षरों में विभाजित करने के लिए, हमें पूरे पाठ का बॉक्स जानना होगा। इसे जानने के लिए, हम केवल न्यूनतम और अधिकतम निर्देशांक की गणना कर सकते हैं:\n" + "पूरे पाठ को अलग-अलग अक्षरों में विभाजित करने के लिए, हमें पूरे पाठ का बाउंडिंग बॉक्स जानना होगा। इसे जानने के लिए, हम न्यूनतम और अधिकतम निर्देशांक की गणना कर सकते हैं:\n" ] }, { @@ -293,7 +293,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "इसके अलावा, यह पाठ आंशिक रूप से घुमाया जा सकता है, और इसे पूरी तरह से संरेखित करने के लिए हमें तथाकथित **परिप्रेक्ष्य परिवर्तन** करना होगा। हम बिंदुओं $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ द्वारा परिभाषित एक आयत लेंगे और इसे समानुपातिक आयामों वाली नई छवि के साथ संरेखित करेंगे:\n" + "इसके अलावा, इस पाठ को आंशिक रूप से घुमाया जा सकता है, और इसे पूरी तरह से संरेखित करने के लिए हमें तथाकथित **परिप्रेक्ष्य परिवर्तन** करना होगा। हम बिंदुओं $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ द्वारा परिभाषित एक आयत लेंगे और इसे समानुपाती आयामों वाली नई छवि के साथ संरेखित करेंगे:\n" ] }, { @@ -389,9 +389,9 @@ "source": [ "## फ्रेम डिफरेंस का उपयोग करके मोशन डिटेक्शन\n", "\n", - "वीडियो स्ट्रीम पर मोशन का पता लगाना एक बहुत ही सामान्य कार्य है। उदाहरण के लिए, यह हमें अलर्ट प्राप्त करने की अनुमति देता है जब निगरानी कैमरे पर कुछ होता है। यदि हम समझना चाहते हैं कि कैमरे पर क्या हो रहा है, तो हम एक न्यूरल नेटवर्क का उपयोग कर सकते हैं - लेकिन जब हमें पता हो कि कुछ हो रहा है, तो न्यूरल नेटवर्क का उपयोग करना अधिक सस्ता हो जाता है।\n", + "वीडियो स्ट्रीम पर मोशन का पता लगाना एक बहुत ही सामान्य कार्य है। उदाहरण के लिए, यह हमें तब अलर्ट प्राप्त करने की अनुमति देता है जब निगरानी कैमरे पर कुछ होता है। यदि हम समझना चाहते हैं कि कैमरे पर क्या हो रहा है, तो हम एक न्यूरल नेटवर्क का उपयोग कर सकते हैं - लेकिन जब हमें पता हो कि कुछ हो रहा है, तो न्यूरल नेटवर्क का उपयोग करना अधिक सस्ता हो जाता है।\n", "\n", - "मोशन डिटेक्शन का मुख्य विचार सरल है। यदि कैमरा स्थिर है, तो कैमरे से आने वाले फ्रेम एक-दूसरे से काफी समान होने चाहिए। चूंकि फ्रेम को ऐरे के रूप में दर्शाया जाता है, तो दो लगातार फ्रेम के ऐरे को घटाकर हमें पिक्सल का अंतर मिलेगा, जो स्थिर फ्रेम के लिए कम होना चाहिए, और जब छवि में महत्वपूर्ण मोशन हो, तो यह अधिक हो जाएगा।\n", + "मोशन डिटेक्शन का मुख्य विचार सरल है। यदि कैमरा स्थिर है, तो कैमरे से आने वाले फ्रेम एक-दूसरे से काफी समान होने चाहिए। चूंकि फ्रेम को ऐरे के रूप में दर्शाया जाता है, तो दो लगातार फ्रेम के ऐरे को घटाकर हमें पिक्सल का अंतर मिलेगा, जो स्थिर फ्रेम के लिए कम होना चाहिए और जब छवि में महत्वपूर्ण मोशन हो, तो यह अधिक हो जाएगा।\n", "\n", "हम यह सीखने से शुरू करेंगे कि वीडियो को कैसे खोलें और इसे फ्रेम की एक श्रृंखला में कैसे बदलें:\n" ] @@ -486,7 +486,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "मान लीजिए हम एक रिपोर्ट बनाना चाहते हैं जो कैमरे के सामने क्या हुआ दिखाए, प्रत्येक बार कुछ होने पर उपयुक्त छवि दिखाकर। इसे करने के लिए, हमें संभवतः \"घटना\" के प्रारंभ और अंत फ्रेम का पता लगाना होगा, और मध्य फ्रेम प्रदर्शित करना होगा। कुछ शोर को हटाने के लिए, हम ऊपर दिए गए वक्र को मूविंग एवरेज फंक्शन के साथ भी स्मूथ करेंगे।\n" + "मान लीजिए कि हम एक रिपोर्ट बनाना चाहते हैं जो यह दिखाए कि कैमरे के सामने क्या हुआ, प्रत्येक बार कुछ होने पर उपयुक्त छवि दिखाकर। इसे करने के लिए, हम संभवतः \"घटना\" के प्रारंभ और अंत फ्रेम का पता लगाना चाहेंगे, और मध्य फ्रेम को प्रदर्शित करना चाहेंगे। कुछ शोर को हटाने के लिए, हम ऊपर दिए गए ग्राफ को मूविंग एवरेज फंक्शन के साथ भी स्मूथ करेंगे:\n" ] }, { @@ -531,7 +531,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "अब हम `np.where` का उपयोग करके उन फ्रेम्स का पता लगा सकते हैं जिनमें परिवर्तन की मात्रा थ्रेशोल्ड से अधिक है, और 30 फ्रेम्स से अधिक लंबे लगातार फ्रेम्स की एक श्रृंखला निकाल सकते हैं:\n" + "अब हम `np.where` का उपयोग करके उन फ्रेम्स का पता लगा सकते हैं जिनमें परिवर्तन की मात्रा थ्रेशोल्ड से अधिक है, और 30 फ्रेम्स से अधिक लंबी एक अनुक्रमिक फ्रेम्स की श्रृंखला निकाल सकते हैं:\n" ] }, { @@ -643,9 +643,9 @@ "source": [ "## ऑप्टिकल फ्लो का उपयोग करके गति निकालें\n", "\n", - "जब हम केवल दो लगातार फ्रेम की तुलना करते हैं, तो इससे हमें बदलाव की मात्रा का पता चलता है, लेकिन यह जानकारी नहीं मिलती कि वास्तव में क्या और कहाँ चल रहा है। इस जानकारी को प्राप्त करने के लिए एक तकनीक है जिसे **[ऑप्टिकल फ्लो](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)** कहा जाता है:\n", + "हालांकि केवल दो लगातार फ्रेम की तुलना करने से हमें बदलाव की मात्रा का पता चलता है, यह हमें यह जानकारी नहीं देता कि वास्तव में क्या चल रहा है और कहाँ। इस जानकारी को प्राप्त करने के लिए, एक तकनीक है जिसे **[ऑप्टिकल फ्लो](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)** कहा जाता है:\n", "\n", - "* **डेंस ऑप्टिकल फ्लो** प्रत्येक पिक्सल के लिए वेक्टर फील्ड की गणना करता है, जो दिखाता है कि वह कहाँ जा रहा है।\n", + "* **डेंस ऑप्टिकल फ्लो** वह वेक्टर फील्ड बनाता है जो दिखाता है कि प्रत्येक पिक्सल कहाँ जा रहा है।\n", "* **स्पार्स ऑप्टिकल फ्लो** छवि में कुछ विशिष्ट विशेषताओं (जैसे किनारों) को लेता है और फ्रेम से फ्रेम तक उनकी गति का निर्माण करता है।\n", "\n", "ऑप्टिकल फ्लो के बारे में अधिक जानकारी [इस शानदार ट्यूटोरियल](https://learnopencv.com/optical-flow-in-opencv/) में पढ़ें।\n", @@ -679,9 +679,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "प्रत्येक फ्रेम के लिए, फ्लो का आकार फ्रेम के आकार के बराबर होता है, और इसमें 2 चैनल होते हैं, जो ऑप्टिकल फ्लो वेक्टर के x और y घटकों से संबंधित होते हैं।\n", + "जैसा कि आप देख सकते हैं, प्रत्येक फ्रेम के लिए फ्लो फ्रेम के आयाम और 2 चैनल्स के साथ आता है, जो ऑप्टिकल फ्लो वेक्टर के x और y घटकों से संबंधित हैं।\n", "\n", - "2D में ऑप्टिकल फ्लो को प्रदर्शित करना थोड़ा चुनौतीपूर्ण हो सकता है, लेकिन हम एक चतुर विचार का उपयोग कर सकते हैं। यदि हम ऑप्टिकल फ्लो को ध्रुवीय निर्देशांक (polar coordinates) में परिवर्तित करें, तो हमें प्रत्येक पिक्सेल के लिए दो घटक मिलेंगे: *दिशा* और *तीव्रता*। हम तीव्रता को पिक्सेल की तीव्रता द्वारा और दिशा को विभिन्न रंगों द्वारा प्रदर्शित कर सकते हैं। हम [HSV (Hue-Saturation-Value) रंग स्थान](https://en.wikipedia.org/wiki/HSV_color_space) में एक छवि बनाएंगे, जहाँ ह्यू (hue) को दिशा द्वारा परिभाषित किया जाएगा, वैल्यू (value) को तीव्रता द्वारा, और सैचुरेशन (saturation) को 255 रखा जाएगा।\n" + "2D में ऑप्टिकल फ्लो को प्रदर्शित करना थोड़ा चुनौतीपूर्ण हो सकता है, लेकिन हम एक चतुर विचार का उपयोग कर सकते हैं। यदि हम ऑप्टिकल फ्लो को पोलर कोऑर्डिनेट्स में बदलते हैं, तो हमें प्रत्येक पिक्सल के लिए दो घटक मिलेंगे: *दिशा* और *तीव्रता*। हम तीव्रता को पिक्सल की तीव्रता द्वारा और दिशा को विभिन्न रंगों द्वारा प्रदर्शित कर सकते हैं। हम [HSV (Hue-Saturation-Value) कलर स्पेस](https://en.wikipedia.org/wiki/HSV_color_space) में एक इमेज बनाएंगे, जहां ह्यू दिशा द्वारा परिभाषित होगा, वैल्यू तीव्रता द्वारा, और सैचुरेशन 255 होगा।\n" ] }, { @@ -730,16 +730,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "तो, उन फ्रेम्स में हरे रंग का मतलब बाईं ओर की ओर गति करना है, जबकि नीला रंग दाईं ओर की ओर गति को दर्शाता है।\n", + "तो, उन फ्रेम्स में हरे रंग का मतलब है बाईं ओर जाना, जबकि नीला रंग दाईं ओर जाने को दर्शाता है।\n", "\n", - "ऑप्टिकल फ्लो सामान्य गति की दिशा के बारे में निष्कर्ष निकालने के लिए एक बेहतरीन उपकरण हो सकता है। उदाहरण के लिए, यदि आप देखते हैं कि किसी फ्रेम के सभी पिक्सल्स कमोबेश एक ही दिशा में जा रहे हैं - तो आप यह निष्कर्ष निकाल सकते हैं कि कैमरा मूवमेंट हो रहा है, और इसे संतुलित करने की कोशिश कर सकते हैं।\n" + "ऑप्टिकल फ्लो सामान्य दिशा में गति के बारे में निष्कर्ष निकालने के लिए एक शानदार उपकरण हो सकता है। उदाहरण के लिए, यदि आप देखते हैं कि फ्रेम के सभी पिक्सल अधिक या कम एक ही दिशा में जा रहे हैं - तो आप निष्कर्ष निकाल सकते हैं कि कैमरा मूवमेंट हो रहा है, और इसे संतुलित करने की कोशिश कर सकते हैं।\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**अस्वीकरण**: \nयह दस्तावेज़ AI अनुवाद सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) का उपयोग करके अनुवादित किया गया है। जबकि हम सटीकता सुनिश्चित करने का प्रयास करते हैं, कृपया ध्यान दें कि स्वचालित अनुवाद में त्रुटियां या अशुद्धियां हो सकती हैं। मूल भाषा में उपलब्ध मूल दस्तावेज़ को प्रामाणिक स्रोत माना जाना चाहिए। महत्वपूर्ण जानकारी के लिए, पेशेवर मानव अनुवाद की सिफारिश की जाती है। इस अनुवाद के उपयोग से उत्पन्न किसी भी गलतफहमी या गलत व्याख्या के लिए हम जिम्मेदार नहीं हैं।\n" + "\n---\n\n**अस्वीकरण**: \nयह दस्तावेज़ AI अनुवाद सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) का उपयोग करके अनुवादित किया गया है। जबकि हम सटीकता के लिए प्रयास करते हैं, कृपया ध्यान दें कि स्वचालित अनुवाद में त्रुटियां या अशुद्धियां हो सकती हैं। मूल भाषा में उपलब्ध मूल दस्तावेज़ को आधिकारिक स्रोत माना जाना चाहिए। महत्वपूर्ण जानकारी के लिए, पेशेवर मानव अनुवाद की सिफारिश की जाती है। इस अनुवाद के उपयोग से उत्पन्न किसी भी गलतफहमी या गलत व्याख्या के लिए हम उत्तरदायी नहीं हैं। \n" ] } ], @@ -766,8 +766,8 @@ }, "orig_nbformat": 4, "coopTranslator": { - "original_hash": "ad5bdca62175c7a3d4336ef8c761aef3", - "translation_date": "2025-08-31T14:42:26+00:00", + "original_hash": "339b2129f86b24024393ff92b8bd376f", + "translation_date": "2025-09-07T14:58:58+00:00", "source_file": "lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb", "language_code": "hi" } diff --git a/translations/hk/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb b/translations/hk/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb index 94783eee..b400e31a 100644 --- a/translations/hk/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb +++ b/translations/hk/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb @@ -6,13 +6,13 @@ "source": [ "# 電腦視覺與 OpenCV\n", "\n", - "此筆記本是 [AI for Beginners Curriculum](http://aka.ms/ai-beginners) 的一部分。\n", + "此筆記本屬於 [AI for Beginners Curriculum](http://aka.ms/ai-beginners) 的一部分。\n", "\n", "[OpenCV](https://opencv.org/) 被認為是影像處理的 *事實標準*。它包含許多實用的演算法,並以 C++ 實現。你也可以使用 Python 調用 OpenCV。\n", "\n", - "在這個筆記本中,我們會提供一些使用 OpenCV 的範例。若需更多詳細資訊,你可以參考線上課程 [Learn OpenCV](https://learnopencv.com/getting-started-with-opencv/)。\n", + "在這個筆記本中,我們會提供一些使用 OpenCV 的範例。若需更多詳細資訊,可以參考線上課程 [Learn OpenCV](https://learnopencv.com/getting-started-with-opencv/)。\n", "\n", - "首先,讓我們 `import cv2`,以及一些其他有用的庫:\n" + "首先,我們來 `import cv2`,以及其他一些有用的庫:\n" ] }, { @@ -94,7 +94,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "如你所見,這是一張盲文的圖片。由於我們對實際顏色並不太感興趣,因此我們可以將其轉換為黑白:\n" + "正如你所見,這是一張盲文的圖片。由於我們對實際顏色並不是很感興趣,所以我們可以將其轉換為黑白:\n" ] }, { @@ -135,7 +135,7 @@ "source": [ "bw_im = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)\n", "print(bw_im.shape)\n", - "plt.imshow(bw_im)" + "plt.imshow(bw_im, cmap='gray')" ] }, { @@ -144,9 +144,9 @@ "source": [ "## 點字影像處理\n", "\n", - "如果我們想要應用影像分類來辨識文字,我們需要將每個符號分割出來,使其看起來像我們之前見過的 MNIST 圖像。這可以透過 [物件偵測](../11-ObjectDetection/README.md) 技術來完成,我們稍後會討論這個方法,但我們也可以嘗試使用純粹的電腦視覺技術來達成。關於如何使用電腦視覺進行字符分割的良好描述可以在 [這篇部落格文章](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) 中找到——我們在這裡只會專注於一些電腦視覺技術。\n", + "如果我們想要應用影像分類來辨識文字,我們需要將每個符號分割出來,使其看起來像我們之前見過的 MNIST 圖像。這可以使用 [物件偵測](../11-ObjectDetection/README.md) 技術來完成,我們稍後會討論,但我們也可以嘗試使用純粹的電腦視覺來達成。關於如何使用電腦視覺進行字符分割的良好描述可以在 [這篇部落格文章](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) 中找到——我們在這裡只會專注於一些電腦視覺技術。\n", "\n", - "首先,讓我們嘗試稍微增強影像。我們可以使用 **閾值處理** 的概念(在 [這篇 OpenCV 文章](https://docs.opencv.org/4.x/d7/d4d/tutorial_py_thresholding.html) 中有詳細描述):\n" + "首先,讓我們嘗試稍微增強影像。我們可以使用 **二值化** 的概念(在 [這篇 OpenCV 文章](https://docs.opencv.org/4.x/d7/d4d/tutorial_py_thresholding.html) 中有詳細描述):\n" ] }, { @@ -252,7 +252,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "要分隔個別字符,我們需要知道整段文字的邊界框。為了找出邊界框,我們只需計算最小和最大座標:\n" + "要分隔個別字符,我們需要知道整段文字的邊界框。要找出邊界框,我們只需計算最小和最大的座標:\n" ] }, { @@ -293,7 +293,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "此外,此文本可以部分旋轉,為了使其完美對齊,我們需要進行所謂的**透視變換**。我們將採用由點 $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ 定義的矩形,並將其與具有比例尺寸的新圖像對齊:\n" + "此外,此文本可以部分旋轉,為了使其完美對齊,我們需要進行所謂的**透視變換**。我們將取由點 $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ 定義的矩形,並將其與具有相同比例尺寸的新圖像對齊:\n" ] }, { @@ -340,7 +340,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "在我們獲得這張對齊良好的圖像後,將其切成多塊應該相對容易:\n" + "在我們獲得這張對齊良好的圖像後,將其切割成多個部分應該相對容易:\n" ] }, { @@ -384,7 +384,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "您已看到許多任務可以僅使用純圖像處理完成,而不需要任何人工智能。如果我們能使用計算機視覺技術來簡化神經網絡的工作——我們絕對應該這樣做,因為這將使我們能夠用更少的訓練數據來解決問題。\n" + "您已看到許多任務可以僅使用純圖像處理完成,而無需任何人工智能。如果我們能使用計算機視覺技術來簡化神經網絡的工作,我們絕對應該這樣做,因為這將使我們能夠用更少的訓練數據解決問題。\n" ] }, { @@ -393,9 +393,9 @@ "source": [ "## 使用幀差進行動作檢測\n", "\n", - "在視頻流中檢測動作是一個非常常見的任務。例如,當監控攝像機上有事情發生時,我們可以收到警報。如果我們想了解攝像機上發生了什麼,可以使用神經網絡——但當我們知道有事情正在發生時,使用神經網絡的成本會更低。\n", + "在視頻流中檢測動作是一項非常常見的任務。例如,當監控攝像機上有事情發生時,我們可以收到警報。如果我們想了解攝像機上發生了什麼,可以使用神經網絡進行分析——但當我們已經知道有事情正在發生時,使用神經網絡的成本會更低。\n", "\n", - "動作檢測的主要概念很簡單。如果攝像機是固定的,那麼攝像機的幀應該彼此非常相似。由於幀是以數組的形式表示的,只需將兩個連續幀的數組相減,我們就能得到像素差異。對於靜態幀,像素差異應該很低,而當圖像中有明顯的動作時,像素差異會變高。\n", + "動作檢測的主要概念非常簡單。如果攝像機是固定的,那麼攝像機拍攝的幀應該彼此非常相似。由於幀是以數組形式表示的,只需將兩個連續幀的數組相減,我們就能得到像素差異。對於靜態幀,像素差異應該很低,而當圖像中有明顯的動作時,像素差異會變高。\n", "\n", "我們將從學習如何打開視頻並將其轉換為幀序列開始:\n" ] @@ -445,7 +445,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "由於顏色對於動作檢測並不重要,我們將所有幀轉換為灰度。然後,我們將計算幀差異,並繪製它們的範數,以直觀地查看活動量:\n" + "由於顏色對於動態檢測並不那麼重要,我們將把所有幀轉換為灰階。然後,我們將計算幀差異,並繪製它們的範數,以直觀地查看正在進行的活動量:\n" ] }, { @@ -490,7 +490,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "假設我們想要製作一份報告,通過顯示每次事件發生時的合適圖像來展示鏡頭前發生的事情。為了做到這一點,我們可能需要找出「事件」的開始和結束幀,並顯示中間幀。為了去除一些噪音,我們還會使用移動平均函數來平滑曲線:\n" + "假設我們想要製作一份報告,通過每次發生事件時顯示合適的圖像來展示鏡頭前發生的事情。為了做到這一點,我們可能需要找出一個「事件」的開始和結束幀,並顯示中間幀。為了去除一些噪音,我們還會使用移動平均函數來平滑上方的曲線:\n" ] }, { @@ -535,7 +535,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "現在我們可以使用 `np.where` 找出變化量超過閾值的幀,並提取長度超過 30 幀的連續幀序列:\n" + "現在我們可以使用 `np.where` 找出變化量超過閾值的幀,並提取長度超過30幀的連續幀序列:\n" ] }, { @@ -610,7 +610,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "您可能會注意到這張圖片的色彩方案看起來不對!這是因為 OpenCV 出於歷史原因以 BGR 色彩空間載入圖片,而 matplotlib 使用更傳統的 RGB 色彩順序。大多數情況下,在載入圖片後立即將其轉換為 RGB 是合理的。\n" + "您可能會注意到這張圖片的色彩方案看起來不對!這是因為 OpenCV 出於歷史原因以 BGR 色彩空間載入圖片,而 matplotlib 使用更傳統的 RGB 色彩順序。大多數情況下,在載入圖片後立即將其轉換為 RGB 是有道理的。\n" ] }, { @@ -651,14 +651,14 @@ "source": [ "## 使用光流提取運動\n", "\n", - "雖然僅僅比較兩個連續的幀可以讓我們看到變化的程度,但它無法提供有關實際移動的是什麼以及在哪裡的任何信息。為了獲取這些信息,有一種技術叫做 **[光流](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)**:\n", + "僅僅比較兩個連續的影格可以讓我們看到變化的程度,但無法提供實際移動的物體以及其位置的資訊。為了獲得這些資訊,有一種技術叫做 **[光流](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)**:\n", "\n", - "* **密集光流** 計算每個像素的向量場,顯示它們的移動方向\n", - "* **稀疏光流** 則基於圖像中的一些顯著特徵(例如邊緣),並從幀到幀構建它們的運動軌跡。\n", + "* **密集光流** 計算每個像素的向量場,顯示它的移動方向\n", + "* **稀疏光流** 則基於影像中的一些顯著特徵(例如邊緣),並從影格到影格建立它們的軌跡。\n", "\n", - "可以在這篇[精彩的教程](https://learnopencv.com/optical-flow-in-opencv/)中了解更多關於光流的內容。\n", + "可以在[這篇精彩的教程](https://learnopencv.com/optical-flow-in-opencv/)中了解更多關於光流的內容。\n", "\n", - "現在,讓我們計算我們幀之間的密集光流:\n" + "現在讓我們計算影格之間的密集光流:\n" ] }, { @@ -740,14 +740,14 @@ "source": [ "所以,在這些畫面中,綠色代表向左移動,而藍色則代表向右移動。\n", "\n", - "光流可以是一個很好的工具,用來判斷整體的移動方向。例如,如果你看到畫面中的所有像素都大致朝著同一方向移動——你可以推斷這是相機的移動,並嘗試進行補償。\n" + "光流可以是一個很好的工具,用來判斷整體的移動方向。例如,如果你看到畫面中的所有像素都大致朝著一個方向移動——你可以推斷這是相機的移動,並嘗試進行補償。\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**免責聲明**: \n此文件已使用人工智能翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 翻譯。我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。應以原始語言的文件作為權威來源。對於關鍵資訊,建議使用專業的人工作翻譯。我們對因使用此翻譯而引起的任何誤解或錯誤解讀概不負責。\n" + "\n---\n\n**免責聲明**: \n此文件已使用人工智能翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。應以原始語言的文件作為權威來源。對於關鍵資訊,建議尋求專業的人類翻譯。我們對因使用此翻譯而引起的任何誤解或誤釋不承擔責任。\n" ] } ], @@ -774,8 +774,8 @@ }, "orig_nbformat": 4, "coopTranslator": { - "original_hash": "ad5bdca62175c7a3d4336ef8c761aef3", - "translation_date": "2025-08-31T09:49:15+00:00", + "original_hash": "339b2129f86b24024393ff92b8bd376f", + "translation_date": "2025-09-07T14:56:06+00:00", "source_file": "lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb", "language_code": "hk" } diff --git a/translations/hr/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb b/translations/hr/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb index 8dcb0624..13f44811 100644 --- a/translations/hr/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb +++ b/translations/hr/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb @@ -6,13 +6,13 @@ "source": [ "# Računalni vid i OpenCV\n", "\n", - "Ova bilježnica dio je [AI for Beginners Curriculum](http://aka.ms/ai-beginners).\n", + "Ova bilježnica dio je [AI za početnike kurikuluma](http://aka.ms/ai-beginners).\n", "\n", - "[OpenCV](https://opencv.org/) smatra se *de facto* standardom za obradu slika. Sadrži mnogo korisnih algoritama implementiranih u C++. OpenCV možete koristiti i iz Pythona.\n", + "[OpenCV](https://opencv.org/) smatra se *de facto* standardom za obradu slika. Sadrži mnogo korisnih algoritama implementiranih u C++. OpenCV možete koristiti i iz Python-a.\n", "\n", - "U ovoj bilježnici pružit ćemo vam nekoliko primjera korištenja OpenCV-a. Za više detalja možete posjetiti online tečaj [Learn OpenCV](https://learnopencv.com/getting-started-with-opencv/).\n", + "U ovoj bilježnici dat ćemo vam nekoliko primjera korištenja OpenCV-a. Za više detalja možete posjetiti online tečaj [Learn OpenCV](https://learnopencv.com/getting-started-with-opencv/).\n", "\n", - "Prvo, `import cv2`, kao i neke druge korisne biblioteke:\n" + "Prvo, `importirajmo cv2`, kao i neke druge korisne biblioteke:\n" ] }, { @@ -135,7 +135,7 @@ "source": [ "bw_im = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)\n", "print(bw_im.shape)\n", - "plt.imshow(bw_im)" + "plt.imshow(bw_im, cmap='gray')" ] }, { @@ -144,9 +144,9 @@ "source": [ "## Obrada slika Brailleovog pisma\n", "\n", - "Ako želimo primijeniti klasifikaciju slika za prepoznavanje teksta, potrebno je izrezati pojedinačne simbole kako bi bili slični MNIST slikama koje smo ranije vidjeli. To se može postići tehnikom [detekcije objekata](../11-ObjectDetection/README.md) o kojoj ćemo kasnije raspravljati, ali također možemo pokušati koristiti čistu računalnu viziju za to. Dobar opis kako se računalna vizija može koristiti za odvajanje znakova može se pronaći [u ovom blogu](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) - ovdje ćemo se fokusirati samo na neke tehnike računalne vizije.\n", + "Ako želimo primijeniti klasifikaciju slika za prepoznavanje teksta, potrebno je izrezati pojedinačne simbole kako bi bili slični MNIST slikama koje smo ranije vidjeli. To se može postići tehnikom [detekcije objekata](../11-ObjectDetection/README.md) o kojoj ćemo kasnije raspravljati, ali također možemo pokušati koristiti čistu računalnu viziju za to. Dobar opis kako se računalna vizija može koristiti za odvajanje znakova može se pronaći [u ovom blog postu](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) - ovdje ćemo se usredotočiti samo na neke tehnike računalne vizije.\n", "\n", - "Prvo, pokušajmo malo poboljšati sliku. Možemo koristiti ideju **pragovanja** (dobro opisanu [u ovom članku o OpenCV-u](https://docs.opencv.org/4.x/d7/d4d/tutorial_py_thresholding.html)):\n" + "Prvo, pokušajmo malo poboljšati sliku. Možemo koristiti ideju **praga** (dobro opisanu [u ovom članku o OpenCV-u](https://docs.opencv.org/4.x/d7/d4d/tutorial_py_thresholding.html)):\n" ] }, { @@ -192,7 +192,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Da bismo radili s slikama, trebamo \"izvući\" pojedinačne točke, tj. pretvoriti slike u skup koordinata pojedinačnih točaka. To možemo učiniti koristeći tehnike **izvlačenja značajki**, poput SIFT, SURF ili [ORB](https://docs.opencv.org/4.x/d1/d89/tutorial_py_orb.html):\n" + "Da bismo radili s slikama, trebamo \"izvući\" pojedinačne točke, tj. pretvoriti slike u skup koordinata pojedinačnih točaka. To možemo učiniti pomoću tehnika **ekstrakcije značajki**, kao što su SIFT, SURF ili [ORB](https://docs.opencv.org/4.x/d1/d89/tutorial_py_orb.html):\n" ] }, { @@ -252,7 +252,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Da bismo odvojili pojedine znakove, trebamo znati granice okvira cijelog teksta. Da bismo to saznali, možemo jednostavno izračunati minimalne i maksimalne koordinate:\n" + "Da bismo odvojili pojedinačne znakove, trebamo znati granice okvira cijelog teksta. Da bismo to saznali, možemo jednostavno izračunati minimalne i maksimalne koordinate:\n" ] }, { @@ -393,11 +393,11 @@ "source": [ "## Otkrivanje pokreta pomoću razlike između okvira\n", "\n", - "Otkrivanje pokreta na video streamu vrlo je čest zadatak. Na primjer, omogućuje nam primanje upozorenja kada se nešto dogodi na nadzornoj kameri. Ako želimo razumjeti što se događa na kameri, tada možemo koristiti neuronsku mrežu - ali je mnogo jeftinije koristiti neuronsku mrežu kada znamo da se nešto događa.\n", + "Otkrivanje pokreta u video prijenosu vrlo je čest zadatak. Na primjer, omogućuje nam primanje upozorenja kada se nešto dogodi na nadzornoj kameri. Ako želimo razumjeti što se događa na kameri, možemo koristiti neuronsku mrežu - ali korištenje neuronske mreže je mnogo ekonomičnije kada već znamo da se nešto događa.\n", "\n", - "Glavna ideja otkrivanja pokreta je jednostavna. Ako je kamera fiksna, tada bi okviri s kamere trebali biti prilično slični jedni drugima. Budući da su okviri predstavljeni kao nizovi, jednostavnim oduzimanjem tih nizova za dva uzastopna okvira dobit ćemo razliku piksela, koja bi trebala biti niska za statične okvire, a postati veća kada postoji značajan pokret na slici.\n", + "Glavna ideja otkrivanja pokreta je jednostavna. Ako je kamera fiksirana, tada bi okviri s kamere trebali biti prilično slični jedni drugima. Budući da su okviri predstavljeni kao nizovi, jednostavnim oduzimanjem tih nizova za dva uzastopna okvira dobit ćemo razliku piksela, koja bi trebala biti niska za statične okvire, a postati veća kada postoji značajan pokret na slici.\n", "\n", - "Počet ćemo s učenjem kako otvoriti video i pretvoriti ga u niz okvira:\n" + "Počet ćemo tako što ćemo naučiti kako otvoriti video i pretvoriti ga u niz okvira:\n" ] }, { @@ -571,7 +571,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "I naposljetku možemo prikazati sliku:\n" + "I konačno možemo prikazati sliku:\n" ] }, { @@ -649,12 +649,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Izdvajanje gibanja pomoću optičkog toka\n", + "## Ekstrakcija kretanja pomoću optičkog toka\n", "\n", - "Iako usporedba dvaju uzastopnih okvira omogućuje uvid u količinu promjena, ona ne daje informacije o tome što se zapravo kreće i gdje. Za dobivanje tih informacija postoji tehnika nazvana **[optički tok](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)**:\n", + "Iako usporedba dvaju uzastopnih okvira omogućuje uvid u količinu promjena, ne daje informacije o tome što se zapravo kreće i gdje. Za dobivanje tih informacija postoji tehnika nazvana **[optički tok](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)**:\n", "\n", - "* **Gusti optički tok** izračunava vektorsko polje koje pokazuje kamo se svaki piksel pomiče\n", - "* **Rijetki optički tok** temelji se na odabiru nekih prepoznatljivih značajki na slici (npr. rubova) i praćenju njihovih putanja od okvira do okvira.\n", + "* **Gusti optički tok** izračunava vektorsko polje koje pokazuje za svaki piksel gdje se kreće\n", + "* **Rijetki optički tok** temelji se na odabiru nekih prepoznatljivih značajki na slici (npr. rubova) i praćenju njihove putanje od okvira do okvira.\n", "\n", "Pročitajte više o optičkom toku [u ovom izvrsnom vodiču](https://learnopencv.com/optical-flow-in-opencv/).\n", "\n", @@ -740,14 +740,14 @@ "source": [ "Dakle, u tim okvirima zelenkasta boja odgovara kretanju ulijevo, dok plava - kretanju udesno.\n", "\n", - "Optički tok može biti izvrstan alat za donošenje zaključaka o općem smjeru kretanja. Na primjer, ako vidite da se svi pikseli u okviru kreću u više-manje jednom smjeru - možete zaključiti da postoji kretanje kamere i pokušati to kompenzirati.\n" + "Optički tok može biti izvrstan alat za donošenje zaključaka o općem smjeru kretanja. Na primjer, ako vidite da se svi pikseli u okviru kreću više-manje u jednom smjeru - možete zaključiti da postoji pomicanje kamere i pokušati to kompenzirati.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**Odricanje od odgovornosti**: \nOvaj dokument je preveden pomoću AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati autoritativnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane ljudskog prevoditelja. Ne preuzimamo odgovornost za bilo kakva nesporazuma ili pogrešna tumačenja koja proizlaze iz korištenja ovog prijevoda.\n" + "\n---\n\n**Odricanje od odgovornosti**: \nOvaj dokument je preveden korištenjem AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakva nesporazuma ili pogrešna tumačenja koja mogu proizaći iz korištenja ovog prijevoda.\n" ] } ], @@ -774,8 +774,8 @@ }, "orig_nbformat": 4, "coopTranslator": { - "original_hash": "ad5bdca62175c7a3d4336ef8c761aef3", - "translation_date": "2025-08-30T07:28:12+00:00", + "original_hash": "339b2129f86b24024393ff92b8bd376f", + "translation_date": "2025-09-07T15:20:47+00:00", "source_file": "lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb", "language_code": "hr" } diff --git a/translations/hu/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb b/translations/hu/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb index bdd6c3bb..05f3d613 100644 --- a/translations/hu/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb +++ b/translations/hu/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb @@ -10,7 +10,7 @@ "\n", "Az [OpenCV](https://opencv.org/) az *de facto* szabványnak számít a képfeldolgozás területén. Számos hasznos algoritmust tartalmaz, amelyek C++-ban vannak implementálva. Az OpenCV-t Pythonból is használhatod.\n", "\n", - "Ebben a jegyzetfüzetben néhány példát mutatunk az OpenCV használatára. További részletekért látogasd meg a [Learn OpenCV](https://learnopencv.com/getting-started-with-opencv/) online kurzust.\n", + "Ebben a jegyzetfüzetben néhány példát mutatunk az OpenCV használatára. További részletekért látogass el a [Learn OpenCV](https://learnopencv.com/getting-started-with-opencv/) online kurzusra.\n", "\n", "Először importáljuk a `cv2`-t, valamint néhány más hasznos könyvtárat:\n" ] @@ -44,7 +44,7 @@ "source": [ "## Képek betöltése\n", "\n", - "A Pythonban a képek kényelmesen ábrázolhatók NumPy tömbök segítségével. Például egy 320x200 pixeles szürkeárnyalatos kép egy 200x320-as tömbben lenne tárolva, míg egy ugyanolyan méretű színes kép alakja 200x320x3 lenne (a 3 színcsatorna miatt).\n", + "A képek Pythonban kényelmesen ábrázolhatók NumPy tömbök segítségével. Például egy 320x200 pixeles szürkeárnyalatos kép egy 200x320-as tömbben tárolódik, míg egy ugyanolyan méretű színes kép alakja 200x320x3 lesz (a 3 színcsatorna miatt).\n", "\n", "Kezdjük egy kép betöltésével:\n" ] @@ -94,7 +94,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Amint láthatja, ez egy braille szövegről készült kép. Mivel nem igazán érdekel minket a tényleges szín, átalakíthatjuk fekete-fehérre:\n" + "Amint látható, ez egy Braille-szöveg képe. Mivel nem vagyunk túlzottan érdekeltek a tényleges színben, átalakíthatjuk fekete-fehérre:\n" ] }, { @@ -135,7 +135,7 @@ "source": [ "bw_im = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)\n", "print(bw_im.shape)\n", - "plt.imshow(bw_im)" + "plt.imshow(bw_im, cmap='gray')" ] }, { @@ -252,7 +252,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Az egyes karakterek elválasztásához ismernünk kell a teljes szöveg határolókeretét. Ennek meghatározásához egyszerűen kiszámíthatjuk a minimális és maximális koordinátákat:\n" + "Ahhoz, hogy elválasszuk az egyes karaktereket, ismernünk kell a teljes szöveg határolókeretét. Ennek megállapításához egyszerűen kiszámíthatjuk a minimális és maximális koordinátákat:\n" ] }, { @@ -393,11 +393,11 @@ "source": [ "## Mozgásérzékelés képkocka-különbség alapján\n", "\n", - "A mozgásérzékelés videófolyamon egy nagyon gyakori feladat. Például lehetővé teszi, hogy értesítéseket kapjunk, ha valami történik egy biztonsági kamerán. Ha meg akarjuk érteni, mi zajlik a kamerán, használhatunk neurális hálózatot – de sokkal költséghatékonyabb, ha csak akkor használjuk a neurális hálózatot, amikor tudjuk, hogy valami történik.\n", + "A mozgásérzékelés videófolyamon nagyon gyakori feladat. Például lehetővé teszi, hogy értesítéseket kapjunk, amikor valami történik egy biztonsági kamerán. Ha meg akarjuk érteni, mi zajlik a kamerán, akkor használhatunk neurális hálót – de sokkal költséghatékonyabb, ha csak akkor használjuk, amikor tudjuk, hogy valami történik.\n", "\n", - "A mozgásérzékelés alapötlete egyszerű. Ha a kamera rögzített, akkor a kamera képkockái nagyjából hasonlóak kell, hogy legyenek egymáshoz. Mivel a képkockák tömbökként vannak ábrázolva, ha kivonjuk egymásból két egymást követő képkocka tömbjeit, megkapjuk a pixelek közötti különbséget. Ez a különbség statikus képkockák esetén alacsony lesz, de jelentősen megnő, ha jelentős mozgás történik a képen.\n", + "A mozgásérzékelés fő ötlete egyszerű. Ha a kamera rögzített, akkor a kamera képkockái nagyjából hasonlóak kell legyenek egymáshoz. Mivel a képkockák tömbökként vannak ábrázolva, egyszerűen kivonva egymásból két egymást követő képkocka tömbjeit megkapjuk a pixelek közötti különbséget, amely statikus képkockák esetén alacsony lesz, és jelentősen megnő, ha jelentős mozgás van a képen.\n", "\n", - "Először megtanuljuk, hogyan nyissunk meg egy videót, és hogyan alakítsuk azt képkockák sorozatává:\n" + "Először megtanuljuk, hogyan nyissunk meg egy videót, és hogyan alakítsuk át képkockák sorozatává:\n" ] }, { @@ -445,7 +445,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Mivel a szín nem olyan fontos a mozgásérzékeléshez, az összes képkockát szürkeárnyalatossá alakítjuk. Ezután kiszámítjuk a képkockák közötti különbségeket, és ábrázoljuk azok normáit, hogy vizuálisan láthassuk a zajló tevékenység mértékét:\n" + "Mivel a szín nem olyan fontos a mozgásérzékeléshez, az összes képkockát szürkeárnyalatossá alakítjuk. Ezután kiszámítjuk a képkockák közötti különbségeket, és ábrázoljuk azok normáit, hogy vizuálisan lássuk a zajló tevékenység mértékét:\n" ] }, { @@ -490,7 +490,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Tegyük fel, hogy egy olyan jelentést szeretnénk készíteni, amely bemutatja, mi történt a kamera előtt, azáltal, hogy minden alkalommal a megfelelő képet mutatja, amikor valami történik. Ehhez valószínűleg meg akarjuk találni egy \"esemény\" kezdő- és záróképkockáját, majd megjeleníteni a középső képkockát. A zaj csökkentése érdekében a fenti görbét egy mozgóátlag-függvénnyel is kisimítjuk:\n" + "Tegyük fel, hogy egy olyan jelentést szeretnénk készíteni, amely bemutatja, mi történt a kamera előtt, azáltal, hogy minden alkalommal a megfelelő képet mutatja, amikor valami történik. Ehhez valószínűleg meg akarjuk határozni egy \"esemény\" kezdő- és végkeretét, majd megjeleníteni a középső keretet. A zaj csökkentése érdekében a fenti görbét egy mozgóátlag-függvénnyel is kisimítjuk:\n" ] }, { @@ -610,7 +610,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Észreveheti, hogy ennek a képnek a színsémája nem tűnik helyesnek! Ennek oka, hogy az OpenCV történelmi okokból a képeket BGR színtérben tölti be, míg a matplotlib a hagyományosabb RGB színsorrendet használja. Legtöbbször érdemes a képeket azonnal RGB-re konvertálni a betöltés után.\n" + "Észreveheti, hogy ennek a képnek a színsémája nem tűnik helyesnek! Ennek az az oka, hogy az OpenCV történelmi okokból a képeket BGR színtérben tölti be, míg a matplotlib a hagyományosabb RGB színsorrendet használja. A legtöbb esetben érdemes a képeket közvetlenül a betöltés után RGB-re konvertálni.\n" ] }, { @@ -651,7 +651,7 @@ "source": [ "## Mozgás kinyerése optikai áramlás segítségével\n", "\n", - "Bár két egymást követő képkocka összehasonlítása megmutatja a változások mértékét, nem ad információt arról, hogy mi mozog és hol. Ennek az információnak a megszerzésére létezik egy technika, amit **[optikai áramlás](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)** néven ismerünk:\n", + "Bár két egymást követő képkocka összehasonlítása megmutatja a változások mértékét, nem ad információt arról, hogy mi mozog valójában és hol. Ennek az információnak a megszerzéséhez létezik egy technika, amelyet **[optikai áramlás](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)** néven ismerünk:\n", "\n", "* **Sűrű optikai áramlás** kiszámítja azt a vektormezőt, amely megmutatja, hogy minden egyes pixel merre mozog.\n", "* **Ritka optikai áramlás** az alapján működik, hogy azonosít néhány jellegzetes elemet a képen (pl. élek), és nyomon követi azok mozgását képkockáról képkockára.\n", @@ -687,7 +687,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Amint látható, minden képkockához a folyamat a képkocka méretével rendelkezik, és 2 csatornát tartalmaz, amelyek az optikai áramlás vektor x és y komponenseinek felelnek meg.\n", + "Amint látható, minden képkockához az optikai áramlás a képkocka méretével rendelkezik, valamint 2 csatornával, amelyek az optikai áramlás vektor x és y komponenseinek felelnek meg.\n", "\n", "Az optikai áramlás 2D-ben történő megjelenítése kissé kihívást jelent, de van egy okos ötlet, amit használhatunk. Ha az optikai áramlást poláris koordinátákra alakítjuk, akkor minden pixelhez két komponenst kapunk: *irány* és *intenzitás*. Az intenzitást a pixel fényességével, az irányt pedig különböző színekkel tudjuk ábrázolni. Egy képet fogunk létrehozni [HSV (Hue-Saturation-Value) színtérben](https://en.wikipedia.org/wiki/HSV_color_space), ahol a színezetet az irány határozza meg, az értéket az intenzitás, a telítettség pedig 255 lesz.\n" ] @@ -740,7 +740,7 @@ "source": [ "Tehát ezekben a képkockákban a zöldes szín a balra mozgást jelzi, míg a kék a jobbra mozgást.\n", "\n", - "Az optikai áramlás nagyszerű eszköz lehet arra, hogy következtetéseket vonjunk le az általános mozgásirányról. Például, ha azt látod, hogy egy képkocka összes pixele nagyjából egy irányba mozog, akkor arra következtethetsz, hogy a kamera mozog, és megpróbálhatod ezt kompenzálni.\n" + "Az optikai áramlás remek eszköz lehet arra, hogy következtetéseket vonjunk le a mozgás általános irányáról. Például, ha azt látod, hogy egy képkocka összes pixele nagyjából egy irányba mozog, akkor arra következtethetsz, hogy kameramozgás van, és megpróbálhatod kompenzálni azt.\n" ] }, { @@ -774,8 +774,8 @@ }, "orig_nbformat": 4, "coopTranslator": { - "original_hash": "ad5bdca62175c7a3d4336ef8c761aef3", - "translation_date": "2025-08-29T13:59:31+00:00", + "original_hash": "339b2129f86b24024393ff92b8bd376f", + "translation_date": "2025-09-07T15:16:07+00:00", "source_file": "lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb", "language_code": "hu" } diff --git a/translations/id/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb b/translations/id/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb index 731bba63..88ee6bee 100644 --- a/translations/id/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb +++ b/translations/id/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb @@ -4,11 +4,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Visi Komputer dan OpenCV\n", + "# Komputer Vision dan OpenCV\n", "\n", "Notebook ini adalah bagian dari [Kurikulum AI untuk Pemula](http://aka.ms/ai-beginners).\n", "\n", - "[OpenCV](https://opencv.org/) dianggap sebagai standar *de facto* untuk pemrosesan gambar. OpenCV berisi banyak algoritma yang berguna, yang diimplementasikan dalam C++. Anda juga dapat menggunakan OpenCV melalui Python.\n", + "[OpenCV](https://opencv.org/) dianggap sebagai standar *de facto* untuk pemrosesan gambar. OpenCV memiliki banyak algoritma yang berguna, yang diimplementasikan dalam C++. Anda juga dapat menggunakan OpenCV melalui Python.\n", "\n", "Dalam notebook ini, kami akan memberikan beberapa contoh penggunaan OpenCV. Untuk informasi lebih lanjut, Anda dapat mengunjungi kursus online [Learn OpenCV](https://learnopencv.com/getting-started-with-opencv/).\n", "\n", @@ -44,7 +44,7 @@ "source": [ "## Memuat Gambar\n", "\n", - "Gambar dalam Python dapat dengan mudah direpresentasikan oleh array NumPy. Sebagai contoh, gambar grayscale dengan ukuran 320x200 piksel akan disimpan dalam array berukuran 200x320, dan gambar berwarna dengan dimensi yang sama akan memiliki bentuk 200x320x3 (untuk 3 saluran warna).\n", + "Gambar dalam Python dapat dengan mudah direpresentasikan menggunakan array NumPy. Sebagai contoh, gambar grayscale dengan ukuran 320x200 piksel akan disimpan dalam array berukuran 200x320, sedangkan gambar berwarna dengan dimensi yang sama akan memiliki bentuk 200x320x3 (untuk 3 saluran warna).\n", "\n", "Mari kita mulai dengan memuat sebuah gambar:\n" ] @@ -135,7 +135,7 @@ "source": [ "bw_im = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)\n", "print(bw_im.shape)\n", - "plt.imshow(bw_im)" + "plt.imshow(bw_im, cmap='gray')" ] }, { @@ -144,7 +144,7 @@ "source": [ "## Pemrosesan Gambar Braille\n", "\n", - "Jika kita ingin menerapkan klasifikasi gambar untuk mengenali teks, kita perlu memotong simbol-simbol individual agar menyerupai gambar MNIST yang telah kita lihat sebelumnya. Hal ini dapat dilakukan menggunakan teknik [deteksi objek](../11-ObjectDetection/README.md) yang akan kita bahas nanti, tetapi kita juga bisa mencoba menggunakan visi komputer murni untuk itu. Penjelasan yang baik tentang bagaimana visi komputer dapat digunakan untuk memisahkan karakter dapat ditemukan [dalam posting blog ini](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) - di sini kita hanya akan fokus pada beberapa teknik visi komputer.\n", + "Jika kita ingin menerapkan klasifikasi gambar untuk mengenali teks, kita perlu memotong simbol-simbol individual agar mirip dengan gambar MNIST yang telah kita lihat sebelumnya. Hal ini dapat dilakukan menggunakan teknik [deteksi objek](../11-ObjectDetection/README.md) yang akan kita bahas nanti, tetapi kita juga dapat mencoba menggunakan visi komputer murni untuk itu. Penjelasan yang baik tentang bagaimana visi komputer dapat digunakan untuk pemisahan karakter dapat ditemukan [di blog ini](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) - di sini kita hanya akan fokus pada beberapa teknik visi komputer.\n", "\n", "Pertama, mari kita coba meningkatkan gambar sedikit. Kita dapat menggunakan ide **thresholding** (dijelaskan dengan baik [dalam artikel OpenCV ini](https://docs.opencv.org/4.x/d7/d4d/tutorial_py_thresholding.html)):\n" ] @@ -192,7 +192,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Untuk bekerja dengan gambar, kita perlu \"mengekstrak\" titik-titik individu, yaitu mengonversi gambar menjadi sekumpulan koordinat dari titik-titik individu. Kita dapat melakukannya menggunakan teknik **ekstraksi fitur**, seperti SIFT, SURF, atau [ORB](https://docs.opencv.org/4.x/d1/d89/tutorial_py_orb.html):\n" + "Untuk bekerja dengan gambar, kita perlu \"mengekstrak\" titik-titik individu, yaitu mengubah gambar menjadi sekumpulan koordinat dari titik-titik individu. Kita dapat melakukannya menggunakan teknik **ekstraksi fitur**, seperti SIFT, SURF, atau [ORB](https://docs.opencv.org/4.x/d1/d89/tutorial_py_orb.html):\n" ] }, { @@ -293,7 +293,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Juga, teks ini dapat diputar sebagian, dan untuk membuatnya sejajar dengan sempurna, kita perlu melakukan yang disebut **transformasi perspektif**. Kita akan mengambil sebuah persegi panjang yang didefinisikan oleh titik-titik $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ dan menyelaraskannya dengan gambar baru dengan dimensi yang proporsional:\n" + "Selain itu, teks ini dapat diputar sebagian, dan untuk membuatnya sejajar dengan sempurna, kita perlu melakukan yang disebut **transformasi perspektif**. Kita akan mengambil sebuah persegi panjang yang didefinisikan oleh titik-titik $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ dan menyelaraskannya dengan gambar baru dengan dimensi yang proporsional:\n" ] }, { @@ -384,7 +384,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Anda telah melihat bahwa cukup banyak tugas dapat dilakukan menggunakan pemrosesan gambar murni, tanpa kecerdasan buatan. Jika kita dapat menggunakan teknik visi komputer untuk membuat pekerjaan jaringan neural menjadi lebih sederhana - kita harus melakukannya, karena hal itu akan memungkinkan kita untuk menyelesaikan masalah dengan jumlah data pelatihan yang lebih sedikit.\n" + "Anda telah melihat bahwa cukup banyak tugas dapat dilakukan menggunakan pemrosesan gambar murni, tanpa kecerdasan buatan. Jika kita dapat menggunakan teknik penglihatan komputer untuk membuat pekerjaan jaringan saraf lebih sederhana - kita sebaiknya melakukannya, karena ini akan memungkinkan kita menyelesaikan masalah dengan jumlah data pelatihan yang lebih sedikit.\n" ] }, { @@ -393,7 +393,7 @@ "source": [ "## Deteksi Gerakan menggunakan Perbedaan Frame\n", "\n", - "Mendeteksi gerakan pada aliran video adalah tugas yang sangat umum. Sebagai contoh, ini memungkinkan kita mendapatkan peringatan ketika sesuatu terjadi pada kamera pengawas. Jika kita ingin memahami apa yang terjadi pada kamera, kita bisa menggunakan jaringan neural - tetapi jauh lebih murah menggunakan jaringan neural ketika kita sudah tahu bahwa ada sesuatu yang sedang terjadi.\n", + "Mendeteksi gerakan pada aliran video adalah tugas yang sangat umum. Sebagai contoh, ini memungkinkan kita mendapatkan peringatan ketika sesuatu terjadi pada kamera pengawas. Jika kita ingin memahami apa yang terjadi pada kamera, kita bisa menggunakan jaringan neural - tetapi jauh lebih murah menggunakan jaringan neural hanya ketika kita tahu bahwa ada sesuatu yang sedang terjadi.\n", "\n", "Ide utama dari deteksi gerakan sangat sederhana. Jika kamera tetap diam, maka frame dari kamera seharusnya cukup mirip satu sama lain. Karena frame direpresentasikan sebagai array, dengan hanya mengurangkan array dari dua frame berturut-turut, kita akan mendapatkan perbedaan piksel, yang seharusnya rendah untuk frame statis, dan menjadi lebih tinggi ketika ada gerakan yang signifikan dalam gambar.\n", "\n", @@ -490,7 +490,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Misalkan kita ingin membuat laporan yang menunjukkan apa yang terjadi di depan kamera dengan menampilkan gambar yang sesuai setiap kali sesuatu terjadi. Untuk melakukannya, kita mungkin ingin mencari tahu frame awal dan akhir dari sebuah \"kejadian\", dan menampilkan frame tengahnya. Untuk menghilangkan beberapa noise, kita juga akan meratakan kurva di atas dengan fungsi rata-rata bergerak:\n" + "Misalkan kita ingin membuat laporan yang menunjukkan apa yang terjadi di depan kamera dengan menampilkan gambar yang sesuai setiap kali sesuatu terjadi. Untuk melakukannya, kita mungkin ingin mencari frame awal dan akhir dari sebuah \"kejadian\", dan menampilkan frame tengahnya. Untuk menghilangkan beberapa noise, kita juga akan meratakan kurva di atas dengan fungsi rata-rata bergerak:\n" ] }, { @@ -610,7 +610,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Anda mungkin memperhatikan bahwa skema warna pada gambar ini terlihat tidak benar! Ini karena OpenCV untuk alasan historis memuat gambar dalam ruang warna BGR, sementara matplotlib menggunakan urutan warna RGB yang lebih tradisional. Sebagian besar waktu, masuk akal untuk mengonversi gambar ke RGB segera setelah memuatnya.\n" + "Anda mungkin memperhatikan bahwa skema warna pada gambar ini tidak terlihat benar! Ini karena OpenCV untuk alasan historis memuat gambar dalam ruang warna BGR, sementara matplotlib menggunakan urutan warna RGB yang lebih tradisional. Sebagian besar waktu, masuk akal untuk mengonversi gambar ke RGB segera setelah memuatnya.\n" ] }, { @@ -649,16 +649,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Ekstraksi Gerakan menggunakan Optical Flow\n", + "## Ekstrak Gerakan menggunakan Optical Flow\n", "\n", - "Meskipun hanya membandingkan dua frame berturut-turut memungkinkan kita melihat jumlah perubahan, metode ini tidak memberikan informasi tentang apa yang sebenarnya bergerak dan di mana. Untuk mendapatkan informasi tersebut, ada teknik yang disebut **[optical flow](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)**:\n", + "Meskipun membandingkan dua frame berturut-turut memungkinkan kita melihat jumlah perubahan, metode ini tidak memberikan informasi tentang apa yang sebenarnya bergerak dan di mana. Untuk mendapatkan informasi tersebut, ada teknik yang disebut **[optical flow](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)**:\n", "\n", "* **Dense Optical Flow** menghitung medan vektor yang menunjukkan ke mana setiap piksel bergerak.\n", - "* **Sparse Optical Flow** didasarkan pada pengambilan beberapa fitur khas dalam gambar (misalnya, tepi), dan membangun lintasan mereka dari frame ke frame.\n", + "* **Sparse Optical Flow** didasarkan pada mengambil beberapa fitur khas dalam gambar (misalnya, tepi), dan membangun lintasannya dari frame ke frame.\n", "\n", - "Baca lebih lanjut tentang optical flow [di tutorial hebat ini](https://learnopencv.com/optical-flow-in-opencv/).\n", + "Baca lebih lanjut tentang optical flow [dalam tutorial hebat ini](https://learnopencv.com/optical-flow-in-opencv/).\n", "\n", - "Mari kita hitung dense optical flow antara frame kita:\n" + "Mari kita hitung dense optical flow di antara frame kita:\n" ] }, { @@ -689,7 +689,7 @@ "source": [ "Seperti yang dapat Anda lihat, untuk setiap frame, aliran memiliki dimensi frame, dan 2 saluran, yang sesuai dengan komponen x dan y dari vektor aliran optik.\n", "\n", - "Menampilkan aliran optik dalam 2D agak menantang, tetapi kita dapat menggunakan satu ide yang cerdas. Jika kita mengonversi aliran optik ke koordinat polar, maka kita akan mendapatkan dua komponen untuk setiap piksel: *arah* dan *intensitas*. Kita dapat merepresentasikan intensitas dengan intensitas piksel, dan arah dengan warna yang berbeda. Kita akan membuat gambar dalam [ruang warna HSV (Hue-Saturation-Value)](https://en.wikipedia.org/wiki/HSV_color_space), di mana hue akan didefinisikan oleh arah, value oleh intensitas, dan saturation akan bernilai 255.\n" + "Menampilkan aliran optik dalam 2D agak menantang, tetapi kita dapat menggunakan satu ide cerdas. Jika kita mengonversi aliran optik ke koordinat polar, maka kita akan mendapatkan dua komponen untuk setiap piksel: *arah* dan *intensitas*. Kita dapat merepresentasikan intensitas dengan intensitas piksel, dan arah dengan warna yang berbeda. Kita akan membuat gambar dalam [ruang warna HSV (Hue-Saturation-Value)](https://en.wikipedia.org/wiki/HSV_color_space), di mana hue akan didefinisikan oleh arah, value oleh intensitas, dan saturation akan bernilai 255.\n" ] }, { @@ -740,14 +740,14 @@ "source": [ "Jadi, dalam frame-frame tersebut, warna kehijauan menunjukkan pergerakan ke kiri, sedangkan biru menunjukkan pergerakan ke kanan.\n", "\n", - "Optical flow bisa menjadi alat yang sangat baik untuk menarik kesimpulan tentang arah pergerakan secara umum. Sebagai contoh, jika Anda melihat bahwa semua piksel dalam sebuah frame bergerak ke satu arah yang kurang lebih sama - Anda dapat menyimpulkan bahwa ada pergerakan kamera, dan mencoba untuk mengkompensasi hal tersebut.\n" + "Optical flow bisa menjadi alat yang sangat berguna untuk menarik kesimpulan tentang arah pergerakan secara umum. Sebagai contoh, jika Anda melihat bahwa semua piksel dalam sebuah frame bergerak ke satu arah yang kurang lebih sama - Anda bisa menyimpulkan bahwa ada pergerakan kamera, dan mencoba untuk mengkompensasi hal tersebut.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**Penafian**: \nDokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berusaha untuk memberikan hasil yang akurat, harap diperhatikan bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini.\n" + "\n---\n\n**Penafian**: \nDokumen ini telah diterjemahkan menggunakan layanan terjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berupaya untuk memberikan hasil yang akurat, harap diperhatikan bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang berwenang. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa terjemahan manusia profesional. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini.\n" ] } ], @@ -774,8 +774,8 @@ }, "orig_nbformat": 4, "coopTranslator": { - "original_hash": "ad5bdca62175c7a3d4336ef8c761aef3", - "translation_date": "2025-08-29T13:56:52+00:00", + "original_hash": "339b2129f86b24024393ff92b8bd376f", + "translation_date": "2025-09-07T15:13:08+00:00", "source_file": "lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb", "language_code": "id" } diff --git a/translations/it/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb b/translations/it/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb index e74ef08f..923a3ec5 100644 --- a/translations/it/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb +++ b/translations/it/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb @@ -4,15 +4,15 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Visione Artificiale e OpenCV\n", + "# Visione artificiale e OpenCV\n", "\n", "Questo notebook fa parte del [Curriculum AI per Principianti](http://aka.ms/ai-beginners).\n", "\n", - "[OpenCV](https://opencv.org/) è considerato lo standard *de facto* per l'elaborazione delle immagini. Contiene molti algoritmi utili, implementati in C++. Puoi utilizzare OpenCV anche da Python.\n", + "[OpenCV](https://opencv.org/) è considerato lo standard *de facto* per l'elaborazione delle immagini. Contiene molti algoritmi utili, implementati in C++. È possibile utilizzare OpenCV anche da Python.\n", "\n", - "In questo notebook, ti forniremo alcuni esempi per utilizzare OpenCV. Per maggiori dettagli, puoi visitare il corso online [Learn OpenCV](https://learnopencv.com/getting-started-with-opencv/).\n", + "In questo notebook, ti forniremo alcuni esempi sull'utilizzo di OpenCV. Per ulteriori dettagli, puoi visitare il corso online [Learn OpenCV](https://learnopencv.com/getting-started-with-opencv/).\n", "\n", - "Per prima cosa, importiamo `cv2`, insieme ad alcune altre librerie utili:\n" + "Per iniziare, importiamo `cv2`, insieme ad alcune altre librerie utili:\n" ] }, { @@ -44,7 +44,7 @@ "source": [ "## Caricamento delle immagini\n", "\n", - "Le immagini in Python possono essere rappresentate comodamente tramite array di NumPy. Ad esempio, un'immagine in scala di grigi con dimensioni di 320x200 pixel verrebbe memorizzata in un array 200x320, mentre un'immagine a colori delle stesse dimensioni avrebbe una forma di 200x320x3 (per i 3 canali di colore).\n", + "Le immagini in Python possono essere comodamente rappresentate da array NumPy. Ad esempio, un'immagine in scala di grigi con dimensioni di 320x200 pixel sarebbe memorizzata in un array 200x320, mentre un'immagine a colori delle stesse dimensioni avrebbe una forma di 200x320x3 (per i 3 canali di colore).\n", "\n", "Iniziamo caricando un'immagine:\n" ] @@ -135,18 +135,18 @@ "source": [ "bw_im = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)\n", "print(bw_im.shape)\n", - "plt.imshow(bw_im)" + "plt.imshow(bw_im, cmap='gray')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Elaborazione delle immagini Braille\n", + "## Elaborazione delle Immagini in Braille\n", "\n", - "Se vogliamo applicare la classificazione delle immagini per riconoscere il testo, dobbiamo ritagliare i singoli simboli per renderli simili alle immagini MNIST che abbiamo visto in precedenza. Questo può essere fatto utilizzando la tecnica di [object detection](../11-ObjectDetection/README.md), di cui parleremo più avanti, ma possiamo anche provare a utilizzare la pura visione artificiale per questo scopo. Una buona descrizione di come la visione artificiale può essere utilizzata per separare i caratteri si trova [in questo post sul blog](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) - qui ci concentreremo solo su alcune tecniche di visione artificiale.\n", + "Se vogliamo applicare la classificazione delle immagini per riconoscere il testo, dobbiamo ritagliare i singoli simboli per renderli simili alle immagini MNIST che abbiamo visto in precedenza. Questo può essere fatto utilizzando la tecnica di [object detection](../11-ObjectDetection/README.md), di cui parleremo più avanti, ma possiamo anche provare a utilizzare la pura visione artificiale per questo scopo. Una buona descrizione di come la visione artificiale possa essere utilizzata per separare i caratteri si trova [in questo articolo del blog](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) - qui ci concentreremo solo su alcune tecniche di visione artificiale.\n", "\n", - "Per prima cosa, proviamo a migliorare un po' l'immagine. Possiamo utilizzare l'idea della **thresholding** (ben descritta [in questo articolo di OpenCV](https://docs.opencv.org/4.x/d7/d4d/tutorial_py_thresholding.html)):\n" + "Per prima cosa, proviamo a migliorare un po' l'immagine. Possiamo utilizzare l'idea della **soglia** (ben descritta [in questo articolo di OpenCV](https://docs.opencv.org/4.x/d7/d4d/tutorial_py_thresholding.html)):\n" ] }, { @@ -293,7 +293,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Inoltre, questo testo può essere parzialmente ruotato e, per renderlo perfettamente allineato, dobbiamo eseguire la cosiddetta **trasformazione prospettica**. Prenderemo un rettangolo definito dai punti $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ e lo allineeremo con una nuova immagine con dimensioni proporzionali:\n" + "Inoltre, questo testo può essere parzialmente ruotato e, per allinearlo perfettamente, dobbiamo effettuare la cosiddetta **trasformazione prospettica**. Prenderemo un rettangolo definito dai punti $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ e lo allineeremo con una nuova immagine con dimensioni proporzionali:\n" ] }, { @@ -389,13 +389,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Rilevamento del Movimento tramite Differenza tra Frame\n", + "## Rilevamento del movimento tramite differenza tra fotogrammi\n", "\n", "Rilevare il movimento in un flusso video è un compito molto comune. Ad esempio, ci permette di ricevere avvisi quando accade qualcosa su una telecamera di sorveglianza. Se vogliamo capire cosa sta succedendo sulla telecamera, possiamo poi utilizzare una rete neurale - ma è molto più economico utilizzare una rete neurale solo quando sappiamo che qualcosa sta accadendo.\n", "\n", - "L'idea principale del rilevamento del movimento è semplice. Se la telecamera è fissa, i frame della telecamera dovrebbero essere piuttosto simili tra loro. Poiché i frame sono rappresentati come array, semplicemente sottraendo questi array per due frame consecutivi otterremo la differenza dei pixel, che dovrebbe essere bassa per i frame statici e diventare più alta quando c'è un movimento significativo nell'immagine.\n", + "L'idea principale del rilevamento del movimento è semplice. Se la telecamera è fissa, i fotogrammi della telecamera dovrebbero essere abbastanza simili tra loro. Poiché i fotogrammi sono rappresentati come array, semplicemente sottraendo questi array di due fotogrammi consecutivi otterremo la differenza dei pixel, che dovrebbe essere bassa per fotogrammi statici e diventare più alta quando c'è un movimento significativo nell'immagine.\n", "\n", - "Inizieremo imparando come aprire un video e convertirlo in una sequenza di frame:\n" + "Inizieremo imparando come aprire un video e convertirlo in una sequenza di fotogrammi:\n" ] }, { @@ -488,7 +488,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Supponiamo di voler creare un rapporto che mostri ciò che è accaduto davanti alla telecamera mostrando l'immagine appropriata ogni volta che accade qualcosa. Per farlo, probabilmente vogliamo individuare il fotogramma iniziale e finale di un \"evento\" e visualizzare il fotogramma centrale. Per rimuovere un po' di rumore, appianeremo anche la curva sopra con la funzione della media mobile:\n" + "Supponiamo di voler creare un rapporto che mostri ciò che è accaduto davanti alla telecamera mostrando l'immagine appropriata ogni volta che succede qualcosa. Per farlo, probabilmente vogliamo individuare il fotogramma iniziale e finale di un \"evento\" e visualizzare il fotogramma centrale. Per rimuovere un po' di rumore, appianeremo anche la curva sopra con una funzione di media mobile:\n" ] }, { @@ -533,7 +533,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Ora possiamo trovare i fotogrammi che hanno una quantità di cambiamenti sopra la soglia utilizzando `np.where`, ed estrarre una sequenza di fotogrammi consecutivi che è più lunga di 30 fotogrammi:\n" + "Ora possiamo individuare i fotogrammi che hanno un numero di cambiamenti superiore alla soglia utilizzando `np.where`, ed estrarre una sequenza di fotogrammi consecutivi più lunga di 30 fotogrammi:\n" ] }, { @@ -606,7 +606,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Potresti notare che la combinazione di colori in questa immagine non sembra corretta! Questo perché OpenCV, per ragioni storiche, carica le immagini nello spazio colore BGR, mentre matplotlib utilizza l'ordine di colori RGB più tradizionale. Nella maggior parte dei casi, ha senso convertire le immagini in RGB subito dopo averle caricate.\n" + "Potresti notare che lo schema dei colori in questa immagine non sembra corretto! Questo perché OpenCV, per motivi storici, carica le immagini nello spazio colore BGR, mentre matplotlib utilizza l'ordine dei colori RGB più tradizionale. La maggior parte delle volte ha senso convertire le immagini in RGB subito dopo averle caricate.\n" ] }, { @@ -645,14 +645,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Estrai il Movimento utilizzando il Flusso Ottico\n", + "## Estrarre il Movimento usando il Flusso Ottico\n", "\n", - "Sebbene confrontare due fotogrammi consecutivi ci permetta di vedere la quantità di cambiamenti, non fornisce alcuna informazione su cosa si stia effettivamente muovendo e dove. Per ottenere queste informazioni, esiste una tecnica chiamata **[flusso ottico](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)**:\n", + "Confrontare semplicemente due fotogrammi consecutivi ci permette di vedere la quantità di cambiamenti, ma non fornisce alcuna informazione su cosa si stia effettivamente muovendo e dove. Per ottenere queste informazioni, esiste una tecnica chiamata **[flusso ottico](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)**:\n", "\n", - "* **Flusso Ottico Denso** calcola il campo vettoriale che mostra per ogni pixel dove si sta muovendo\n", - "* **Flusso Ottico Sparso** si basa sull'individuazione di alcune caratteristiche distintive nell'immagine (ad esempio, i bordi) e sulla costruzione della loro traiettoria da un fotogramma all'altro.\n", + "* **Flusso Ottico Denso** calcola il campo vettoriale che mostra per ogni pixel dove si sta muovendo.\n", + "* **Flusso Ottico Sparso** si basa sull'individuazione di alcune caratteristiche distintive nell'immagine (ad esempio, bordi) e sulla costruzione della loro traiettoria da un fotogramma all'altro.\n", "\n", - "Puoi approfondire il flusso ottico [in questo ottimo tutorial](https://learnopencv.com/optical-flow-in-opencv/).\n", + "Leggi di più sul flusso ottico [in questo ottimo tutorial](https://learnopencv.com/optical-flow-in-opencv/).\n", "\n", "Calcoliamo il flusso ottico denso tra i nostri fotogrammi:\n" ] @@ -683,9 +683,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Come puoi vedere, per ogni frame il flusso ha la dimensione del frame e 2 canali, corrispondenti alle componenti x e y del vettore di flusso ottico.\n", + "Come puoi vedere, per ogni fotogramma il flusso ha la dimensione del fotogramma e 2 canali, corrispondenti alle componenti x e y del vettore di flusso ottico.\n", "\n", - "Visualizzare il flusso ottico in 2D è un po' complicato, ma possiamo utilizzare un'idea ingegnosa. Se convertiamo il flusso ottico in coordinate polari, otterremo due componenti per ogni pixel: *direzione* e *intensità*. Possiamo rappresentare l'intensità con l'intensità del pixel e la direzione con colori diversi. Creeremo un'immagine nello [spazio colore HSV (Tonalità-Saturazione-Valore)](https://en.wikipedia.org/wiki/HSV_color_space), dove la tonalità sarà definita dalla direzione, il valore dall'intensità e la saturazione sarà impostata a 255.\n" + "Visualizzare il flusso ottico in 2D è un po' complicato, ma possiamo utilizzare un'idea ingegnosa. Se convertiamo il flusso ottico in coordinate polari, otterremo due componenti per ogni pixel: *direzione* e *intensità*. Possiamo rappresentare l'intensità attraverso l'intensità del pixel e la direzione con colori diversi. Creeremo un'immagine nello [spazio colore HSV (Hue-Saturation-Value)](https://en.wikipedia.org/wiki/HSV_color_space), dove la tonalità sarà definita dalla direzione, il valore dall'intensità e la saturazione sarà 255.\n" ] }, { @@ -770,8 +770,8 @@ }, "orig_nbformat": 4, "coopTranslator": { - "original_hash": "ad5bdca62175c7a3d4336ef8c761aef3", - "translation_date": "2025-08-28T13:13:41+00:00", + "original_hash": "339b2129f86b24024393ff92b8bd376f", + "translation_date": "2025-09-07T15:04:10+00:00", "source_file": "lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb", "language_code": "it" } diff --git a/translations/ja/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb b/translations/ja/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb index 1f844294..3b2c5e7c 100644 --- a/translations/ja/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb +++ b/translations/ja/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb @@ -8,11 +8,11 @@ "\n", "このノートブックは[AI for Beginners Curriculum](http://aka.ms/ai-beginners)の一部です。\n", "\n", - "[OpenCV](https://opencv.org/)は、画像処理の*事実上の*標準とされています。C++で実装された多くの便利なアルゴリズムが含まれています。また、PythonからOpenCVを呼び出すことも可能です。\n", + "[OpenCV](https://opencv.org/)は画像処理の分野で事実上の標準とされています。多くの便利なアルゴリズムがC++で実装されていますが、PythonからもOpenCVを利用することができます。\n", "\n", - "このノートブックでは、OpenCVを使用するいくつかの例を紹介します。詳細については、オンラインコースの[Learn OpenCV](https://learnopencv.com/getting-started-with-opencv/)をご覧ください。\n", + "このノートブックでは、OpenCVを使用するいくつかの例を紹介します。詳細については、オンラインコース[Learn OpenCV](https://learnopencv.com/getting-started-with-opencv/)をご覧ください。\n", "\n", - "まず、`cv2`をインポートし、その他の便利なライブラリもいくつかインポートしてみましょう:\n" + "まず、`cv2`をインポートし、その他の便利なライブラリもインポートしましょう。\n" ] }, { @@ -44,7 +44,7 @@ "source": [ "## 画像の読み込み\n", "\n", - "Pythonでは、画像をNumPy配列で簡単に表現できます。例えば、320x200ピクセルのグレースケール画像は200x320の配列に格納され、同じサイズのカラー画像は200x320x3の形状になります(3つのカラーチャンネルのため)。\n", + "Pythonでは、画像をNumPy配列として簡単に扱うことができます。例えば、320x200ピクセルのグレースケール画像は200x320の配列に保存され、同じサイズのカラー画像は200x320x3の形状になります(3つのカラーチャンネルのため)。\n", "\n", "まずは画像を読み込んでみましょう:\n" ] @@ -94,7 +94,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "ご覧のとおり、これは点字の画像です。実際の色にはあまり興味がないため、白黒に変換することができます。\n" + "ご覧のとおり、これは点字の画像です。実際の色にはあまり興味がないので、白黒に変換することができます。\n" ] }, { @@ -135,7 +135,7 @@ "source": [ "bw_im = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)\n", "print(bw_im.shape)\n", - "plt.imshow(bw_im)" + "plt.imshow(bw_im, cmap='gray')" ] }, { @@ -192,7 +192,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "画像を扱うには、個々のドットを「抽出」する必要があります。つまり、画像を個々のドットの座標の集合に変換します。それは、SIFT、SURF、または[ORB](https://docs.opencv.org/4.x/d1/d89/tutorial_py_orb.html)のような**特徴抽出**技術を使用して行うことができます。\n" + "画像を扱うには、個々のドットを「抽出」する必要があります。つまり、画像を個々のドットの座標のセットに変換する必要があります。それは、SIFT、SURF、または[ORB](https://docs.opencv.org/4.x/d1/d89/tutorial_py_orb.html)のような**特徴抽出**技術を使用して行うことができます。\n" ] }, { @@ -252,7 +252,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "個々の文字を分離するには、テキスト全体の境界ボックスを知る必要があります。それを見つけるためには、最小座標と最大座標を計算するだけで済みます。\n" + "個々の文字を分離するには、テキスト全体のバウンディングボックスを知る必要があります。それを見つけるために、最小座標と最大座標を計算するだけで済みます。\n" ] }, { @@ -293,7 +293,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "また、このテキストは部分的に回転することができ、完全に整列させるためには、いわゆる**透視変換**を行う必要があります。点$(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$で定義された矩形を取り、新しい画像に比例した寸法で整列させます。\n" + "また、このテキストは部分的に回転する可能性があり、完全に整列させるためには、いわゆる**透視変換**を行う必要があります。点$(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$で定義される長方形を取り、比例した寸法の新しい画像に整列させます。\n" ] }, { @@ -340,7 +340,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "この整列された画像を取得した後、比較的簡単にそれを部分に分割できるはずです。\n" + "この整列された画像を取得した後、それを部分に分割するのは比較的簡単なはずです。\n" ] }, { @@ -384,18 +384,18 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "かなり多くのタスクが人工知能を使わずに純粋な画像処理で実行できることを見てきました。コンピュータビジョン技術を使用してニューラルネットワークの作業を簡単にできるのであれば、ぜひそうすべきです。なぜなら、それによって少ないトレーニングデータで問題を解決できるようになるからです。\n" + "純粋な画像処理を使用して、多くのタスクを実行できることを確認しました。人工知能を使用せずに済む場合、コンピュータビジョン技術を使用してニューラルネットワークの作業を簡素化できるのであれば、ぜひそうすべきです。これにより、少ないトレーニングデータで問題を解決できるようになります。\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## フレーム差分を用いた動体検知\n", + "## フレーム差分を利用した動作検知\n", "\n", - "ビデオストリームで動きを検知することは非常に一般的なタスクです。例えば、監視カメラで何かが起きたときにアラートを受け取ることができます。カメラで何が起きているのかを理解したい場合、ニューラルネットワークを使用することもできますが、何かが起きていると分かっている場合にニューラルネットワークを使用する方がコストを抑えられます。\n", + "ビデオストリームで動きを検知することは非常に一般的なタスクです。例えば、監視カメラで何かが起きた際にアラートを受け取ることができます。カメラで何が起きているのかを理解したい場合、ニューラルネットワークを使用することもできますが、何か動きがあると分かっている場合にはニューラルネットワークを使用する方がコストを抑えられます。\n", "\n", - "動体検知の基本的なアイデアはシンプルです。カメラが固定されている場合、カメラからのフレームはお互いに非常に似ているはずです。フレームは配列として表現されるため、連続する2つのフレームの配列を引き算するだけでピクセルの差分を得ることができます。静止しているフレームではこの差分は小さく、画像内で大きな動きがあると差分が大きくなります。\n", + "動作検知の基本的なアイデアはシンプルです。カメラが固定されている場合、カメラからのフレームは互いに非常に似ているはずです。フレームは配列として表現されるため、連続する2つのフレームの配列を引き算することでピクセルの差分を得ることができます。静止したフレームではこの差分は低くなり、画像内で大きな動きがある場合には差分が大きくなります。\n", "\n", "まずは、ビデオを開いてフレームの連続に変換する方法を学びます:\n" ] @@ -445,7 +445,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "色は動きの検出にそれほど重要ではないため、すべてのフレームをグレースケールに変換します。その後、フレームの差分を計算し、それらのノルムをプロットして、発生している活動量を視覚的に確認します。\n" + "色は動きの検出にそれほど重要ではないため、すべてのフレームをグレースケールに変換します。その後、フレームの差分を計算し、それらのノルムをプロットして、どれだけの活動が行われているかを視覚的に確認します。\n" ] }, { @@ -490,7 +490,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "カメラの前で何が起こったかを示すレポートを作成する場合、何かが起こるたびに適切な画像を表示することでそれを示します。そのためには、おそらく「イベント」の開始フレームと終了フレームを見つけ、中間フレームを表示したいと考えるでしょう。一部のノイズを除去するために、移動平均関数を使用して上記の曲線を平滑化します。\n" + "カメラの前で何が起こったかを示すレポートを作成する場合、何かが起こるたびに適切な画像を表示する必要があります。そのためには、おそらく「イベント」の開始フレームと終了フレームを見つけ、中間フレームを表示したいと考えるでしょう。一部のノイズを除去するために、移動平均関数を使用して上記の曲線を平滑化します。\n" ] }, { @@ -535,7 +535,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "今、`np.where`を使用してしきい値を超える変化量を持つフレームを見つけ、30フレーム以上の連続したフレームのシーケンスを抽出することができます:\n" + "今、`np.where`を使用して、しきい値を超える変化量を持つフレームを見つけ出し、30フレーム以上の連続したフレームのシーケンスを抽出することができます。\n" ] }, { @@ -571,7 +571,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "そして最後に画像を表示できます。\n" + "そして最後に画像を表示できます:\n" ] }, { @@ -610,7 +610,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "この画像の配色が正しくないように見えるかもしれません!これは、OpenCVが歴史的な理由で画像をBGRカラースペースで読み込むのに対し、matplotlibがより伝統的なRGBカラー順を使用しているためです。ほとんどの場合、画像を読み込んだ直後にRGBに変換するのが理にかなっています。\n" + "この画像の配色が正しく見えないことに気付くかもしれません!これは、OpenCVが歴史的な理由で画像をBGRカラースペースで読み込むのに対し、matplotlibはより伝統的なRGBカラー順序を使用するためです。ほとんどの場合、画像を読み込んだ直後にRGBに変換するのが理にかなっています。\n" ] }, { @@ -649,16 +649,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## 光学フローを使った動きの抽出\n", + "## 光学フローを使用して動きを抽出する\n", "\n", - "2つの連続するフレームを比較するだけでは、変化の量はわかりますが、実際に何がどこで動いているのかという情報は得られません。その情報を得るために、**[光学フロー](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)** という技術があります。\n", + "2つの連続するフレームを比較するだけでは、変化の量を確認することはできますが、実際に何がどこで動いているのかについての情報は得られません。その情報を得るためには、**[光学フロー](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)** という手法があります。\n", "\n", - "* **密な光学フロー (Dense Optical Flow)** は、各ピクセルがどこに動いているかを示すベクトル場を計算します。\n", + "* **密な光学フロー (Dense Optical Flow)** は、各ピクセルがどこに移動しているかを示すベクトル場を計算します。\n", "* **疎な光学フロー (Sparse Optical Flow)** は、画像内の特徴的な部分(例: エッジ)を抽出し、それらのフレーム間の軌跡を構築する方法です。\n", "\n", - "光学フローについてさらに詳しくは、[こちらの素晴らしいチュートリアル](https://learnopencv.com/optical-flow-in-opencv/)をご覧ください。\n", + "光学フローについてさらに詳しくは、[この素晴らしいチュートリアル](https://learnopencv.com/optical-flow-in-opencv/)をご覧ください。\n", "\n", - "では、フレーム間の密な光学フローを計算してみましょう。\n" + "それでは、フレーム間の密な光学フローを計算してみましょう。\n" ] }, { @@ -689,7 +689,7 @@ "source": [ "各フレームにおいて、フローはフレームの次元と、光学フローのベクトルのxおよびy成分に対応する2つのチャンネルを持っています。\n", "\n", - "2Dで光学フローを表示するのは少し難しいですが、ここで一つの巧妙なアイデアを使うことができます。光学フローを極座標に変換すると、各ピクセルに対して2つの成分、つまり「方向」と「強度」を得ることができます。強度はピクセルの明るさで表し、方向は異なる色で表現することができます。これを実現するために、[HSV(色相-彩度-明度)カラースペース](https://en.wikipedia.org/wiki/HSV_color_space)で画像を作成します。ここで、色相は方向、明度は強度、彩度は255で定義されます。\n" + "光学フローを2Dで表示するのは少し難しいですが、賢いアイデアを使うことができます。光学フローを極座標に変換すると、各ピクセルに対して2つの成分、つまり「方向」と「強度」を得ることができます。強度はピクセルの明るさで表し、方向は異なる色で表すことができます。[HSV(色相-彩度-明度)カラースペース](https://en.wikipedia.org/wiki/HSV_color_space)で画像を作成し、色相を方向、明度を強度、彩度を255として定義します。\n" ] }, { @@ -738,16 +738,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "そのフレームでは、緑が左への動きを示し、青が右への動きを示しています。\n", + "そのフレームでは、緑がかった色は左への移動を、青は右への移動を表しています。\n", "\n", - "オプティカルフローは、動きの全体的な方向について結論を導くための優れたツールとなります。例えば、フレーム内のすべてのピクセルがほぼ同じ方向に動いている場合、カメラの動きがあると判断し、それを補正する方法を検討することができます。\n" + "オプティカルフローは、動きの全体的な方向について結論を導くための優れたツールとなります。例えば、フレーム内のすべてのピクセルがほぼ同じ方向に動いているのが分かれば、カメラが移動していると結論付けることができ、それを補正する方法を試みることができます。\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**免責事項**: \nこの文書は、AI翻訳サービス [Co-op Translator](https://github.com/Azure/co-op-translator) を使用して翻訳されています。正確性を追求しておりますが、自動翻訳には誤りや不正確な部分が含まれる可能性があることをご承知ください。元の言語で記載された文書が正式な情報源とみなされるべきです。重要な情報については、専門の人間による翻訳を推奨します。この翻訳の使用に起因する誤解や誤った解釈について、当方は責任を負いません。\n" + "\n---\n\n**免責事項**: \nこの文書は、AI翻訳サービス [Co-op Translator](https://github.com/Azure/co-op-translator) を使用して翻訳されています。正確性を追求しておりますが、自動翻訳には誤りや不正確な表現が含まれる可能性があります。元の言語で記載された原文を公式な情報源としてご参照ください。重要な情報については、専門の人間による翻訳を推奨します。本翻訳の利用により生じた誤解や誤認について、当方は一切の責任を負いかねます。\n" ] } ], @@ -774,8 +774,8 @@ }, "orig_nbformat": 4, "coopTranslator": { - "original_hash": "ad5bdca62175c7a3d4336ef8c761aef3", - "translation_date": "2025-08-30T09:19:44+00:00", + "original_hash": "339b2129f86b24024393ff92b8bd376f", + "translation_date": "2025-09-07T14:57:35+00:00", "source_file": "lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb", "language_code": "ja" } diff --git a/translations/ko/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb b/translations/ko/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb index d07b1e03..325cd22a 100644 --- a/translations/ko/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb +++ b/translations/ko/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb @@ -12,7 +12,7 @@ "\n", "이 노트북에서는 OpenCV를 사용하는 몇 가지 예제를 제공합니다. 더 자세한 내용은 [Learn OpenCV](https://learnopencv.com/getting-started-with-opencv/) 온라인 코스를 방문해 보세요.\n", "\n", - "먼저, `cv2`와 몇 가지 유용한 라이브러리를 가져와 봅시다:\n" + "먼저, `cv2`와 몇 가지 유용한 라이브러리를 `import`해 보겠습니다:\n" ] }, { @@ -42,11 +42,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## 이미지 로드하기\n", + "## 이미지 불러오기\n", "\n", - "Python에서 이미지는 NumPy 배열로 간편하게 표현할 수 있습니다. 예를 들어, 320x200 픽셀 크기의 그레이스케일 이미지는 200x320 배열에 저장되며, 동일한 크기의 컬러 이미지는 200x320x3 형태를 가지게 됩니다 (3개의 색상 채널 때문입니다).\n", + "Python에서는 이미지를 NumPy 배열로 간편하게 표현할 수 있습니다. 예를 들어, 320x200 픽셀 크기의 흑백 이미지는 200x320 배열로 저장되며, 동일한 크기의 컬러 이미지는 200x320x3 형태로 저장됩니다 (3개의 색상 채널을 위해).\n", "\n", - "이미지를 로드하는 것부터 시작해봅시다:\n" + "이미지를 불러오는 것부터 시작해봅시다:\n" ] }, { @@ -135,7 +135,7 @@ "source": [ "bw_im = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)\n", "print(bw_im.shape)\n", - "plt.imshow(bw_im)" + "plt.imshow(bw_im, cmap='gray')" ] }, { @@ -144,9 +144,9 @@ "source": [ "## 점자 이미지 처리\n", "\n", - "텍스트를 인식하기 위해 이미지 분류를 적용하려면, 개별 기호를 잘라내어 이전에 보았던 MNIST 이미지와 유사하게 만들어야 합니다. 이는 [객체 탐지](../11-ObjectDetection/README.md) 기술을 사용하여 수행할 수 있으며, 이에 대해서는 나중에 논의할 예정입니다. 하지만 순수한 컴퓨터 비전을 사용해 시도해볼 수도 있습니다. 컴퓨터 비전을 사용하여 문자를 분리하는 방법에 대한 좋은 설명은 [이 블로그 게시물](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/)에서 찾을 수 있습니다. 여기서는 일부 컴퓨터 비전 기술에만 초점을 맞추겠습니다.\n", + "텍스트를 인식하기 위해 이미지 분류를 적용하려면, 개별 기호를 잘라내어 이전에 본 MNIST 이미지와 유사하게 만들어야 합니다. 이는 [객체 감지](../11-ObjectDetection/README.md) 기술을 사용하여 수행할 수 있으며, 나중에 이에 대해 논의할 예정입니다. 하지만 순수한 컴퓨터 비전을 사용해도 시도해볼 수 있습니다. 컴퓨터 비전을 사용하여 문자 분리를 수행하는 방법에 대한 좋은 설명은 [이 블로그 게시물](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/)에서 찾을 수 있습니다. 여기서는 일부 컴퓨터 비전 기술에만 집중하겠습니다.\n", "\n", - "먼저, 이미지를 조금 개선해 보겠습니다. **임계값 처리(thresholding)** 아이디어를 사용할 수 있습니다(이 방법은 [이 OpenCV 기사](https://docs.opencv.org/4.x/d7/d4d/tutorial_py_thresholding.html)에 잘 설명되어 있습니다):\n" + "먼저 이미지를 약간 개선해 보겠습니다. **임계값 처리** 아이디어를 사용할 수 있습니다(이 기술은 [OpenCV 기사](https://docs.opencv.org/4.x/d7/d4d/tutorial_py_thresholding.html)에 잘 설명되어 있습니다):\n" ] }, { @@ -293,7 +293,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "또한, 이 텍스트는 부분적으로 회전될 수 있으며, 완벽하게 정렬하기 위해 **원근 변환**을 수행해야 합니다. 우리는 $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$로 정의된 사각형을 가져와 비례적인 크기를 가진 새로운 이미지에 정렬할 것입니다.\n" + "또한, 이 텍스트는 부분적으로 회전될 수 있으며, 완벽하게 정렬하기 위해 소위 **원근 변환**을 수행해야 합니다. 우리는 점 $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$으로 정의된 사각형을 가져와 비례적인 크기의 새로운 이미지에 맞추어 정렬할 것입니다.\n" ] }, { @@ -340,7 +340,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "이 잘 정렬된 이미지를 얻은 후에는 이를 조각으로 나누는 것이 비교적 쉬울 것입니다:\n" + "이 잘 정렬된 이미지를 얻은 후에는 이를 조각으로 나누는 것이 비교적 쉬울 것입니다.\n" ] }, { @@ -384,7 +384,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "순수한 이미지 처리만으로도 인공지능 없이 많은 작업을 수행할 수 있다는 것을 보았습니다. 컴퓨터 비전 기술을 사용하여 신경망의 작업을 더 간단하게 만들 수 있다면, 반드시 그렇게 해야 합니다. 이는 적은 양의 학습 데이터로 문제를 해결할 수 있도록 해줄 것입니다.\n" + "당신은 인공지능 없이 순수한 이미지 처리만으로도 꽤 많은 작업을 수행할 수 있다는 것을 보았습니다. 만약 컴퓨터 비전 기술을 사용하여 신경망의 작업을 더 간단하게 만들 수 있다면, 반드시 그렇게 해야 합니다. 이는 더 적은 양의 학습 데이터로 문제를 해결할 수 있게 해줄 것입니다.\n" ] }, { @@ -481,9 +481,7 @@ { "cell_type": "markdown", "metadata": {}, - "source": [ - "카메라 앞에서 무슨 일이 일어났는지 보여주는 적절한 이미지를 통해 보고서를 작성하려고 한다고 가정해 봅시다. 이를 위해 우리는 아마도 \"이벤트\"의 시작 프레임과 끝 프레임을 찾아 중간 프레임을 표시하고자 할 것입니다. 일부 노이즈를 제거하기 위해 이동 평균 함수를 사용하여 위의 곡선을 부드럽게 만들 것입니다.\n" - ] + "source": [] }, { "cell_type": "code", @@ -527,7 +525,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "이제 `np.where`를 사용하여 변경량이 임계값을 초과하는 프레임을 찾아낼 수 있으며, 30프레임보다 긴 연속적인 프레임 시퀀스를 추출할 수 있습니다.\n" + "이제 `np.where`를 사용하여 변경량이 임계값을 초과하는 프레임을 찾아낼 수 있으며, 30프레임보다 긴 연속 프레임 시퀀스를 추출할 수 있습니다:\n" ] }, { @@ -562,9 +560,7 @@ { "cell_type": "markdown", "metadata": {}, - "source": [ - "마침내 이미지를 표시할 수 있습니다:\n" - ] + "source": [] }, { "cell_type": "code", @@ -602,7 +598,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "이미지의 색상 구성표가 올바르지 않게 보일 수 있습니다! 이는 역사적인 이유로 OpenCV가 이미지를 BGR 색상 공간으로 로드하는 반면, matplotlib은 더 전통적인 RGB 색상 순서를 사용하기 때문입니다. 대부분의 경우 이미지를 로드한 직후 RGB로 변환하는 것이 합리적입니다.\n" + "이미지의 색상 구성표가 올바르지 않게 보일 수 있습니다! 이는 역사적인 이유로 OpenCV가 이미지를 BGR 색상 공간으로 로드하는 반면, matplotlib는 더 전통적인 RGB 색상 순서를 사용하기 때문입니다. 대부분의 경우 이미지를 로드한 직후 RGB로 변환하는 것이 합리적입니다.\n" ] }, { @@ -732,14 +728,14 @@ "source": [ "따라서 이러한 프레임에서 녹색은 왼쪽으로 이동하는 것을 나타내고, 파란색은 오른쪽으로 이동하는 것을 나타냅니다.\n", "\n", - "광학 흐름은 움직임의 일반적인 방향에 대해 결론을 도출하는 데 매우 유용한 도구가 될 수 있습니다. 예를 들어, 프레임의 모든 픽셀이 대체로 한 방향으로 움직이고 있다면, 카메라가 움직이고 있다는 결론을 내릴 수 있으며 이를 보정하려고 시도할 수 있습니다.\n" + "광학 흐름은 움직임의 일반적인 방향에 대해 결론을 도출하는 데 훌륭한 도구가 될 수 있습니다. 예를 들어, 프레임의 모든 픽셀이 대체로 한 방향으로 움직이고 있다면, 카메라 움직임이 있다는 결론을 내릴 수 있으며 이를 보정하려고 시도할 수 있습니다.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**면책 조항**: \n이 문서는 AI 번역 서비스 [Co-op Translator](https://github.com/Azure/co-op-translator)를 사용하여 번역되었습니다. 정확성을 위해 최선을 다하고 있지만, 자동 번역에는 오류나 부정확성이 포함될 수 있습니다. 원본 문서를 해당 언어로 작성된 상태에서 권위 있는 자료로 간주해야 합니다. 중요한 정보의 경우, 전문적인 인간 번역을 권장합니다. 이 번역 사용으로 인해 발생하는 오해나 잘못된 해석에 대해 당사는 책임을 지지 않습니다.\n" + "\n---\n\n**면책 조항**: \n이 문서는 AI 번역 서비스 [Co-op Translator](https://github.com/Azure/co-op-translator)를 사용하여 번역되었습니다. 정확성을 위해 최선을 다하고 있으나, 자동 번역에는 오류나 부정확성이 포함될 수 있습니다. 원본 문서를 해당 언어로 작성된 상태에서 권위 있는 자료로 간주해야 합니다. 중요한 정보의 경우, 전문적인 인간 번역을 권장합니다. 이 번역 사용으로 인해 발생할 수 있는 오해나 잘못된 해석에 대해 당사는 책임을 지지 않습니다. \n" ] } ], @@ -766,8 +762,8 @@ }, "orig_nbformat": 4, "coopTranslator": { - "original_hash": "ad5bdca62175c7a3d4336ef8c761aef3", - "translation_date": "2025-08-31T12:54:55+00:00", + "original_hash": "339b2129f86b24024393ff92b8bd376f", + "translation_date": "2025-09-07T14:58:16+00:00", "source_file": "lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb", "language_code": "ko" } diff --git a/translations/lt/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb b/translations/lt/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb index 92be70be..cc5269d5 100644 --- a/translations/lt/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb +++ b/translations/lt/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb @@ -6,13 +6,13 @@ "source": [ "# Kompiuterinis matymas ir OpenCV\n", "\n", - "Šis užrašų sąsiuvinis yra dalis [AI pradedantiesiems mokymo programos](http://aka.ms/ai-beginners).\n", + "Šis užrašų knygelė yra dalis [AI for Beginners Curriculum](http://aka.ms/ai-beginners).\n", "\n", - "[OpenCV](https://opencv.org/) laikomas *de facto* standartu vaizdų apdorojimui. Jame yra daug naudingų algoritmų, įgyvendintų C++ kalba. OpenCV taip pat galima naudoti su Python.\n", + "[OpenCV](https://opencv.org/) laikomas *de facto* standartu vaizdų apdorojimui. Jame yra daugybė naudingų algoritmų, įgyvendintų C++ kalba. OpenCV taip pat galima naudoti su Python.\n", "\n", - "Šiame užrašų sąsiuvinyje pateiksime keletą pavyzdžių, kaip naudoti OpenCV. Daugiau informacijos galite rasti internetiniame kurse [Learn OpenCV](https://learnopencv.com/getting-started-with-opencv/).\n", + "Šioje užrašų knygelėje pateiksime keletą pavyzdžių, kaip naudoti OpenCV. Daugiau informacijos galite rasti internetiniame kurse [Learn OpenCV](https://learnopencv.com/getting-started-with-opencv/).\n", "\n", - "Pirmiausia, `importuokime cv2`, taip pat keletą kitų naudingų bibliotekų:\n" + "Pirmiausia, `importuojame cv2`, taip pat keletą kitų naudingų bibliotekų:\n" ] }, { @@ -44,7 +44,7 @@ "source": [ "## Vaizdų įkėlimas\n", "\n", - "Vaizdus Python'e galima patogiai atvaizduoti naudojant NumPy masyvus. Pavyzdžiui, pilkų atspalvių vaizdas, kurio dydis yra 320x200 pikselių, būtų saugomas 200x320 masyve, o spalvotas vaizdas su tais pačiais matmenimis turėtų formą 200x320x3 (3 spalvų kanalams).\n", + "Vaizdus Python'e patogu atvaizduoti naudojant NumPy masyvus. Pavyzdžiui, pilkų atspalvių vaizdas, kurio dydis yra 320x200 pikselių, būtų saugomas 200x320 masyve, o spalvotas vaizdas su tais pačiais matmenimis turėtų formą 200x320x3 (3 spalvų kanalams).\n", "\n", "Pradėkime nuo vaizdo įkėlimo:\n" ] @@ -94,7 +94,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Kaip matote, tai yra Brailio teksto vaizdas. Kadangi mums nėra labai svarbi tikroji spalva, galime jį konvertuoti į juodai baltą:\n" + "Kaip matote, tai yra Brailio rašto vaizdas. Kadangi mums nėra labai svarbi tikroji spalva, galime jį konvertuoti į juodai baltą:\n" ] }, { @@ -135,7 +135,7 @@ "source": [ "bw_im = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)\n", "print(bw_im.shape)\n", - "plt.imshow(bw_im)" + "plt.imshow(bw_im, cmap='gray')" ] }, { @@ -144,7 +144,7 @@ "source": [ "## Brailio vaizdų apdorojimas\n", "\n", - "Jei norime taikyti vaizdų klasifikaciją tekstui atpažinti, turime iškirpti atskirus simbolius, kad jie būtų panašūs į MNIST vaizdus, kuriuos jau matėme anksčiau. Tai galima padaryti naudojant [objektų aptikimo](../11-ObjectDetection/README.md) techniką, apie kurią kalbėsime vėliau, tačiau taip pat galime pabandyti tam panaudoti gryną kompiuterinį matymą. Geras aprašymas, kaip kompiuterinis matymas gali būti naudojamas simbolių atskyrimui, pateiktas [šiame tinklaraščio įraše](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) – mes čia susitelksime tik į kai kurias kompiuterinio matymo technikas.\n", + "Jei norime taikyti vaizdų klasifikaciją tekstui atpažinti, turime iškirpti atskirus simbolius, kad jie būtų panašūs į MNIST vaizdus, kuriuos jau matėme anksčiau. Tai galima padaryti naudojant [objektų aptikimo](../11-ObjectDetection/README.md) techniką, apie kurią kalbėsime vėliau, tačiau taip pat galime pabandyti tam panaudoti gryną kompiuterinį matymą. Geras aprašymas, kaip kompiuterinis matymas gali būti naudojamas simbolių atskyrimui, pateiktas [šiame tinklaraščio įraše](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) - mes čia susitelksime tik į kai kurias kompiuterinio matymo technikas.\n", "\n", "Pirmiausia pabandykime šiek tiek patobulinti vaizdą. Galime pasinaudoti **slenksčio nustatymo** idėja (gerai aprašyta [šiame OpenCV straipsnyje](https://docs.opencv.org/4.x/d7/d4d/tutorial_py_thresholding.html)):\n" ] @@ -192,7 +192,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Norėdami dirbti su vaizdais, turime „išgauti“ atskirus taškus, t. y. konvertuoti vaizdus į atskirų taškų koordinačių rinkinį. Tai galime padaryti naudodami **požymių išskyrimo** technikas, tokias kaip SIFT, SURF arba [ORB](https://docs.opencv.org/4.x/d1/d89/tutorial_py_orb.html):\n" + "Norėdami dirbti su vaizdais, turime „išgauti“ atskirus taškus, t. y. konvertuoti vaizdus į atskirų taškų koordinačių rinkinį. Tai galime padaryti naudodami **bruožų išgavimo** metodus, tokius kaip SIFT, SURF arba [ORB](https://docs.opencv.org/4.x/d1/d89/tutorial_py_orb.html):\n" ] }, { @@ -252,7 +252,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Norėdami atskirti atskirus simbolius, turime žinoti viso teksto ribinį langelį. Norėdami tai sužinoti, galime tiesiog apskaičiuoti minimalius ir maksimalius koordinates:\n" + "Norėdami atskirti atskirus simbolius, turime žinoti viso teksto ribinį langelį. Norėdami tai sužinoti, galime tiesiog apskaičiuoti minimalią ir maksimalią koordinates:\n" ] }, { @@ -293,7 +293,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Taip pat šis tekstas gali būti iš dalies pasuktas, ir norint jį tobulai sulygiuoti, turime atlikti vadinamąją **perspektyvos transformaciją**. Mes paimsime stačiakampį, apibrėžtą taškais $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ ir sulyginsime jį su nauju vaizdu, turinčiu proporcingus matmenis:\n" + "Taip pat šis tekstas gali būti iš dalies pasuktas, ir norint jį tobulai sulygiuoti, turime atlikti vadinamąją **perspektyvos transformaciją**. Mes paimsime stačiakampį, apibrėžtą taškais $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ ir sulygiuosime jį su nauju vaizdu proporcingais matmenimis:\n" ] }, { @@ -340,7 +340,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Po to, kai gausime gerai suderintą vaizdą, turėtų būti gana lengva jį supjaustyti į dalis:\n" + "Po to, kai gausime gerai suderintą vaizdą, jį turėtų būti gana lengva suskirstyti į dalis:\n" ] }, { @@ -384,7 +384,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Jūs matėte, kad gana daug užduočių galima atlikti naudojant gryną vaizdų apdorojimą, be jokio dirbtinio intelekto. Jei galime naudoti kompiuterinio matymo metodus, kad neuroninio tinklo darbas būtų paprastesnis, tikrai turėtume tai daryti, nes tai leis mums spręsti problemas su mažesniu mokymo duomenų kiekiu.\n" + "Jūs matėte, kad gana daug užduočių galima atlikti naudojant tik vaizdų apdorojimą, be jokio dirbtinio intelekto. Jei galime naudoti kompiuterinio matymo metodus, kad palengvintume neuroninio tinklo darbą – tikrai turėtume tai daryti, nes tai leis spręsti problemas su mažesniu mokymo duomenų kiekiu.\n" ] }, { @@ -393,11 +393,11 @@ "source": [ "## Judesio aptikimas naudojant kadrų skirtumą\n", "\n", - "Judesio aptikimas vaizdo sraute yra labai dažna užduotis. Pavyzdžiui, tai leidžia mums gauti įspėjimus, kai kažkas vyksta stebėjimo kameroje. Jei norime suprasti, kas vyksta kameroje, galime naudoti neuroninį tinklą – tačiau naudoti neuroninį tinklą yra daug pigiau, kai žinome, kad kažkas vyksta.\n", + "Judesio aptikimas vaizdo sraute yra labai dažna užduotis. Pavyzdžiui, tai leidžia mums gauti pranešimus, kai kažkas vyksta stebėjimo kameroje. Jei norime suprasti, kas vyksta kameroje, galime naudoti neuroninį tinklą – tačiau neuroninį tinklą naudoti yra daug pigiau, kai žinome, kad kažkas vyksta.\n", "\n", - "Pagrindinė judesio aptikimo idėja yra paprasta. Jei kamera yra fiksuota, tuomet kameros kadrai turėtų būti gana panašūs vienas į kitą. Kadangi kadrai yra pateikiami kaip masyvai, tiesiog atimant šiuos masyvus iš dviejų iš eilės einančių kadrų, gausime pikselių skirtumą, kuris turėtų būti mažas statiniams kadrams ir padidėti, kai vaizde vyksta reikšmingas judesys.\n", + "Pagrindinė judesio aptikimo idėja yra paprasta. Jei kamera yra fiksuota, tuomet kameros kadrai turėtų būti gana panašūs vienas į kitą. Kadangi kadrai pateikiami kaip masyvai, tiesiog atimant šiuos masyvus iš dviejų iš eilės einančių kadrų, gausime pikselių skirtumą, kuris turėtų būti mažas statiniams kadrams ir tapti didesnis, kai vaizde vyksta reikšmingas judesys.\n", "\n", - "Pradėsime mokydamiesi, kaip atidaryti vaizdo įrašą ir paversti jį kadrų seka:\n" + "Pradėsime mokytis, kaip atidaryti vaizdo įrašą ir paversti jį kadrų seka:\n" ] }, { @@ -490,7 +490,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Tarkime, norime sukurti ataskaitą, kuri parodytų, kas įvyko priešais kamerą, kiekvieną kartą rodant tinkamą vaizdą, kai kažkas įvyksta. Tam tikriausiai norėsime nustatyti „įvykio“ pradžios ir pabaigos kadrą ir parodyti vidurinį kadrą. Norėdami pašalinti tam tikrą triukšmą, taip pat išlyginsime aukščiau esančią kreivę naudodami slankiojo vidurkio funkciją:\n" + "Tarkime, norime sukurti ataskaitą, kuri parodytų, kas įvyko priešais kamerą, kiekvieną kartą rodydama tinkamą vaizdą, kai kažkas įvyksta. Tam tikriausiai norėsime nustatyti „įvykio“ pradžios ir pabaigos kadrą ir parodyti vidurinį kadrą. Norėdami pašalinti tam tikrą triukšmą, taip pat išlyginsime aukščiau esančią kreivę naudodami slankiojo vidurkio funkciją:\n" ] }, { @@ -535,7 +535,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Dabar galime rasti kadrus, kuriuose pokyčių kiekis viršija slenkstį, naudodami `np.where`, ir išgauti ilgesnę nei 30 kadrų nuoseklią kadrų seką:\n" + "Dabar galime rasti kadrus, kuriuose pokyčių kiekis viršija slenkstį, naudodami `np.where`, ir išgauti ilgesnę nei 30 kadrų iš eilės einančių kadrų seką:\n" ] }, { @@ -610,7 +610,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Jūs galite pastebėti, kad šios nuotraukos spalvų schema atrodo neteisinga! Taip yra todėl, kad OpenCV dėl istorinių priežasčių įkelia vaizdus BGR spalvų erdvėje, o matplotlib naudoja tradiciškesnę RGB spalvų tvarką. Dažniausiai prasminga konvertuoti vaizdus į RGB iškart po jų įkėlimo.\n" + "Jūs galite pastebėti, kad šios nuotraukos spalvų schema atrodo neteisinga! Taip yra todėl, kad OpenCV dėl istorinių priežasčių įkelia vaizdus BGR spalvų erdvėje, o matplotlib naudoja tradiciškesnę RGB spalvų tvarką. Dažniausiai verta vaizdus konvertuoti į RGB iškart po jų įkėlimo.\n" ] }, { @@ -653,12 +653,12 @@ "\n", "Nors tiesiog lyginant du iš eilės einančius kadrus galima pamatyti pokyčių kiekį, tai nesuteikia informacijos apie tai, kas iš tikrųjų juda ir kur. Norint gauti tokią informaciją, naudojama technika, vadinama **[optiniu srautu](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)**:\n", "\n", - "* **Tankus optinis srautas** apskaičiuoja vektorinį lauką, kuris parodo, kur kiekvienas pikselis juda.\n", - "* **Retas optinis srautas** remiasi tam tikrų išskirtinių vaizdo elementų (pvz., kraštų) paėmimu ir jų trajektorijos sudarymu nuo kadro iki kadro.\n", + "* **Tankusis optinis srautas** apskaičiuoja vektorių lauką, kuris parodo, kur juda kiekvienas pikselis\n", + "* **Retasis optinis srautas** remiasi tam tikrų išskirtinių vaizdo bruožų (pvz., kraštų) paėmimu ir jų trajektorijos sudarymu nuo kadro iki kadro.\n", "\n", "Plačiau apie optinį srautą skaitykite [šiame puikiame vadove](https://learnopencv.com/optical-flow-in-opencv/).\n", "\n", - "Apskaičiuokime tankų optinį srautą tarp mūsų kadrų:\n" + "Apskaičiuokime tankųjį optinį srautą tarp mūsų kadrų:\n" ] }, { @@ -687,9 +687,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Kaip matote, kiekvienam kadrui srautas turi kadro matmenis ir 2 kanalus, atitinkančius optinio srauto vektoriaus x ir y komponentes.\n", + "Kaip matote, kiekvienam kadrui srautas turi kadro dimensiją ir 2 kanalus, atitinkančius optinio srauto vektoriaus x ir y komponentus.\n", "\n", - "Optinio srauto atvaizdavimas 2D erdvėje yra šiek tiek sudėtingas, tačiau galime pasinaudoti viena sumania idėja. Jei optinį srautą konvertuosime į poliarines koordinatės, tuomet kiekvienam pikseliui gausime du komponentus: *kryptį* ir *intensyvumą*. Intensyvumą galime atvaizduoti pikselio intensyvumu, o kryptį – skirtingomis spalvomis. Sukursime vaizdą [HSV (atspalvis-sodrumas-šviesumas) spalvų erdvėje](https://en.wikipedia.org/wiki/HSV_color_space), kur atspalvis bus apibrėžtas kryptimi, šviesumas – intensyvumu, o sodrumas bus 255.\n" + "Optinio srauto vaizdavimas 2D formatu yra šiek tiek sudėtingas, tačiau galime pasinaudoti viena sumania idėja. Jei optinį srautą konvertuosime į poliarines koordinatas, tuomet kiekvienam pikseliui gausime du komponentus: *kryptį* ir *intensyvumą*. Intensyvumą galime atvaizduoti pikselio intensyvumu, o kryptį - skirtingomis spalvomis. Sukursime vaizdą [HSV (Atspalvis-Sodrumas-Vertė) spalvų erdvėje](https://en.wikipedia.org/wiki/HSV_color_space), kur atspalvis bus apibrėžtas kryptimi, vertė - intensyvumu, o sodrumas bus 255.\n" ] }, { @@ -774,8 +774,8 @@ }, "orig_nbformat": 4, "coopTranslator": { - "original_hash": "ad5bdca62175c7a3d4336ef8c761aef3", - "translation_date": "2025-08-31T12:55:50+00:00", + "original_hash": "339b2129f86b24024393ff92b8bd376f", + "translation_date": "2025-09-07T15:24:05+00:00", "source_file": "lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb", "language_code": "lt" } diff --git a/translations/mo/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb b/translations/mo/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb index d4604e37..c58449e8 100644 --- a/translations/mo/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb +++ b/translations/mo/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb @@ -42,11 +42,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## 加載圖片\n", + "## 載入圖片\n", "\n", - "在 Python 中,圖片可以方便地用 NumPy 陣列來表示。例如,大小為 320x200 像素的灰度圖片會存儲在 200x320 的陣列中,而相同尺寸的彩色圖片則會有 200x320x3 的形狀(代表 3 個色彩通道)。\n", + "在 Python 中,圖片可以方便地用 NumPy 陣列來表示。例如,一張 320x200 像素的灰階圖片會儲存在一個 200x320 的陣列中,而相同尺寸的彩色圖片則會有 200x320x3 的形狀(對應 3 個色彩通道)。\n", "\n", - "我們先來加載一張圖片:\n" + "我們先從載入一張圖片開始:\n" ] }, { @@ -94,7 +94,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "如您所見,這是一張盲文文字的圖片。由於我們對實際顏色並不太感興趣,因此我們可以將其轉換為黑白:\n" + "正如你所見,這是一張盲文的圖片。由於我們對實際顏色不是很感興趣,我們可以將其轉換為黑白:\n" ] }, { @@ -135,7 +135,7 @@ "source": [ "bw_im = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)\n", "print(bw_im.shape)\n", - "plt.imshow(bw_im)" + "plt.imshow(bw_im, cmap='gray')" ] }, { @@ -144,9 +144,9 @@ "source": [ "## 點字影像處理\n", "\n", - "如果我們想要應用影像分類來辨識文字,就需要將每個符號單獨切割出來,使其看起來像我們之前見過的 MNIST 圖像。這可以透過 [物件偵測](../11-ObjectDetection/README.md) 技術來完成,我們稍後會討論這部分,但我們也可以嘗試使用純粹的電腦視覺來達成。關於如何使用電腦視覺進行字符分離的良好描述可以在 [這篇部落格文章](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) 中找到——在這裡我們只會專注於一些電腦視覺技術。\n", + "如果我們想要應用影像分類來辨識文字,就需要將每個符號單獨切割出來,使其類似於我們之前見過的 MNIST 圖像。這可以透過 [物件偵測](../11-ObjectDetection/README.md) 技術來完成,我們稍後會討論這個方法,但我們也可以嘗試僅使用純粹的電腦視覺技術來達成目標。一個關於如何使用電腦視覺進行字符分離的良好描述可以參考[這篇部落格文章](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/)——在這裡我們只會專注於一些電腦視覺技術。\n", "\n", - "首先,讓我們嘗試稍微增強影像。我們可以使用 **閾值處理** 的概念(在 [這篇 OpenCV 文章](https://docs.opencv.org/4.x/d7/d4d/tutorial_py_thresholding.html) 中有詳細描述):\n" + "首先,我們來嘗試稍微增強影像。我們可以使用 **閾值處理** 的概念([這篇 OpenCV 文章](https://docs.opencv.org/4.x/d7/d4d/tutorial_py_thresholding.html)中有詳細說明):\n" ] }, { @@ -192,7 +192,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "要處理圖像,我們需要「提取」單個點,即將圖像轉換為單個點的坐標集。我們可以使用**特徵提取**技術來完成,例如 SIFT、SURF 或 [ORB](https://docs.opencv.org/4.x/d1/d89/tutorial_py_orb.html):\n" + "要處理圖像,我們需要「提取」單個點,即將圖像轉換為單個點的座標集。我們可以使用**特徵提取**技術來完成,例如 SIFT、SURF 或 [ORB](https://docs.opencv.org/4.x/d1/d89/tutorial_py_orb.html):\n" ] }, { @@ -293,7 +293,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "此外,此文本可以部分旋轉,為了使其完美對齊,我們需要進行所謂的**透視變換**。我們將取由點 $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ 定義的矩形,並將其與具有比例尺寸的新圖像對齊:\n" + "此外,此文本可以部分旋轉,為了使其完美對齊,我們需要進行所謂的**透視變換**。我們將取由點 $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ 定義的矩形,並將其與具有相同比例尺寸的新圖像對齊:\n" ] }, { @@ -340,7 +340,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "在我們獲得這個對齊良好的圖像後,將其切成片應該相對容易:\n" + "在我們獲得這張對齊良好的圖像後,將其切成多個部分應該相對容易:\n" ] }, { @@ -384,20 +384,20 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "您已看到許多任務可以僅使用純圖像處理完成,而無需任何人工智慧。如果我們能使用計算機視覺技術使神經網絡的工作更簡單——我們絕對應該這樣做,因為這將使我們能夠用更少的訓練數據解決問題。\n" + "您已經看到,許多任務可以僅使用純圖像處理來完成,而無需任何人工智能。如果我們能夠使用計算機視覺技術來簡化神經網絡的工作,我們絕對應該這樣做,因為這將使我們能夠用更少的訓練數據來解決問題。\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## 使用幀差進行運動檢測\n", + "## 使用幀差進行動作偵測\n", "\n", - "在視頻流中檢測運動是一個非常常見的任務。例如,當監控攝像頭捕捉到某些事件時,我們可以收到警報。如果我們想了解攝像頭中發生了什麼,可以使用神經網絡來分析——但當我們已經知道有事情發生時,使用神經網絡的成本會更低。\n", + "在視頻流中偵測動作是一項非常常見的任務。例如,當監控攝像機上有事情發生時,它可以讓我們收到警報。如果我們想了解攝像機上發生了什麼,可以使用神經網絡進行分析——但當我們已經知道有事情正在發生時,使用神經網絡的成本會更低。\n", "\n", - "運動檢測的主要概念很簡單。如果攝像頭是固定的,那麼攝像頭捕捉的幀應該彼此非常相似。由於幀是以數組的形式表示的,只需對兩個連續幀的數組進行相減,就可以得到像素差異。對於靜止的幀,像素差異應該很小,而當圖像中有明顯運動時,像素差異會變大。\n", + "動作偵測的主要概念非常簡單。如果攝像機是固定的,那麼攝像機捕捉的幀應該彼此非常相似。由於幀是以數組的形式表示,我們只需將兩個連續幀的數組相減,就能得到像素差異。對於靜態幀,像素差異應該很低,而當圖像中有顯著動作時,像素差異就會變高。\n", "\n", - "我們將從學習如何打開一個視頻並將其轉換為幀序列開始:\n" + "我們將從學習如何打開視頻並將其轉換為幀序列開始:\n" ] }, { @@ -445,7 +445,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "由於顏色對於動作檢測並不重要,我們將所有幀轉換為灰階。然後,我們將計算幀差異,並繪製它們的範數以直觀地查看活動量:\n" + "由於顏色對於動作檢測並不重要,我們將所有幀轉換為灰度。然後,我們將計算幀差異,並繪製它們的範數,以直觀地查看活動量:\n" ] }, { @@ -490,7 +490,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "假設我們想要製作一份報告,顯示每次有事情發生時相機前的情況,並展示適合的圖像。為了做到這一點,我們可能需要找出「事件」的開始和結束幀,並顯示中間幀。為了去除一些噪音,我們還將使用移動平均函數來平滑曲線:\n" + "假設我們想要製作一份報告,通過顯示每次發生事件時的適當圖像來展示攝像機前發生的事情。為了做到這一點,我們可能需要找出一個「事件」的開始和結束幀,並顯示中間幀。為了去除一些噪音,我們還將使用移動平均函數來平滑上方的曲線:\n" ] }, { @@ -651,8 +651,8 @@ "\n", "僅僅比較兩個連續的影格可以讓我們看到變化的程度,但無法提供實際移動的物體以及其位置的資訊。為了獲得這些資訊,有一種技術叫做 **[光流](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)**:\n", "\n", - "* **密集光流** 計算每個像素的向量場,顯示其移動方向\n", - "* **稀疏光流** 基於選取影像中的一些顯著特徵(例如邊緣),並從影格到影格建立它們的軌跡。\n", + "* **密集光流** 計算每個像素的向量場,顯示它的移動方向\n", + "* **稀疏光流** 則基於圖像中的一些顯著特徵(例如邊緣),並從影格到影格建立它們的軌跡。\n", "\n", "可以在這篇[精彩的教程](https://learnopencv.com/optical-flow-in-opencv/)中了解更多關於光流的內容。\n", "\n", @@ -687,7 +687,7 @@ "source": [ "如你所見,每個框架的光流具有框架的維度,以及兩個通道,分別對應光流向量的 x 和 y 分量。\n", "\n", - "在 2D 中顯示光流有些挑戰,但我們可以使用一個巧妙的想法。如果我們將光流轉換為極座標,那麼每個像素就會有兩個分量:*方向* 和 *強度*。我們可以用像素的亮度來表示強度,用不同的顏色來表示方向。我們將創建一個 [HSV(色相-飽和度-亮度)色彩空間](https://en.wikipedia.org/wiki/HSV_color_space) 的圖像,其中色相由方向定義,亮度由強度定義,飽和度則設為 255。\n" + "在 2D 中顯示光流有些挑戰,但我們可以使用一個巧妙的想法。如果我們將光流轉換為極座標,那麼每個像素就會有兩個分量:*方向* 和 *強度*。我們可以用像素的亮度來表示強度,用不同的顏色來表示方向。我們將創建一個 [HSV(色相-飽和度-亮度)色彩空間](https://en.wikipedia.org/wiki/HSV_color_space) 的圖像,其中色相由方向定義,亮度由強度定義,而飽和度則設為 255。\n" ] }, { @@ -736,16 +736,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "所以,在這些畫面中,綠色代表向左移動,而藍色則代表向右移動。\n", + "所以,在這些畫面中,綠色代表向左移動,而藍色代表向右移動。\n", "\n", - "光流是一個很棒的工具,可以用來推斷整體的移動方向。例如,如果你看到畫面中的所有像素大致上都朝著一個方向移動,你可以推斷這是因為相機在移動,並嘗試進行補償。\n" + "光流可以是一個很好的工具,用來判斷整體的移動方向。例如,如果你看到畫面中的所有像素大致上都朝著一個方向移動——你可以推斷這是相機的移動,並嘗試進行補償。\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**免責聲明**: \n本文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。儘管我們努力確保翻譯的準確性,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於關鍵信息,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或錯誤解釋不承擔責任。\n" + "\n---\n\n**免責聲明**: \n本文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。應以原始語言的文件作為權威來源。對於關鍵資訊,建議尋求專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或錯誤解讀概不負責。\n" ] } ], @@ -772,8 +772,8 @@ }, "orig_nbformat": 4, "coopTranslator": { - "original_hash": "ad5bdca62175c7a3d4336ef8c761aef3", - "translation_date": "2025-08-28T11:09:45+00:00", + "original_hash": "339b2129f86b24024393ff92b8bd376f", + "translation_date": "2025-09-07T14:55:22+00:00", "source_file": "lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb", "language_code": "mo" } diff --git a/translations/mr/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb b/translations/mr/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb index 12923405..bbe0c363 100644 --- a/translations/mr/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb +++ b/translations/mr/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb @@ -4,7 +4,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# संगणक दृष्टि आणि OpenCV\n", + "# संगणकीय दृष्टिकोन आणि OpenCV\n", "\n", "ही नोटबुक [AI for Beginners Curriculum](http://aka.ms/ai-beginners) चा एक भाग आहे.\n", "\n", @@ -12,7 +12,7 @@ "\n", "या नोटबुकमध्ये, आम्ही तुम्हाला OpenCV वापरण्याचे काही उदाहरणे देऊ. अधिक तपशीलांसाठी, तुम्ही [Learn OpenCV](https://learnopencv.com/getting-started-with-opencv/) हा ऑनलाइन कोर्स पाहू शकता.\n", "\n", - "सुरुवातीला, `import cv2` करूया, तसेच इतर काही उपयुक्त लायब्ररी देखील:\n" + "सुरुवातीला, `cv2` आणि इतर काही उपयुक्त लायब्ररी `import` करूया:\n" ] }, { @@ -44,7 +44,7 @@ "source": [ "## प्रतिमा लोड करणे\n", "\n", - "Python मध्ये प्रतिमा सोयीस्करपणे NumPy arrays द्वारे दर्शविल्या जाऊ शकतात. उदाहरणार्थ, 320x200 पिक्सेल आकाराची ग्रेस्केल प्रतिमा 200x320 array मध्ये साठवली जाईल, आणि त्याच परिमाणाची रंगीत प्रतिमा 200x320x3 (3 रंग चॅनेल्ससाठी) अशा स्वरूपात असेल.\n", + "Python मध्ये प्रतिमा सोप्या पद्धतीने NumPy arrays मध्ये सादर करता येतात. उदाहरणार्थ, 320x200 पिक्सल आकाराची ग्रेस्केल प्रतिमा 200x320 array मध्ये साठवली जाईल, आणि त्याच आकाराची रंगीत प्रतिमा 200x320x3 आकाराची असेल (3 रंग चॅनेलसाठी).\n", "\n", "चला प्रतिमा लोड करून सुरुवात करूया:\n" ] @@ -94,7 +94,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "जसे तुम्ही पाहू शकता, हे ब्रेल मजकुराचे चित्र आहे. कारण आम्हाला प्रत्यक्ष रंगामध्ये फारसा रस नाही, त्यामुळे आपण ते काळा-पांढऱ्यामध्ये रूपांतरित करू शकतो:\n" + "जसे तुम्ही पाहू शकता, हे ब्रेल मजकूराचे चित्र आहे. कारण आम्हाला वास्तविक रंगामध्ये फारसा रस नाही, त्यामुळे आपण ते काळा-पांढऱ्यामध्ये रूपांतरित करू शकतो:\n" ] }, { @@ -135,7 +135,7 @@ "source": [ "bw_im = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)\n", "print(bw_im.shape)\n", - "plt.imshow(bw_im)" + "plt.imshow(bw_im, cmap='gray')" ] }, { @@ -144,9 +144,9 @@ "source": [ "## ब्रेल प्रतिमा प्रक्रिया\n", "\n", - "जर आपल्याला प्रतिमा वर्गीकरणाचा उपयोग करून मजकूर ओळखायचा असेल, तर आपल्याला वैयक्तिक चिन्हे वेगळी कापून काढावी लागतील, जेणेकरून ती आपण यापूर्वी पाहिलेल्या MNIST प्रतिमांसारखी दिसतील. हे [ऑब्जेक्ट डिटेक्शन](../11-ObjectDetection/README.md) तंत्राचा वापर करून करता येते, ज्याबद्दल आपण नंतर चर्चा करू, पण आपण त्यासाठी शुद्ध संगणकीय दृष्टिकोनही वापरून पाहू शकतो. संगणकीय दृष्टिकोनाचा वापर करून अक्षरे वेगळी कशी करता येतात याचे एक चांगले वर्णन [या ब्लॉग पोस्टमध्ये](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) सापडेल - येथे आपण केवळ काही संगणकीय दृष्टिकोन तंत्रांवर लक्ष केंद्रित करू.\n", + "जर आपल्याला प्रतिमा वर्गीकरण वापरून मजकूर ओळखायचा असेल, तर आपल्याला वैयक्तिक चिन्हे कापून MNIST प्रतिमांसारखी बनवावी लागतील, ज्या आपण यापूर्वी पाहिल्या आहेत. हे [ऑब्जेक्ट डिटेक्शन](../11-ObjectDetection/README.md) तंत्र वापरून करता येईल, ज्यावर आपण नंतर चर्चा करू, परंतु आपण शुद्ध संगणकीय दृष्टिकोन वापरण्याचा प्रयत्न देखील करू शकतो. संगणकीय दृष्टिकोन वापरून अक्षर वेगळे करण्याची चांगली माहिती [या ब्लॉग पोस्टमध्ये](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) मिळू शकते - येथे आपण काही संगणकीय दृष्टिकोन तंत्रांवर लक्ष केंद्रित करू.\n", "\n", - "सुरुवातीला, प्रतिमेची गुणवत्ता थोडीशी सुधारण्याचा प्रयत्न करूया. आपण **थ्रेशोल्डिंग** या कल्पनेचा वापर करू शकतो (याबद्दल [या OpenCV लेखात](https://docs.opencv.org/4.x/d7/d4d/tutorial_py_thresholding.html) चांगले वर्णन केले आहे):\n" + "सर्वप्रथम, प्रतिमेला थोडेसे सुधारण्याचा प्रयत्न करूया. आपण **थ्रेशोल्डिंग** च्या कल्पनेचा वापर करू शकतो (याबद्दल [या OpenCV लेखात](https://docs.opencv.org/4.x/d7/d4d/tutorial_py_thresholding.html) चांगले वर्णन केले आहे):\n" ] }, { @@ -192,7 +192,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "प्रतिमा कार्य करण्यासाठी, आपल्याला वैयक्तिक ठिपके \"काढणे\" आवश्यक आहे, म्हणजेच प्रतिमांना वैयक्तिक ठिपक्यांच्या समन्वयांच्या संचामध्ये रूपांतरित करणे आवश्यक आहे. आपण हे **वैशिष्ट्य काढण्याच्या** तंत्रांचा वापर करून करू शकतो, जसे की SIFT, SURF किंवा [ORB](https://docs.opencv.org/4.x/d1/d89/tutorial_py_orb.html):\n" + "प्रतिमा कार्य करण्यासाठी, आपल्याला वैयक्तिक ठिपके \"काढणे\" आवश्यक आहे, म्हणजेच प्रतिमांना वैयक्तिक ठिपक्यांच्या समन्वयांच्या संचामध्ये रूपांतरित करणे आवश्यक आहे. आपण हे **वैशिष्ट्य काढणी** तंत्रांचा वापर करून करू शकतो, जसे की SIFT, SURF किंवा [ORB](https://docs.opencv.org/4.x/d1/d89/tutorial_py_orb.html):\n" ] }, { @@ -252,7 +252,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "एखाद्या मजकुरातील स्वतंत्र अक्षरे वेगळी करण्यासाठी, आपल्याला संपूर्ण मजकुराचा सीमारेषा (बाउंडिंग बॉक्स) माहित असणे आवश्यक आहे. ते शोधण्यासाठी, आपण फक्त किमान आणि कमाल समन्वय (कोऑर्डिनेट्स) गणना करू शकतो:\n" + "वैयक्तिक अक्षरे वेगळी करण्यासाठी, आपल्याला संपूर्ण मजकुराचा सीमारेषा (बाउंडिंग बॉक्स) माहित असणे आवश्यक आहे. ते शोधण्यासाठी, आपण फक्त किमान आणि कमाल समन्वयांची गणना करू शकतो:\n" ] }, { @@ -293,7 +293,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "तसेच, हा मजकूर अंशतः फिरवला जाऊ शकतो, आणि तो परिपूर्णपणे सरळ करण्यासाठी आपल्याला तथाकथित **दृष्टीकोन परिवर्तन** करावे लागेल. आम्ही बिंदूंनी परिभाषित केलेला आयत घेऊ $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ आणि तो नवीन प्रतिमेसोबत प्रमाणबद्ध परिमाणांसह सरळ करू:\n" + "तसेच, हा मजकूर अंशतः फिरवला जाऊ शकतो, आणि तो परिपूर्णपणे संरेखित करण्यासाठी आपल्याला तथाकथित **दृष्टीकोन रूपांतरण** करावे लागेल. आम्ही बिंदूंनी परिभाषित केलेला आयत $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ घेऊ आणि तो समानुपातिक परिमाणांसह नवीन प्रतिमेशी संरेखित करू:\n" ] }, { @@ -387,11 +387,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## फ्रेम फरक वापरून हालचाल शोधणे\n", + "## फ्रेम डिफरन्स वापरून मोशन डिटेक्शन\n", "\n", - "व्हिडिओ प्रवाहावर हालचाल शोधणे ही एक सामान्य कार्यप्रक्रिया आहे. उदाहरणार्थ, यामुळे आपल्याला सुरक्षा कॅमेऱ्यावर काहीतरी घडल्यावर अलर्ट मिळू शकतो. जर आपल्याला कॅमेऱ्यावर काय चालले आहे हे समजून घ्यायचे असेल, तर आपण न्यूरल नेटवर्क वापरू शकतो - परंतु काहीतरी चालू आहे हे माहित असल्यावर न्यूरल नेटवर्क वापरणे अधिक स्वस्त ठरते.\n", + "व्हिडिओ स्ट्रीमवर मोशन डिटेक्ट करणे ही एक सामान्य प्रक्रिया आहे. उदाहरणार्थ, यामुळे आपल्याला सुरक्षा कॅमेऱ्यावर काही घडल्यास अलर्ट मिळू शकतो. जर आपल्याला कॅमेऱ्यावर काय चालले आहे हे समजून घ्यायचे असेल, तर आपण न्यूरल नेटवर्क वापरू शकतो - परंतु काहीतरी चालू आहे हे माहित असल्यावर न्यूरल नेटवर्क वापरणे अधिक स्वस्त ठरते.\n", "\n", - "हालचाल शोधण्याची मुख्य कल्पना सोपी आहे. जर कॅमेरा स्थिर असेल, तर कॅमेऱ्याचे फ्रेम्स एकमेकांशी खूपच समान असावेत. फ्रेम्स अ‍ॅरे स्वरूपात दर्शविल्या जात असल्यामुळे, दोन सलग फ्रेम्ससाठी त्या अ‍ॅरेज वजा करून आपल्याला पिक्सेल फरक मिळतो, जो स्थिर फ्रेम्ससाठी कमी असतो आणि प्रतिमेमध्ये लक्षणीय हालचाल झाल्यावर जास्त होतो.\n", + "मोशन डिटेक्शनची मुख्य कल्पना सोपी आहे. जर कॅमेरा स्थिर असेल, तर कॅमेऱ्याचे फ्रेम्स एकमेकांशी खूपच समान असावेत. फ्रेम्स अ‍ॅरे स्वरूपात सादर केल्या जात असल्यामुळे, दोन सलग फ्रेम्ससाठी त्या अ‍ॅरेज वजा करून आपण पिक्सल फरक मिळवू शकतो, जो स्थिर फ्रेम्ससाठी कमी असतो आणि प्रतिमेमध्ये लक्षणीय हालचाल झाल्यावर जास्त होतो.\n", "\n", "आम्ही व्हिडिओ कसा उघडायचा आणि त्याला फ्रेम्सच्या अनुक्रमात कसे रूपांतरित करायचे हे शिकण्यापासून सुरुवात करू:\n" ] @@ -486,7 +486,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "समजा, आम्हाला असा अहवाल तयार करायचा आहे जो कॅमेऱ्यासमोर काय घडले ते प्रत्येक वेळी योग्य प्रतिमा दाखवून दर्शवेल. हे करण्यासाठी, कदाचित आम्हाला \"घटना\" च्या सुरुवातीचा आणि शेवटचा फ्रेम शोधायचा आहे आणि मधला फ्रेम प्रदर्शित करायचा आहे. काही गोंधळ काढून टाकण्यासाठी, आम्ही वरील वक्र हालचाल सरासरी फंक्शनसह गुळगुळीत करू:\n" + "समजा आम्हाला एक अहवाल तयार करायचा आहे जो कॅमेऱ्यासमोर काय घडले ते योग्य प्रतिमा दाखवून दर्शवेल. ते करण्यासाठी, आम्हाला कदाचित \"इव्हेंट\" च्या सुरुवातीचा आणि शेवटचा फ्रेम शोधायचा आहे आणि मधला फ्रेम प्रदर्शित करायचा आहे. काही गोंगाट काढून टाकण्यासाठी, आम्ही वरच्या वक्राला मूव्हिंग अॅव्हरेज फंक्शनसह गुळगुळीत करू:\n" ] }, { @@ -641,16 +641,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## ऑप्टिकल फ्लो वापरून हालचाल काढा\n", + "## ऑप्टिकल फ्लो वापरून गती काढा\n", "\n", - "जरी दोन सलग फ्रेम्सची तुलना केल्याने बदलांची मात्रा दिसते, तरी त्यातून काय हलत आहे आणि कुठे हलत आहे याची माहिती मिळत नाही. ही माहिती मिळवण्यासाठी, **[ऑप्टिकल फ्लो](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)** नावाची एक तंत्र आहे:\n", + "जरी दोन सलग फ्रेम्सची तुलना केल्याने आपल्याला बदलांची मात्रा दिसते, तरीही त्यातून काय हलत आहे आणि कुठे हलत आहे याची माहिती मिळत नाही. ही माहिती मिळवण्यासाठी **[ऑप्टिकल फ्लो](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)** नावाची एक तंत्र वापरली जाते:\n", "\n", - "* **डेंस ऑप्टिकल फ्लो** प्रत्येक पिक्सेल कुठे हलत आहे हे दाखवणारे व्हेक्टर फील्ड काढते.\n", - "* **स्पार्स ऑप्टिकल फ्लो** प्रतिमेतील काही ठळक वैशिष्ट्ये (उदा. कडा) घेऊन, फ्रेम ते फ्रेम त्यांचा मार्ग तयार करते.\n", + "* **डेंस ऑप्टिकल फ्लो** प्रत्येक पिक्सेल कुठे हलत आहे हे दाखवणारे व्हेक्टर फील्ड तयार करते.\n", + "* **स्पार्स ऑप्टिकल फ्लो** प्रतिमेतील काही ठळक वैशिष्ट्ये (उदा. कडा) घेऊन, फ्रेम ते फ्रेम त्यांचा मार्ग तयार करण्यावर आधारित असते.\n", "\n", - "ऑप्टिकल फ्लोबद्दल अधिक वाचा [या उत्कृष्ट ट्युटोरियलमध्ये](https://learnopencv.com/optical-flow-in-opencv/).\n", + "ऑप्टिकल फ्लोबद्दल अधिक वाचा [या उत्कृष्ट ट्यूटोरियलमध्ये](https://learnopencv.com/optical-flow-in-opencv/).\n", "\n", - "चला, आपल्या फ्रेम्समधील डेंस ऑप्टिकल फ्लो काढूया:\n" + "चला आपल्या फ्रेम्समध्ये डेंस ऑप्टिकल फ्लो काढूया:\n" ] }, { @@ -679,9 +679,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "प्रत्येक फ्रेमसाठी, फ्लो फ्रेमच्या परिमाणासह असतो आणि 2 चॅनेल्स असतात, जे ऑप्टिकल फ्लो व्हेक्टरच्या x आणि y घटकांशी संबंधित असतात.\n", + "प्रत्येक फ्रेमसाठी, फ्लो फ्रेमच्या परिमाणांप्रमाणे असतो आणि त्यात 2 चॅनेल्स असतात, जे ऑप्टिकल फ्लो व्हेक्टरच्या x आणि y घटकांशी संबंधित असतात.\n", "\n", - "2D मध्ये ऑप्टिकल फ्लो प्रदर्शित करणे थोडे आव्हानात्मक आहे, पण आपण एक हुशार कल्पना वापरू शकतो. जर आपण ऑप्टिकल फ्लोला ध्रुवीय निर्देशांकांमध्ये रूपांतरित केले, तर प्रत्येक पिक्सेलसाठी आपल्याला दोन घटक मिळतील: *दिशा* आणि *तीव्रता*. आपण तीव्रता पिक्सेलच्या तीव्रतेने दर्शवू शकतो आणि दिशा वेगवेगळ्या रंगांनी दर्शवू शकतो. आपण [HSV (Hue-Saturation-Value) रंग स्थान](https://en.wikipedia.org/wiki/HSV_color_space) मध्ये एक प्रतिमा तयार करू, जिथे ह्यू दिशा ठरवेल, व्हॅल्यू तीव्रता ठरवेल, आणि सॅच्युरेशन 255 असेल.\n" + "2D मध्ये ऑप्टिकल फ्लो प्रदर्शित करणे थोडे आव्हानात्मक असते, पण आपण एक हुशार कल्पना वापरू शकतो. जर आपण ऑप्टिकल फ्लोला ध्रुवीय निर्देशांकांमध्ये रूपांतरित केले, तर प्रत्येक पिक्सेलसाठी आपल्याला दोन घटक मिळतील: *दिशा* आणि *तीव्रता*. तीव्रता पिक्सेलच्या तीव्रतेने दर्शवता येईल, आणि दिशा वेगवेगळ्या रंगांनी दर्शवता येईल. आपण [HSV (Hue-Saturation-Value) रंग स्थान](https://en.wikipedia.org/wiki/HSV_color_space) मध्ये एक प्रतिमा तयार करू, जिथे ह्यू दिशा ठरवेल, व्हॅल्यू तीव्रता ठरवेल, आणि सॅच्युरेशन 255 असेल.\n" ] }, { @@ -739,7 +739,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**अस्वीकरण**: \nहा दस्तऐवज AI भाषांतर सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) वापरून भाषांतरित करण्यात आला आहे. आम्ही अचूकतेसाठी प्रयत्नशील असलो तरी, कृपया लक्षात घ्या की स्वयंचलित भाषांतरांमध्ये त्रुटी किंवा अचूकतेचा अभाव असू शकतो. मूळ भाषेतील मूळ दस्तऐवज हा अधिकृत स्रोत मानला जावा. महत्त्वाच्या माहितीसाठी, व्यावसायिक मानवी भाषांतराची शिफारस केली जाते. या भाषांतराचा वापर करून उद्भवणाऱ्या कोणत्याही गैरसमज किंवा चुकीच्या अर्थासाठी आम्ही जबाबदार राहणार नाही.\n" + "\n---\n\n**अस्वीकरण**: \nहा दस्तऐवज AI भाषांतर सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) चा वापर करून भाषांतरित करण्यात आला आहे. आम्ही अचूकतेसाठी प्रयत्नशील असलो तरी, कृपया लक्षात घ्या की स्वयंचलित भाषांतरांमध्ये त्रुटी किंवा अचूकतेचा अभाव असू शकतो. मूळ भाषेतील दस्तऐवज हा अधिकृत स्रोत मानला जावा. महत्त्वाच्या माहितीसाठी व्यावसायिक मानवी भाषांतराची शिफारस केली जाते. या भाषांतराचा वापर केल्यामुळे उद्भवलेल्या कोणत्याही गैरसमज किंवा चुकीच्या अर्थासाठी आम्ही जबाबदार राहणार नाही.\n" ] } ], @@ -766,8 +766,8 @@ }, "orig_nbformat": 4, "coopTranslator": { - "original_hash": "ad5bdca62175c7a3d4336ef8c761aef3", - "translation_date": "2025-08-28T08:06:49+00:00", + "original_hash": "339b2129f86b24024393ff92b8bd376f", + "translation_date": "2025-09-07T15:00:32+00:00", "source_file": "lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb", "language_code": "mr" } diff --git a/translations/ms/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb b/translations/ms/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb index 164ea980..345351fa 100644 --- a/translations/ms/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb +++ b/translations/ms/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb @@ -8,7 +8,7 @@ "\n", "Notebook ini adalah sebahagian daripada [Kurikulum AI untuk Pemula](http://aka.ms/ai-beginners).\n", "\n", - "[OpenCV](https://opencv.org/) dianggap sebagai standard *de facto* untuk pemprosesan imej. Ia mengandungi banyak algoritma berguna yang diimplementasikan dalam C++. Anda juga boleh menggunakan OpenCV dengan Python.\n", + "[OpenCV](https://opencv.org/) dianggap sebagai standard *de facto* untuk pemprosesan imej. Ia mengandungi banyak algoritma berguna yang diimplementasikan dalam C++. Anda juga boleh menggunakan OpenCV melalui Python.\n", "\n", "Dalam notebook ini, kami akan memberikan beberapa contoh penggunaan OpenCV. Untuk maklumat lanjut, anda boleh melawat kursus dalam talian [Learn OpenCV](https://learnopencv.com/getting-started-with-opencv/).\n", "\n", @@ -135,7 +135,7 @@ "source": [ "bw_im = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)\n", "print(bw_im.shape)\n", - "plt.imshow(bw_im)" + "plt.imshow(bw_im, cmap='gray')" ] }, { @@ -144,7 +144,7 @@ "source": [ "## Pemprosesan Imej Braille\n", "\n", - "Jika kita ingin menggunakan klasifikasi imej untuk mengenali teks, kita perlu memotong simbol individu supaya ia kelihatan serupa dengan imej MNIST yang pernah kita lihat sebelum ini. Ini boleh dilakukan menggunakan teknik [pengesanan objek](../11-ObjectDetection/README.md) yang akan kita bincangkan kemudian, tetapi kita juga boleh mencuba menggunakan penglihatan komputer semata-mata untuk tujuan tersebut. Penerangan yang baik tentang bagaimana penglihatan komputer boleh digunakan untuk pemisahan aksara boleh didapati [dalam blog ini](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) - di sini kita hanya akan memberi tumpuan kepada beberapa teknik penglihatan komputer.\n", + "Jika kita ingin menggunakan klasifikasi imej untuk mengenali teks, kita perlu memotong simbol individu supaya ia kelihatan serupa dengan imej MNIST yang pernah kita lihat sebelum ini. Ini boleh dilakukan menggunakan teknik [pengesanan objek](../11-ObjectDetection/README.md) yang akan kita bincangkan kemudian, tetapi kita juga boleh mencuba menggunakan penglihatan komputer secara langsung untuk tujuan tersebut. Penerangan yang baik tentang bagaimana penglihatan komputer boleh digunakan untuk pemisahan karakter boleh didapati [dalam blog ini](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) - di sini kita hanya akan memberi tumpuan kepada beberapa teknik penglihatan komputer.\n", "\n", "Pertama, mari kita cuba meningkatkan imej sedikit. Kita boleh menggunakan idea **thresholding** (dijelaskan dengan baik [dalam artikel OpenCV ini](https://docs.opencv.org/4.x/d7/d4d/tutorial_py_thresholding.html)):\n" ] @@ -252,7 +252,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Untuk memisahkan setiap aksara, kita perlu mengetahui kotak sempadan bagi keseluruhan teks. Untuk mengetahuinya, kita hanya perlu mengira koordinat min dan maks.\n" + "Untuk memisahkan setiap aksara, kita perlu mengetahui kotak sempadan bagi keseluruhan teks. Untuk mengetahuinya, kita hanya perlu mengira koordinat min dan maks:\n" ] }, { @@ -395,9 +395,9 @@ "\n", "Mengesan pergerakan dalam aliran video adalah tugas yang sangat biasa. Sebagai contoh, ia membolehkan kita menerima amaran apabila sesuatu berlaku pada kamera pengawasan. Jika kita ingin memahami apa yang sedang berlaku pada kamera, kita boleh menggunakan rangkaian neural - tetapi ia jauh lebih murah untuk menggunakan rangkaian neural apabila kita tahu bahawa sesuatu sedang berlaku.\n", "\n", - "Idea utama pengesanan pergerakan adalah mudah. Jika kamera tetap, maka bingkai dari kamera seharusnya agak serupa antara satu sama lain. Oleh kerana bingkai diwakili sebagai array, hanya dengan menolak array tersebut untuk dua bingkai berturutan, kita akan mendapat perbezaan piksel, yang seharusnya rendah untuk bingkai statik, dan menjadi lebih tinggi apabila terdapat pergerakan yang ketara dalam imej.\n", + "Idea utama pengesanan pergerakan adalah mudah. Jika kamera berada dalam keadaan tetap, maka bingkai dari kamera seharusnya hampir serupa antara satu sama lain. Oleh kerana bingkai diwakili sebagai array, hanya dengan menolak array tersebut untuk dua bingkai berturutan, kita akan mendapat perbezaan piksel, yang seharusnya rendah untuk bingkai statik, dan menjadi lebih tinggi apabila terdapat pergerakan yang ketara dalam imej.\n", "\n", - "Kita akan bermula dengan mempelajari cara membuka video dan menukarkannya kepada urutan bingkai:\n" + "Kita akan bermula dengan mempelajari cara membuka video dan menukarkannya kepada satu urutan bingkai:\n" ] }, { @@ -490,7 +490,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Andaikan kita ingin membuat laporan yang menunjukkan apa yang berlaku di hadapan kamera dengan memaparkan imej yang sesuai setiap kali sesuatu berlaku. Untuk melakukannya, kita mungkin ingin mencari bingkai permulaan dan akhir bagi \"peristiwa\", dan memaparkan bingkai tengah. Untuk menghilangkan sedikit gangguan, kita juga akan melicinkan lengkung di atas dengan fungsi purata bergerak:\n" + "Katakan kita ingin mencipta laporan yang menunjukkan apa yang berlaku di hadapan kamera dengan memaparkan imej yang sesuai setiap kali sesuatu berlaku. Untuk melakukannya, kita mungkin ingin mencari bingkai permulaan dan akhir bagi suatu \"peristiwa\", dan memaparkan bingkai tengah. Untuk mengurangkan sedikit bunyi, kita juga akan melicinkan lengkung di atas dengan fungsi purata bergerak:\n" ] }, { @@ -651,10 +651,10 @@ "source": [ "## Ekstrak Pergerakan menggunakan Aliran Optik\n", "\n", - "Walaupun hanya membandingkan dua bingkai berturutan membolehkan kita melihat jumlah perubahan, ia tidak memberikan maklumat tentang apa yang sebenarnya bergerak dan di mana. Untuk mendapatkan maklumat tersebut, terdapat teknik yang dipanggil **[aliran optik](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)**:\n", + "Walaupun membandingkan dua bingkai berturutan membolehkan kita melihat jumlah perubahan, ia tidak memberikan maklumat tentang apa yang sebenarnya bergerak dan di mana. Untuk mendapatkan maklumat tersebut, terdapat satu teknik yang dipanggil **[aliran optik](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)**:\n", "\n", - "* **Aliran Optik Padat** mengira medan vektor yang menunjukkan untuk setiap piksel ke mana ia bergerak.\n", - "* **Aliran Optik Jarang** berdasarkan mengambil beberapa ciri yang ketara dalam imej (contohnya, tepi), dan membina trajektori mereka dari bingkai ke bingkai.\n", + "* **Aliran Optik Padat** mengira medan vektor yang menunjukkan ke mana setiap piksel bergerak\n", + "* **Aliran Optik Jarang** berdasarkan mengambil beberapa ciri yang ketara dalam imej (contohnya, tepi), dan membina trajektori mereka dari satu bingkai ke bingkai yang lain.\n", "\n", "Baca lebih lanjut tentang aliran optik [dalam tutorial hebat ini](https://learnopencv.com/optical-flow-in-opencv/).\n", "\n", @@ -687,9 +687,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Seperti yang anda lihat, untuk setiap bingkai, aliran mempunyai dimensi bingkai, dan 2 saluran, yang sepadan dengan komponen x dan y bagi vektor aliran optik.\n", + "Seperti yang anda lihat, untuk setiap bingkai, aliran mempunyai dimensi bingkai dan 2 saluran, yang sepadan dengan komponen x dan y bagi vektor aliran optik.\n", "\n", - "Memaparkan aliran optik dalam 2D agak mencabar, tetapi kita boleh menggunakan satu idea yang bijak. Jika kita menukar aliran optik kepada koordinat polar, maka kita akan mendapat dua komponen untuk setiap piksel: *arah* dan *keamatan*. Kita boleh mewakili keamatan melalui keamatan piksel, dan arah melalui warna yang berbeza. Kita akan mencipta imej dalam [ruang warna HSV (Hue-Saturation-Value)](https://en.wikipedia.org/wiki/HSV_color_space), di mana hue akan ditentukan oleh arah, value - oleh keamatan, dan saturation akan menjadi 255.\n" + "Memaparkan aliran optik dalam 2D agak mencabar, tetapi kita boleh menggunakan satu idea yang bijak. Jika kita menukar aliran optik kepada koordinat polar, maka kita akan mendapat dua komponen untuk setiap piksel: *arah* dan *intensiti*. Kita boleh mewakili intensiti dengan intensiti piksel, dan arah dengan warna yang berbeza. Kita akan mencipta imej dalam [ruang warna HSV (Hue-Saturation-Value)](https://en.wikipedia.org/wiki/HSV_color_space), di mana hue akan ditentukan oleh arah, value - oleh intensiti, dan saturation akan menjadi 255.\n" ] }, { @@ -738,7 +738,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Jadi, dalam bingkai-bingkai tersebut, warna kehijauan menunjukkan pergerakan ke kiri, manakala biru - pergerakan ke kanan.\n", + "Jadi, dalam bingkai-bingkai tersebut, warna kehijauan menunjukkan pergerakan ke kiri, manakala biru menunjukkan pergerakan ke kanan.\n", "\n", "Aliran optik boleh menjadi alat yang hebat untuk membuat kesimpulan tentang arah pergerakan secara umum. Sebagai contoh, jika anda melihat semua piksel dalam satu bingkai bergerak dalam satu arah yang lebih kurang sama - anda boleh membuat kesimpulan bahawa terdapat pergerakan kamera, dan cuba untuk mengimbangi perkara tersebut.\n" ] @@ -747,7 +747,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**Penafian**: \nDokumen ini telah diterjemahkan menggunakan perkhidmatan terjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Walaupun kami berusaha untuk memastikan ketepatan, sila ambil perhatian bahawa terjemahan automatik mungkin mengandungi kesilapan atau ketidaktepatan. Dokumen asal dalam bahasa asalnya harus dianggap sebagai sumber yang berwibawa. Untuk maklumat yang kritikal, terjemahan manusia profesional adalah disyorkan. Kami tidak bertanggungjawab atas sebarang salah faham atau salah tafsir yang timbul daripada penggunaan terjemahan ini.\n" + "\n---\n\n**Penafian**: \nDokumen ini telah diterjemahkan menggunakan perkhidmatan terjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Walaupun kami berusaha untuk memastikan ketepatan, sila ambil maklum bahawa terjemahan automatik mungkin mengandungi kesilapan atau ketidaktepatan. Dokumen asal dalam bahasa asalnya harus dianggap sebagai sumber yang berwibawa. Untuk maklumat yang kritikal, terjemahan manusia profesional adalah disyorkan. Kami tidak bertanggungjawab atas sebarang salah faham atau salah tafsir yang timbul daripada penggunaan terjemahan ini.\n" ] } ], @@ -774,8 +774,8 @@ }, "orig_nbformat": 4, "coopTranslator": { - "original_hash": "ad5bdca62175c7a3d4336ef8c761aef3", - "translation_date": "2025-08-29T13:57:40+00:00", + "original_hash": "339b2129f86b24024393ff92b8bd376f", + "translation_date": "2025-09-07T15:13:51+00:00", "source_file": "lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb", "language_code": "ms" } diff --git a/translations/my/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb b/translations/my/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb index f4c18a35..a2ef30a5 100644 --- a/translations/my/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb +++ b/translations/my/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb @@ -6,13 +6,13 @@ "source": [ "# ကွန်ပျူတာဗီရှင်းနှင့် OpenCV\n", "\n", - "ဒီ notebook က [AI for Beginners Curriculum](http://aka.ms/ai-beginners) ရဲ့ အစိတ်အပိုင်းတစ်ခုဖြစ်ပါတယ်။\n", + "ဒီနော့ဘွတ်ခ်က [AI for Beginners Curriculum](http://aka.ms/ai-beginners) ရဲ့ အစိတ်အပိုင်းတစ်ခုဖြစ်ပါတယ်။\n", "\n", - "[OpenCV](https://opencv.org/) ကို ပုံရိပ်များကို အဆင့်မြှင့်တင်ရန်အတွက် *de facto* စံသတ်မှတ်အဖြစ် သတ်မှတ်ထားပါတယ်။ ဒါဟာ C++ မှာ အကောင်းဆုံး အယ်လဂိုရစ်သုံးစွဲမှုများပါဝင်ပြီး အသုံးပြုနိုင်ပါတယ်။ Python မှတစ်ဆင့် OpenCV ကိုလည်း ခေါ်ယူအသုံးပြုနိုင်ပါတယ်။\n", + "[OpenCV](https://opencv.org/) ကို ပုံရိပ်များကို အလုပ်လုပ်စေဖို့အတွက် *de facto* စံသတ်မှတ်ချက်အဖြစ် သတ်မှတ်ထားပါတယ်။ ဒါဟာ C++ မှာ အကောင်းဆုံး အယ်လဂိုရစ်သမားများစွာ ပါဝင်ပြီး အသုံးပြုနိုင်ပါတယ်။ Python မှတစ်ဆင့် OpenCV ကိုလည်း ခေါ်ယူအသုံးပြုနိုင်ပါတယ်။\n", "\n", - "ဒီ notebook မှာ OpenCV ကို အသုံးပြုနည်းအချို့ကို ဥပမာပေးထားပါတယ်။ အသေးစိတ်ကို [Learn OpenCV](https://learnopencv.com/getting-started-with-opencv/) အွန်လိုင်းသင်တန်းမှာ သွားလေ့လာနိုင်ပါတယ်။\n", + "ဒီနော့ဘွတ်ခ်မှာ OpenCV ကို အသုံးပြုနည်းအတွက် ဥပမာများကို ပေးထားပါတယ်။ အသေးစိတ်ကို [Learn OpenCV](https://learnopencv.com/getting-started-with-opencv/) အွန်လိုင်းသင်တန်းမှာ သွားလေ့လာနိုင်ပါတယ်။\n", "\n", - "ပထမဆုံး `import cv2` လုပ်ပြီး အခြားအသုံးဝင်တဲ့ library တွေကိုလည်း ထည့်သွင်းကြရအောင်:\n" + "ပထမဆုံး `import cv2` လုပ်ပြီး အခြားအသုံးဝင်တဲ့ လိုက်ဘရရီများကိုလည်း ထည့်သွင်းကြရအောင်:\n" ] }, { @@ -44,7 +44,7 @@ "source": [ "## ပုံများကို Load လုပ်ခြင်း\n", "\n", - "Python တွင် ပုံများကို NumPy array များဖြင့် အဆင်ပြေစွာ ကိုယ်စားပြုနိုင်ပါသည်။ ဥပမာအားဖြင့်၊ 320x200 pixels အရွယ်ရှိ အမည်းရောင်-အဖြူရောင် ပုံတစ်ပုံကို 200x320 array အဖြစ် သိမ်းဆည်းမည်ဖြစ်ပြီး၊ အရောင်ပုံတစ်ပုံ (အချင်းချင်းအရွယ်အစားတူ) ကို 200x320x3 (အရောင်ချန်နယ် ၃ ခုအတွက်) အနေဖြင့် ရှိမည်ဖြစ်သည်။\n", + "Python တွင် ပုံများကို NumPy array များဖြင့် အဆင်ပြေစွာ ကိုယ်စားပြုနိုင်ပါသည်။ ဥပမာအားဖြင့်၊ 320x200 pixels အရွယ်ရှိ အမည်းရောင်နှင့် အဖြူရောင်ပုံတစ်ပုံကို 200x320 array အဖြစ် သိမ်းဆည်းမည်ဖြစ်ပြီး၊ အရောင်ပုံတစ်ပုံ (အချင်းချင်းအရွယ်အစားတူ) ကို 200x320x3 (အရောင်ချန်နယ် ၃ ခုအတွက်) အရွယ်အစားဖြင့် ပုံသဏ္ဍာန်ထားမည်ဖြစ်သည်။\n", "\n", "အရင်ဆုံး ပုံတစ်ပုံကို Load လုပ်ခြင်းစတင်ကြရအောင်-\n" ] @@ -94,7 +94,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "သင်မြင်နိုင်သည့်အတိုင်း၊ ဤသည်သည် braille အက္ခရာ၏ပုံရိပ်တစ်ခုဖြစ်သည်။ အရောင်အပေါ်မှာအလွန်စိတ်ဝင်စားမှုမရှိသဖြင့်၊ ငါတို့ကအဖြူနဲ့အမည်းအဖြစ်ပြောင်းနိုင်ပါတယ်။\n" + "သင်မြင်နိုင်သည့်အတိုင်း၊ ဒါဟာ braille စာသားရဲ့ ပုံရိပ်တစ်ခုဖြစ်ပါတယ်။ အရောင်အမှန်အတုကို အလေးမထားလိုက်ကြသလို၊ ဒါကို အနက်နှင့်အဖြူအဖြစ် ပြောင်းလဲနိုင်ပါတယ်။\n" ] }, { @@ -135,18 +135,18 @@ "source": [ "bw_im = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)\n", "print(bw_im.shape)\n", - "plt.imshow(bw_im)" + "plt.imshow(bw_im, cmap='gray')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Braille ပုံရိပ်ကို အလုပ်လုပ်စေခြင်း\n", + "## Braille အမြင်အာရုံ ပုံရိပ်ကို ကုသခြင်း\n", "\n", - "ကျွန်တော်တို့ စာသားကို အသိအမှတ်ပြုနိုင်ရန် ပုံရိပ်ခွဲခြားမှုကို အသုံးပြုချင်ရင်၊ အရင်ဆုံး သီးခြားအမှတ်လက္ခဏာများကို ဖြတ်ထုတ်ပြီး၊ ယခင်က မြင်ဖူးခဲ့တဲ့ MNIST ပုံရိပ်များနဲ့ ဆင်တူအောင် ပြုလုပ်ရမယ်။ ဒါကို [object detection](../11-ObjectDetection/README.md) နည်းလမ်းကို အသုံးပြုပြီး ပြုလုပ်နိုင်ပါတယ်၊ ဒါပေမယ့် pure computer vision ကိုလည်း အသုံးပြုကြည့်နိုင်ပါတယ်။ စာလုံးခွဲခြားမှုအတွက် computer vision ကို ဘယ်လိုအသုံးပြုနိုင်မလဲဆိုတာကို [ဒီ blog post](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) မှာ ကောင်းကောင်းဖော်ပြထားပါတယ် - ဒီမှာတော့ computer vision နည်းလမ်းတချို့ကိုသာ အာရုံစိုက်ပါမယ်။\n", + "စာသားကို အသိအမှတ်ပြုနိုင်ရန် ပုံရိပ် အမျိုးအစားခွဲခြင်းကို အသုံးပြုလိုပါက MNIST ပုံရိပ်များနှင့် ဆင်တူအောင် တစ်ခုချင်းစီကို ဖြတ်ထုတ်ရပါမည်။ ၎င်းကို [object detection](../11-ObjectDetection/README.md) နည်းလမ်းကို အသုံးပြု၍ ပြုလုပ်နိုင်ပြီး နောက်ပိုင်းတွင် ဆွေးနွေးမည်ဖြစ်သော်လည်း သန့်စင်ထားသော computer vision ကိုလည်း အသုံးပြုနိုင်ပါသည်။ စာလုံးများကို ခွဲခြားရန် computer vision ကို ဘယ်လိုအသုံးပြုနိုင်သည်ကို [ဒီ blog post](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) တွင် ကောင်းမွန်စွာ ရှင်းလင်းထားသည် - ဒီနေရာမှာတော့ computer vision နည်းလမ်းအချို့ကိုသာ အာရုံစိုက်မည်ဖြစ်သည်။\n", "\n", - "ပထမဆုံး၊ ပုံရိပ်ကို နည်းနည်းတိုးတက်အောင် လုပ်ကြည့်ရအောင်။ **thresholding** အကြောင်းကို အသုံးပြုနိုင်ပါတယ် ([ဒီ OpenCV ဆောင်းပါး](https://docs.opencv.org/4.x/d7/d4d/tutorial_py_thresholding.html) မှာ ကောင်းကောင်းဖော်ပြထားပါတယ်):\n" + "ပထမဦးဆုံး ပုံရိပ်ကို အနည်းငယ်တိုးတက်အောင် လုပ်ကြည့်ရအောင်။ **thresholding** အကြောင်းအရာကို အသုံးပြုနိုင်ပြီး (ကောင်းမွန်စွာ ရှင်းလင်းထားသော [ဒီ OpenCV ဆောင်းပါး](https://docs.opencv.org/4.x/d7/d4d/tutorial_py_thresholding.html) တွင် ဖတ်ရှုနိုင်သည်):\n" ] }, { @@ -192,7 +192,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "ပုံများနှင့်အလုပ်လုပ်ရန်၊ တစ်ခုချင်းစီ၏အမှတ်များကို \"ထုတ်ယူ\" ရမည်ဖြစ်ပြီး၊ ပုံများကို တစ်ခုချင်းစီ၏အမှတ်များ၏ကိုဩဒိနိတ်များအဖြစ် ပြောင်းလဲရမည်ဖြစ်သည်။ ဤအရာကို **feature extraction** နည်းလမ်းများဖြင့် ပြုလုပ်နိုင်ပြီး၊ SIFT, SURF သို့မဟုတ် [ORB](https://docs.opencv.org/4.x/d1/d89/tutorial_py_orb.html) ကဲ့သို့သောနည်းလမ်းများကို အသုံးပြုနိုင်သည်။\n" + "ပုံများနှင့်အလုပ်လုပ်ရန်၊ တစ်ခုချင်းစီ၏အမှတ်များကို \"ထုတ်ယူ\" ရမည်ဖြစ်ပြီး၊ အဆိုပါပုံများကို တစ်ခုချင်းစီ၏အမှတ်များ၏ကိုဩဒိနိတ်အစုအဖြစ် ပြောင်းလဲရမည်ဖြစ်သည်။ ၎င်းကို **အင်္ဂါရပ်ထုတ်ယူမှု** နည်းလမ်းများဖြင့် ပြုလုပ်နိုင်ပြီး၊ SIFT၊ SURF သို့မဟုတ် [ORB](https://docs.opencv.org/4.x/d1/d89/tutorial_py_orb.html) ကဲ့သို့သောနည်းလမ်းများကို အသုံးပြုနိုင်သည်။\n" ] }, { @@ -252,7 +252,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "အက္ခရာတစ်ခုချင်းစီကိုခွဲထုတ်ရန်၊ ကျွန်ုပ်တို့သည် စာသားတစ်ခုလုံး၏ bounding box ကို သိရှိရန်လိုအပ်သည်။ ဒါကိုရှာဖွေဖို့၊ min နှင့် max ကိုဧရိယာကို ရှုထောင့်တွက်ချက်နိုင်ပါသည်။\n" + "တစ်ခုချင်းစီအက္ခရာများကို ခွဲထုတ်ရန်၊ စာသားတစ်ခုလုံး၏ bounding box ကို သိရှိရန်လိုအပ်သည်။ ဒါကို ရှာဖွေဖို့၊ အနည်းဆုံးနှင့် အများဆုံးကိုဩဒိနိတ်များကို တွက်ချက်နိုင်ပါသည်။\n" ] }, { @@ -293,7 +293,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "အချို့အပိုင်းလှည့်ထားနိုင်ပြီး၊ ပြည့်စုံသော alignment ရရှိရန် **perspective transformation** လုပ်ရန်လိုအပ်ပါသည်။ ကျွန်ုပ်တို့သည် $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ အဖြစ်သတ်မှတ်ထားသော စတုရန်းကိုယူပြီး၊ အချိုးကျသောအတိုင်းအတာများနှင့်အတူ ပုံအသစ်နှင့် alignment ပြုလုပ်ပါမည်။\n" + "ဒါ့အပြင်၊ ဒီစာသားကို အချို့လှည့်နိုင်ပြီး၊ ပြီးပြည့်စုံစွာတန်းတူအောင်လုပ်ရန် **perspective transformation** ဟုခေါ်သောလုပ်ငန်းစဉ်ကို လိုအပ်ပါသည်။ ကျွန်ုပ်တို့သည် $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ အချက်အလက်များဖြင့် သတ်မှတ်ထားသော စတုရန်းကို ယူပြီး၊ အချိုးကျသော အရွယ်အစားများဖြင့် ပုံအသစ်နှင့် တန်းတူအောင် လုပ်ဆောင်ပါမည်။\n" ] }, { @@ -389,11 +389,11 @@ "source": [ "## Frame Difference ဖြင့် လှုပ်ရှားမှု ရှာဖွေခြင်း\n", "\n", - "ဗီဒီယိုစီးရီးတွင် လှုပ်ရှားမှု ရှာဖွေခြင်းသည် အလွန် မကြာခဏ လုပ်ဆောင်ရသော အလုပ်တစ်ခုဖြစ်သည်။ ဥပမာအားဖြင့်၊ စောင့်ကြည့်ကင်မရာတွင် တစ်စုံတစ်ခု ဖြစ်ပျက်နေသည်ကို သတိပေးချက်ရရှိရန် ကူညီပေးနိုင်သည်။ ကင်မရာတွင် ဖြစ်ပျက်နေသည်ကို နားလည်လိုပါက နယူးရယ်နက်ဝက်ကို အသုံးပြုနိုင်သည် - သို့သော် တစ်စုံတစ်ခု ဖြစ်ပျက်နေသည်ကို သိရှိပြီးမှ နယူးရယ်နက်ဝက်ကို အသုံးပြုခြင်းသည် ပိုမိုသက်သာသည်။\n", + "ဗီဒီယိုစီးရီးတွင် လှုပ်ရှားမှုကို ရှာဖွေခြင်းသည် အလွန်မကြာခဏ လုပ်ဆောင်ရသော အလုပ်တစ်ခုဖြစ်သည်။ ဥပမာအားဖြင့်၊ စောင့်ကြည့်မှုကင်မရာတွင် တစ်စုံတစ်ခုဖြစ်ပျက်သောအခါ သတိပေးချက်များရရှိရန် ကူညီပေးနိုင်သည်။ ကင်မရာတွင် ဘာဖြစ်ပျက်နေသည်ကို နားလည်လိုပါက နယူးရယ်နက်ဝက်ကို အသုံးပြုနိုင်သည် - သို့သော် တစ်စုံတစ်ခုဖြစ်ပျက်နေသည်ကို သိရှိပြီးမှ နယူးရယ်နက်ဝက်ကို အသုံးပြုခြင်းသည် ပိုမိုသက်သာသည်။\n", "\n", - "လှုပ်ရှားမှု ရှာဖွေခြင်း၏ အဓိက အယူအဆမှာ ရိုးရှင်းသည်။ ကင်မရာကို တစ်နေရာတည်းတွင် တည်နေအောင်ထားပါက၊ ကင်မရာမှ ရရှိသော frame များသည် အတော်လေး တူညီနေသင့်သည်။ Frame များကို array အဖြစ် ကိုယ်စားပြုထားသောကြောင့်၊ ဆက်တိုက် frame နှစ်ခု၏ array များကို လျော့ချက်ပြုလုပ်ခြင်းဖြင့် pixel အပြောင်းအလဲကို ရရှိနိုင်ပြီး၊ static frame များအတွက် အပြောင်းအလဲမှာ နည်းပါးသင့်ပြီး၊ ပုံတွင် အရေးကြီးသော လှုပ်ရှားမှုရှိလာသောအခါမှာ ပိုမိုမြင့်မားလာမည်ဖြစ်သည်။\n", + "လှုပ်ရှားမှု ရှာဖွေခြင်း၏ အဓိကအကြောင်းအရာမှာ ရိုးရှင်းသည်။ ကင်မရာကို တစ်နေရာတည်းထားထားပါက၊ ကင်မရာမှ ရရှိသော frame များသည် အတော်လေး တူညီနေသင့်သည်။ frame များကို array အဖြစ် ကိုယ်စားပြုထားသောကြောင့်၊ frame နှစ်ခုကို ဆက်တိုက် လျှော့ချက်လုပ်ခြင်းဖြင့် pixel အပြောင်းအလဲကို ရရှိနိုင်သည်။ static frame များအတွက် pixel အပြောင်းအလဲမှာ နည်းပါးသင့်ပြီး၊ ပုံတွင် အရေးကြီးသော လှုပ်ရှားမှုရှိလာသောအခါ pixel အပြောင်းအလဲမှာ မြင့်တက်လာမည်ဖြစ်သည်။\n", "\n", - "အရင်ဆုံး ဗီဒီယိုကို ဖွင့်ပြီး frame များအဖြစ် အစဉ်လိုက် ပြောင်းလဲပုံကို လေ့လာမည်:\n" + "အရင်ဆုံး ဗီဒီယိုကို ဖွင့်ပြီး frame များအဖြစ် အစီအစဉ်တစ်ခုအဖြစ် ပြောင်းလဲပုံကို လေ့လာမည်:\n" ] }, { @@ -441,7 +441,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "အရောင်သည် လှုပ်ရှားမှုကို သိရှိရန်အတွက် အရေးကြီးမှုမရှိသည့်အတွက်၊ ကျွန်ုပ်တို့သည် frame အားလုံးကို အမည်းဖြူအဖြစ် ပြောင်းလဲမည်။ ထို့နောက် frame အပြောင်းအလဲများကို တွက်ချက်ပြီး၊ လှုပ်ရှားမှုများရှိနေသည့် ပမာဏကို မြင်သာစွာ ကြည့်ရှုနိုင်ရန် ၎င်းတို့၏ norm များကို ရှုထောင်မည်။\n" + "အရောင်သည် လှုပ်ရှားမှုကို သိရှိရန် အရေးကြီးမှုမရှိသည့်အတွက်၊ ကျွန်ုပ်တို့သည် frame အားလုံးကို အမည်းဖြူအဖြစ် ပြောင်းလဲပါမည်။ ထို့နောက်၊ frame များ၏ ကွာခြားချက်များကို တွက်ချက်ပြီး၊ ၎င်းတို့၏ norm များကို ရှုမြင်နိုင်ရန် ရှုထောင့်ပုံစံဖြင့် ရေးဆွဲပြသပါမည်။\n" ] }, { @@ -486,7 +486,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "ကင်မရာရှေ့မှာဖြစ်ပျက်ခဲ့တာကို ပြသတဲ့အခါ၊ အကြောင်းအရာတစ်ခုခုဖြစ်ပျက်တဲ့အချိန်တိုင်း သင့်လျော်တဲ့ပုံရိပ်ကို ပြသပြီး အစီရင်ခံစာတစ်ခု ဖန်တီးလိုက်ချင်တယ်လို့ ဆိုပါစို့။ ဒါကိုလုပ်ဖို့အတွက် \"အဖြစ်အပျက်\" တစ်ခုရဲ့ အစဖွင့်ဖရိမ်နဲ့ အဆုံးဖရိမ်ကို ရှာဖွေပြီး အလယ်ဖရိမ်ကို ပြသချင်ပါတယ်။ အချို့သောဆူညံသံများကို ဖယ်ရှားဖို့အတွက်၊ အပေါ်က curve ကို moving average function နဲ့ချောမွေ့ပေးပါမယ်။\n" + "ကင်မရာရှေ့မှာဖြစ်ပျက်ခဲ့တာကို ပြသတဲ့အခါ၊ အကြောင်းအရာတစ်ခုခုဖြစ်ပျက်တဲ့အချိန်တိုင်း သင့်တော်တဲ့ပုံရိပ်ကို ပြသပြီး အစီရင်ခံစာတစ်ခု ဖန်တီးလိုပါက၊ \"အဖြစ်အပျက်\" ရဲ့ အစနှင့် အဆုံး frame ကို ရှာဖွေပြီး အလယ်ပိုင်း frame ကို ပြသလိုက်ပါမည်။ အချို့သော ဆူညံသံများကို ဖယ်ရှားရန်၊ အထက်ရှိ curve ကို moving average function ဖြင့် ချောမွေ့စေပါမည်။\n" ] }, { @@ -531,7 +531,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "ယခုတွင် `np.where` ကို အသုံးပြု၍ အပြောင်းအလဲပမာဏသည် သတ်မှတ်ချက်ထက် မြင့်မားသော frames များကို ရှာဖွေနိုင်ပြီး၊ 30 frames ထက်ပိုရှည်သော ဆက်တိုက်နေသော frames များ၏ အစဉ်ကို ထုတ်ယူနိုင်ပါသည်။\n" + "ယခုတွင် ကျွန်ုပ်တို့သည် `np.where` ကို အသုံးပြု၍ အပြောင်းအလဲများ၏ ပမာဏသည် စံနှုန်းတန်ဖိုးထက် မြင့်မားသော frames များကို ရှာဖွေနိုင်ပြီး၊ 30 frames ထက်ပိုရှည်သော ဆက်တိုက်နေသော frames များ၏ အစဉ်ကို ထုတ်ယူနိုင်ပါသည်။\n" ] }, { @@ -643,12 +643,12 @@ "source": [ "## Optical Flow ကို အသုံးပြု၍ လှုပ်ရှားမှုကို ထုတ်ယူခြင်း\n", "\n", - "အဆက်မပြတ် frame နှစ်ခုကို နှိုင်းယှဉ်ကြည့်ခြင်းဖြင့် ပြောင်းလဲမှုအရေအတွက်ကို မြင်နိုင်သော်လည်း၊ အတိအကျ ဘာတွေ လှုပ်ရှားနေတယ်၊ ဘယ်မှာလှုပ်ရှားနေတယ်ဆိုတာကို မသိနိုင်ပါ။ အဲဒီအချက်အလက်ကို ရရှိဖို့အတွက် **[optical flow](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)** လို့ခေါ်တဲ့ နည်းလမ်းတစ်ခု ရှိပါတယ်။\n", + "အဆက်မပြတ် frame နှစ်ခုကို နှိုင်းယှဉ်ကြည့်ခြင်းက ပြောင်းလဲမှုအရေအတွက်ကို မြင်နိုင်စေသော်လည်း၊ အတိအကျ ဘာတွေ လှုပ်ရှားနေပြီး ဘယ်နေရာမှာလှုပ်ရှားနေလဲဆိုတာကို မသိနိုင်ပါ။ အဲဒီအချက်အလက်ကို ရယူဖို့ **[optical flow](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)** ဆိုတဲ့နည်းလမ်းတစ်ခုရှိပါတယ်။\n", "\n", - "* **Dense Optical Flow** ကတော့ pixel တစ်ခုချင်းစီ ဘယ်ဘက်ကို လှုပ်ရှားနေတယ်ဆိုတာကို ပြသတဲ့ vector field ကို တွက်ချက်ပေးပါတယ်။\n", - "* **Sparse Optical Flow** ကတော့ ပုံရိပ်ထဲက ထူးခြားတဲ့ အချက်အလက်တချို့ (ဥပမာ edges) ကို ယူပြီး frame တစ်ခုမှ နောက်တစ်ခုသို့ trajectory ကို တည်ဆောက်ပေးပါတယ်။\n", + "* **Dense Optical Flow** က pixel တစ်ခုချင်းစီ ဘယ်နေရာကို ရွှေ့နေတယ်ဆိုတာကို ပြသတဲ့ vector field ကို တွက်ချက်ပေးပါတယ်။\n", + "* **Sparse Optical Flow** က ပုံရိပ်ထဲမှာ ထင်ရှားတဲ့ feature (ဥပမာ edges) တချို့ကို ရွေးပြီး frame တစ်ခုမှ တစ်ခုသို့ trajectory ကို တည်ဆောက်ပေးပါတယ်။\n", "\n", - "Optical flow အကြောင်းကို [ဒီအထူးကောင်းမွန်တဲ့ သင်ခန်းစာ](https://learnopencv.com/optical-flow-in-opencv/) မှာ ပိုမိုလေ့လာနိုင်ပါတယ်။\n", + "Optical Flow အကြောင်းကို [ဒီအလွန်ကောင်းမွန်တဲ့ tutorial](https://learnopencv.com/optical-flow-in-opencv/) မှာ ပိုမိုဖတ်ရှုနိုင်ပါတယ်။\n", "\n", "အခုတော့ frame တွေကြားမှာ dense optical flow ကို တွက်ချက်ကြည့်ရအောင်:\n" ] @@ -679,9 +679,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "တစ်ခုချင်းစီသော frame အတွက် flow တွင် frame ၏ အတိုင်းအတာနှင့် optical flow vector ၏ x နှင့် y components နှစ်ခုကို ကိုယ်စားပြုသော channel နှစ်ခုပါရှိသည်။\n", + "တစ်ခုချင်းစီသော frame အတွက် flow တွင် frame ၏ အရွယ်အစားနှင့် optical flow vector ၏ x နှင့် y အစိတ်အပိုင်းများနှင့် ကိုက်ညီသော channel ၂ ခုပါရှိသည်။\n", "\n", - "Optical flow ကို 2D မှာ ပြသရန် အနည်းငယ်ခက်ခဲနိုင်ပေမယ့် တစ်ခုထူးခြားသော အကြံဉာဏ်ကို အသုံးပြုနိုင်ပါတယ်။ Optical flow ကို polar coordinates သို့ ပြောင်းလဲပါက pixel တစ်ခုချင်းစီအတွက် *direction* နှင့် *intensity* ဆိုသော components နှစ်ခုရရှိမည်ဖြစ်သည်။ Intensity ကို pixel intensity ဖြင့် ကိုယ်စားပြုနိုင်ပြီး၊ direction ကို အရောင်အမျိုးမျိုးဖြင့် ကိုယ်စားပြုနိုင်ပါသည်။ [HSV (Hue-Saturation-Value) color space](https://en.wikipedia.org/wiki/HSV_color_space) တွင် Hue ကို direction ဖြင့် သတ်မှတ်ပြီး၊ Value ကို intensity ဖြင့် သတ်မှတ်ကာ Saturation ကို 255 အဖြစ် သတ်မှတ်ထားသော ပုံတစ်ပုံကို ဖန်တီးသွားမည်ဖြစ်သည်။\n" + "Optical flow ကို 2D အနေဖြင့် ပြသရန် အနည်းငယ် ခက်ခဲနိုင်ပါသည်၊ သို့သော် ကျွန်ုပ်တို့သည် တစ်ခုသော ထူးခြားသော အကြံကို အသုံးပြုနိုင်ပါသည်။ Optical flow ကို polar coordinates သို့ ပြောင်းလဲပါက၊ pixel တစ်ခုချင်းစီအတွက် *direction* နှင့် *intensity* ဆိုသည့် အစိတ်အပိုင်း ၂ ခုရရှိမည်ဖြစ်သည်။ Intensity ကို pixel intensity ဖြင့် ကိုယ်စားပြုနိုင်ပြီး၊ direction ကို အရောင်အမျိုးမျိုးဖြင့် ကိုယ်စားပြုနိုင်ပါသည်။ ကျွန်ုပ်တို့သည် [HSV (Hue-Saturation-Value) color space](https://en.wikipedia.org/wiki/HSV_color_space) တွင် ပုံတစ်ပုံ ဖန်တီးမည်ဖြစ်ပြီး၊ hue ကို direction ဖြင့် သတ်မှတ်မည်၊ value ကို intensity ဖြင့် သတ်မှတ်မည်၊ saturation ကို 255 အဖြစ် သတ်မှတ်မည်။\n" ] }, { @@ -730,16 +730,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "အဲဒီ frame တွေမှာ အစိမ်းရောင်က ဘယ်ဘက်ကိုရွှေ့နေတာကို ဖော်ပြပြီး အပြာရောင်က ညာဘက်ကိုရွှေ့နေတာကို ဖော်ပြပါတယ်။\n", + "ထိုဖရိမ်များတွင် အစိမ်းရောင်သည် ဘယ်ဘက်သို့ရွှေ့နေမှုကို ဖော်ပြပြီး အပြာရောင်သည် ညာဘက်သို့ရွှေ့နေမှုကို ဖော်ပြသည်။\n", "\n", - "Optical flow ဟာ အရပ်ရပ်မှာ ရွှေ့လျားမှုရဲ့ အထွေထွေဦးတည်မှုကို သုံးသပ်ဖို့ အလွန်ကောင်းတဲ့ကိရိယာတစ်ခုဖြစ်ပါတယ်။ ဥပမာအားဖြင့် frame တစ်ခုမှာ pixel အားလုံးဟာ တစ်ဦးတည်းသော ဦးတည်မှုတစ်ခုကို အနည်းငယ်ရွှေ့နေတယ်ဆိုရင် - ကင်မရာရွှေ့လျားမှုရှိတယ်လို့ သတ်မှတ်နိုင်ပြီး အဲဒီကို ပြန်လည်လျှော့ချဖို့ ကြိုးစားနိုင်ပါတယ်။\n" + "Optical flow သည် အရွေ့လမ်းညွှန်မှုအကြောင်း အထွေထွေသုံးသပ်ချက်များဆွဲထုတ်ရန် အလွန်ကောင်းမွန်သော ကိရိယာတစ်ခုဖြစ်နိုင်သည်။ ဥပမာအားဖြင့်၊ ဖရိမ်တစ်ခုအတွင်းရှိ pixel အားလုံးသည် အနည်းငယ်တစ်မျှတည်းသော ဦးတည်ချက်တစ်ခုသို့ရွှေ့နေသည်ကို တွေ့ရပါက - ကင်မရာရွေ့လျားမှုရှိနေသည်ဟု သင်သုံးသပ်နိုင်ပြီး ထိုရွေ့လျားမှုကို အစားထိုးဖို့ ကြိုးစားနိုင်ပါသည်။\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**အကြောင်းကြားချက်**: \nဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှုအတွက် ကြိုးစားနေသော်လည်း၊ အလိုအလျောက် ဘာသာပြန်မှုများတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါဝင်နိုင်သည်ကို သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတရားရှိသော အရင်းအမြစ်အဖြစ် ရှုလို့ရပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူက ဘာသာပြန်မှု ဝန်ဆောင်မှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်မှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော အလွဲအလွတ်များ သို့မဟုတ် အနားလွဲမှုများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။\n" + "\n---\n\n**ဝက်ဘ်ဆိုက်မှတ်ချက်**: \nဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်မှုများတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်ရန် လိုအပ်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူကောင်းမွန်သော ပရော်ဖက်ရှင်နယ်ဘာသာပြန်ဝန်ဆောင်မှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်မှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပါယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။\n" ] } ], @@ -766,8 +766,8 @@ }, "orig_nbformat": 4, "coopTranslator": { - "original_hash": "ad5bdca62175c7a3d4336ef8c761aef3", - "translation_date": "2025-08-30T09:21:30+00:00", + "original_hash": "339b2129f86b24024393ff92b8bd376f", + "translation_date": "2025-09-07T15:22:26+00:00", "source_file": "lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb", "language_code": "my" } diff --git a/translations/ne/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb b/translations/ne/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb index dd89d454..22b0a72a 100644 --- a/translations/ne/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb +++ b/translations/ne/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb @@ -6,13 +6,13 @@ "source": [ "# कम्प्युटर भिजन र OpenCV\n", "\n", - "यो नोटबुक [AI for Beginners Curriculum](http://aka.ms/ai-beginners) को हिस्सा हो।\n", + "यो नोटबुक [AI for Beginners Curriculum](http://aka.ms/ai-beginners) को एक हिस्सा हो।\n", "\n", - "[OpenCV](https://opencv.org/) लाई छविहरू प्रशोधनका लागि *de facto* मानक मानिन्छ। यसमा धेरै उपयोगी एल्गोरिदमहरू छन्, जुन C++ मा कार्यान्वयन गरिएका छन्। तपाईं Python बाट पनि OpenCV प्रयोग गर्न सक्नुहुन्छ।\n", + "[OpenCV](https://opencv.org/) लाई छविहरू प्रशोधनका लागि *de facto* मानक मानिन्छ। यसमा धेरै उपयोगी एल्गोरिदमहरू छन्, जुन C++ मा कार्यान्वयन गरिएको छ। तपाईं Python बाट पनि OpenCV प्रयोग गर्न सक्नुहुन्छ।\n", "\n", "यस नोटबुकमा, हामी तपाईंलाई OpenCV प्रयोग गर्ने केही उदाहरणहरू दिनेछौं। थप जानकारीका लागि, तपाईं [Learn OpenCV](https://learnopencv.com/getting-started-with-opencv/) अनलाइन कोर्समा जान सक्नुहुन्छ।\n", "\n", - "सबैभन्दा पहिले, आउनुहोस् `import cv2` गरौं, साथै केही अन्य उपयोगी पुस्तकालयहरू पनि:\n" + "सुरुमा, `cv2` लाई, साथै केही अन्य उपयोगी पुस्तकालयहरूलाई `import` गरौं:\n" ] }, { @@ -42,11 +42,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## छविहरू लोड गर्दै\n", + "## तस्वीरहरू लोड गर्दै\n", "\n", - "Python मा छविहरूलाई सजिलैसँग NumPy एरेहरूद्वारा प्रतिनिधित्व गर्न सकिन्छ। उदाहरणका लागि, 320x200 पिक्सेल आकारको ग्रेस्केल छवि 200x320 एरेमा भण्डारण गरिन्छ, र त्यही आयामको रङ्गीन छविको आकार 200x320x3 हुन्छ (३ रङ्ग च्यानलहरूको लागि)।\n", + "Python मा तस्वीरहरूलाई सजिलैसँग NumPy arrays द्वारा प्रतिनिधित्व गर्न सकिन्छ। उदाहरणका लागि, 320x200 पिक्सेलको आकार भएको ग्रेस्केल तस्वीरलाई 200x320 array मा संग्रहित गरिन्छ, र समान आयामको रंगीन तस्वीरको आकार 200x320x3 हुन्छ (३ रंग च्यानलहरूको लागि)।\n", "\n", - "आउनुहोस्, एउटा छवि लोड गरेर सुरु गरौं:\n" + "अब एउटा तस्वीर लोड गरेर सुरु गरौं:\n" ] }, { @@ -135,7 +135,7 @@ "source": [ "bw_im = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)\n", "print(bw_im.shape)\n", - "plt.imshow(bw_im)" + "plt.imshow(bw_im, cmap='gray')" ] }, { @@ -144,7 +144,7 @@ "source": [ "## ब्रेल छवि प्रशोधन\n", "\n", - "यदि हामी पाठ चिन्ह्न छवि वर्गीकरण लागू गर्न चाहन्छौं भने, हामीले व्यक्तिगत प्रतीकहरू काटेर तिनीहरूलाई MNIST छविहरूसँग मिल्दोजुल्दो बनाउन आवश्यक छ, जुन हामीले पहिले देखेका थियौं। यो [वस्तु पहिचान](../11-ObjectDetection/README.md) प्रविधि प्रयोग गरेर गर्न सकिन्छ, जुन हामी पछि छलफल गर्नेछौं, तर हामी यसका लागि शुद्ध कम्प्युटर भिजन पनि प्रयोग गर्न प्रयास गर्न सक्छौं। कम्प्युटर भिजन कसरी क्यारेक्टर छुट्याउन प्रयोग गर्न सकिन्छ भन्ने राम्रो विवरण [यस ब्लग पोस्टमा](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) पाइन्छ - हामी यहाँ केही कम्प्युटर भिजन प्रविधिहरूमा मात्र ध्यान केन्द्रित गर्नेछौं।\n", + "यदि हामीले पाठलाई चिन्ने छवि वर्गीकरण लागू गर्न चाहन्छौं भने, हामीले व्यक्तिगत प्रतीकहरू काटेर तिनीहरूलाई MNIST छविहरूसँग मिल्दोजुल्दो बनाउन आवश्यक छ, जुन हामीले पहिले देखेका थियौं। यो [वस्तु पहिचान](../11-ObjectDetection/README.md) प्रविधि प्रयोग गरेर गर्न सकिन्छ, जुन हामी पछि छलफल गर्नेछौं, तर हामी यसका लागि शुद्ध कम्प्युटर भिजन पनि प्रयोग गर्न प्रयास गर्न सक्छौं। कम्प्युटर भिजन कसरी क्यारेक्टर छुट्याउन प्रयोग गर्न सकिन्छ भन्ने राम्रो विवरण [यस ब्लग पोस्टमा](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) पाइन्छ - हामी यहाँ केही कम्प्युटर भिजन प्रविधिहरूमा मात्र ध्यान केन्द्रित गर्नेछौं।\n", "\n", "पहिले, छविलाई अलिकति सुधार गर्ने प्रयास गरौं। हामी **थ्रेसहोल्डिङ** को विचार प्रयोग गर्न सक्छौं (यो [OpenCV लेखमा](https://docs.opencv.org/4.x/d7/d4d/tutorial_py_thresholding.html) राम्रोसँग वर्णन गरिएको छ):\n" ] @@ -252,7 +252,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "व्यक्तिगत अक्षरहरू छुट्याउन, हामीलाई सम्पूर्ण पाठको बाउन्डिङ बक्स थाहा हुनुपर्छ। यसलाई पत्ता लगाउन, हामीले न्यूनतम र अधिकतम समन्वयहरू गणना गर्न सक्छौं:\n" + "पृथक अक्षरहरू छुट्याउन, हामीलाई सम्पूर्ण पाठको बाउन्डिङ बक्स थाहा हुनुपर्छ। यसलाई पत्ता लगाउन, हामीले न्यूनतम र अधिकतम निर्देशांकहरू गणना गर्न सक्छौं।\n" ] }, { @@ -293,7 +293,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "यस पाठलाई आंशिक रूपमा घुमाउन सकिन्छ, र यसलाई पूर्ण रूपमा सिधा बनाउनको लागि तथाकथित **परिप्रेक्ष्य रूपान्तरण** गर्न आवश्यक छ। हामी बिन्दुहरू $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ द्वारा परिभाषित आयत लिनेछौं र यसलाई समानुपातिक आयामहरूको नयाँ छविसँग सिधा बनाउनेछौं।\n" + "यस पाठलाई आंशिक रूपमा घुमाउन सकिन्छ, र यसलाई पूर्ण रूपमा सन्तुलित बनाउनको लागि हामीलाई तथाकथित **परिप्रेक्ष्य रूपान्तरण** गर्न आवश्यक छ। हामी बिन्दुहरू $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ द्वारा परिभाषित आयत लिनेछौं र समानुपातिक आयामहरू भएको नयाँ छविसँग सन्तुलित गर्नेछौं:\n" ] }, { @@ -387,13 +387,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## फ्रेम फरकद्वारा गति पत्ता लगाउने\n", + "## फ्रेम भिन्नता प्रयोग गरेर गति पत्ता लगाउने\n", "\n", - "भिडियो स्ट्रिममा गति पत्ता लगाउनु धेरै सामान्य कार्य हो। उदाहरणका लागि, यसले हामीलाई निगरानी क्यामेरामा केही घटना हुँदा सचेत गराउन मद्दत गर्दछ। यदि हामी क्यामेरामा के भइरहेको छ बुझ्न चाहन्छौं भने, हामी न्युरल नेटवर्क प्रयोग गर्न सक्छौं - तर जब हामीलाई थाहा हुन्छ कि केही भइरहेको छ, न्युरल नेटवर्क प्रयोग गर्नु धेरै सस्तो हुन्छ।\n", + "भिडियो स्ट्रिममा गति पत्ता लगाउनु धेरै सामान्य कार्य हो। उदाहरणका लागि, यसले हामीलाई निगरानी क्यामेरामा केही घटना हुँदा सतर्कता प्राप्त गर्न मद्दत गर्दछ। यदि हामी क्यामेरामा के भइरहेको छ बुझ्न चाहन्छौं भने, हामी न्युरल नेटवर्क प्रयोग गर्न सक्छौं - तर जब हामीलाई थाहा हुन्छ कि केही भइरहेको छ, न्युरल नेटवर्क प्रयोग गर्नु धेरै सस्तो हुन्छ।\n", "\n", - "गति पत्ता लगाउने मुख्य विचार सरल छ। यदि क्यामेरा स्थिर छ भने, क्यामेराबाट आउने फ्रेमहरू एकअर्कासँग धेरै समान हुनु पर्छ। फ्रेमहरू एरेको रूपमा प्रतिनिधित्व गरिन्छ, त्यसैले दुई लगातार फ्रेमहरूको एरे घटाएर हामी पिक्सेल फरक पत्ता लगाउन सक्छौं, जुन स्थिर फ्रेमहरूको लागि कम हुनुपर्छ, र छविमा महत्वपूर्ण गति हुँदा उच्च हुन थाल्छ।\n", + "गति पत्ता लगाउने मुख्य विचार सरल छ। यदि क्यामेरा स्थिर छ भने, क्यामेराबाट आउने फ्रेमहरू एक अर्कासँग धेरै समान हुनु पर्छ। फ्रेमहरू एरेको रूपमा प्रतिनिधित्व गरिन्छ, त्यसैले दुई लगातार फ्रेमहरूको एरे घटाउँदा हामी पिक्सेल भिन्नता प्राप्त गर्न सक्छौं, जुन स्थिर फ्रेमहरूको लागि कम हुनुपर्छ, र छविमा महत्वपूर्ण गति हुँदा उच्च हुन थाल्छ।\n", "\n", - "हामी भिडियो कसरी खोल्ने र यसलाई फ्रेमहरूको क्रममा रूपान्तरण गर्ने सिक्न सुरु गर्नेछौं:\n" + "हामी भिडियो कसरी खोल्ने र यसलाई फ्रेमहरूको अनुक्रममा रूपान्तरण गर्ने सिक्न सुरु गर्नेछौं:\n" ] }, { @@ -441,7 +441,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "रंग गति पत्ता लगाउन यति महत्त्वपूर्ण नभएकोले, हामी सबै फ्रेमहरूलाई ग्रेस्केलमा रूपान्तरण गर्नेछौं। त्यसपछि, हामी फ्रेम भिन्नताहरू गणना गर्नेछौं, र तिनीहरूको मानहरू प्लट गरेर गतिविधिको मात्रा दृश्य रूपमा हेर्नेछौं:\n" + "रंग गति पत्ता लगाउन त्यति महत्त्वपूर्ण नभएकोले, हामी सबै फ्रेमहरूलाई ग्रेस्केलमा रूपान्तरण गर्नेछौं। त्यसपछि, हामी फ्रेम भिन्नताहरू गणना गर्नेछौं, र तिनीहरूको नर्महरू प्लट गरेर गतिविधिको मात्रा दृश्य रूपमा हेर्नेछौं:\n" ] }, { @@ -486,7 +486,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "मानौं हामी यस्तो प्रतिवेदन बनाउन चाहन्छौं जसले क्यामेराको अगाडि के भयो भनेर देखाउँछ, प्रत्येक पटक केही हुँदा उपयुक्त छवि देखाएर। यो गर्नका लागि, हामीले सम्भवतः \"घटना\" को सुरु र अन्त्य फ्रेम पत्ता लगाउन चाहन्छौं, र बीचको फ्रेम प्रदर्शन गर्न चाहन्छौं। केही अव्यवस्था हटाउनका लागि, हामी माथिको वक्रलाई चलायमान औसत कार्यको साथ सम्याउनेछौं:\n" + "मानौं हामी यस्तो प्रतिवेदन बनाउन चाहन्छौं जसले क्यामेराको अगाडि के भयो भनेर देखाउँछ, प्रत्येक पटक केही हुँदा उपयुक्त छवि देखाएर। यो गर्नका लागि, हामी सम्भवतः \"घटना\" को सुरु र अन्त्य फ्रेम पत्ता लगाउन चाहन्छौं, र बीचको फ्रेम प्रदर्शन गर्न चाहन्छौं। केही आवाज हटाउनका लागि, हामी माथिको वक्रलाई चलायमान औसत कार्यको साथ पनि समतल बनाउनेछौं:\n" ] }, { @@ -531,7 +531,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "अब हामी `np.where` प्रयोग गरेर थ्रेसहोल्डभन्दा माथि परिवर्तनहरूको मात्रा भएका फ्रेमहरू पत्ता लगाउन सक्छौं, र ३० फ्रेमभन्दा लामो लगातार फ्रेमहरूको श्रृंखला निकाल्न सक्छौं:\n" + "अब हामी `np.where` प्रयोग गरेर थ्रेसहोल्डभन्दा माथि परिवर्तनहरूको मात्रा भएका फ्रेमहरू पत्ता लगाउन सक्छौं, र ३० फ्रेमभन्दा लामो लगातार फ्रेमहरूको अनुक्रम निकाल्न सक्छौं:\n" ] }, { @@ -646,11 +646,11 @@ "दुई लगातार फ्रेमहरू तुलना गर्दा परिवर्तनको मात्रा देख्न सकिन्छ, तर यसले के चलिरहेको छ र कहाँ चलिरहेको छ भन्ने जानकारी दिँदैन। यो जानकारी प्राप्त गर्न, **[अप्टिकल फ्लो](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)** नामक प्रविधि प्रयोग गरिन्छ:\n", "\n", "* **डेंस अप्टिकल फ्लो** प्रत्येक पिक्सेल कहाँ सर्दैछ भनेर देखाउने भेक्टर फिल्ड गणना गर्छ।\n", - "* **स्पार्स अप्टिकल फ्लो** छवि भित्र केही विशेष विशेषताहरू (जस्तै किनारहरू) लिन्छ र फ्रेमदेखि फ्रेमसम्म तिनीहरूको ट्राजेक्टोरी बनाउँछ।\n", + "* **स्पार्स अप्टिकल फ्लो** छवि भित्र केही विशेष विशेषताहरू (जस्तै किनाराहरू) लिन्छ र फ्रेमदेखि फ्रेमसम्म तिनीहरूको ट्राजेक्टोरी निर्माण गर्छ।\n", "\n", "अप्टिकल फ्लोबारे थप जानकारी [यस उत्कृष्ट ट्युटोरियलमा](https://learnopencv.com/optical-flow-in-opencv/) पढ्नुहोस्।\n", "\n", - "आउनुहोस्, हाम्रो फ्रेमहरू बीच डेंस अप्टिकल फ्लो गणना गरौं:\n" + "अब हाम्रा फ्रेमहरू बीच डेंस अप्टिकल फ्लो गणना गरौं:\n" ] }, { @@ -679,9 +679,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "प्रत्येक फ्रेमको लागि, फ्लोमा फ्रेमको आयाम हुन्छ, र २ च्यानलहरू हुन्छन्, जसले अप्टिकल फ्लो भेक्टरको x र y कम्पोनेन्टहरूलाई प्रतिनिधित्व गर्छ।\n", + "जस्तो कि तपाईंले देख्न सक्नुहुन्छ, प्रत्येक फ्रेमको लागि फ्लोमा फ्रेमको आयाम हुन्छ, र २ च्यानलहरू हुन्छन्, जसले अप्टिकल फ्लो भेक्टरको x र y कम्पोनेन्टलाई प्रतिनिधित्व गर्छ।\n", "\n", - "२D मा अप्टिकल फ्लो देखाउनु अलि चुनौतीपूर्ण हुन्छ, तर हामी एउटा चतुर विचार प्रयोग गर्न सक्छौं। यदि हामी अप्टिकल फ्लोलाई पोलर कोअर्डिनेटमा रूपान्तरण गर्छौं भने, प्रत्येक पिक्सेलको लागि दुई कम्पोनेन्टहरू प्राप्त हुन्छ: *दिशा* र *तीव्रता*। हामी तीव्रतालाई पिक्सेलको तीव्रताले प्रतिनिधित्व गर्न सक्छौं, र दिशालाई विभिन्न रंगहरूले। हामी [HSV (Hue-Saturation-Value) कलर स्पेस](https://en.wikipedia.org/wiki/HSV_color_space) मा एउटा इमेज बनाउनेछौं, जहाँ ह्यू दिशाले परिभाषित हुनेछ, भ्यालु - तीव्रताले, र स्याचुरेसन २५५ हुनेछ।\n" + "२D मा अप्टिकल फ्लो देखाउनु अलि चुनौतीपूर्ण हुन सक्छ, तर हामी एउटा चतुर विचार प्रयोग गर्न सक्छौं। यदि हामी अप्टिकल फ्लोलाई पोलर कोअर्डिनेटमा रूपान्तरण गर्छौं भने, प्रत्येक पिक्सेलको लागि दुई कम्पोनेन्ट प्राप्त हुनेछ: *दिशा* र *तीव्रता*। हामी तीव्रतालाई पिक्सेलको तीव्रताले प्रतिनिधित्व गर्न सक्छौं, र दिशालाई विभिन्न रंगहरूले। हामी [HSV (Hue-Saturation-Value) कलर स्पेस](https://en.wikipedia.org/wiki/HSV_color_space) मा एउटा इमेज बनाउनेछौं, जहाँ ह्यु दिशाले परिभाषित हुनेछ, भ्यालु - तीव्रताले, र स्याचुरेसन २५५ हुनेछ।\n" ] }, { @@ -730,16 +730,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "त्यसैले, ती फ्रेमहरूमा हरियो रङले बायाँतिर सर्ने संकेत गर्छ, जबकि नीलो रङले दायाँतिर सर्ने संकेत गर्छ।\n", + "त्यसैले, ती फ्रेमहरूमा हरियो रंगले बायाँतिरको गति देखाउँछ भने नीलो रंगले दायाँतिरको गति देखाउँछ।\n", "\n", - "अप्टिकल फ्लो सामान्य गतिको दिशा बारे निष्कर्ष निकाल्नको लागि उत्कृष्ट उपकरण हुन सक्छ। उदाहरणका लागि, यदि तपाईंले फ्रेमका सबै पिक्सेलहरू झण्डै एउटै दिशामा सर्दै गरेको देख्नुभयो भने - तपाईंले क्यामेराको गति भएको निष्कर्ष निकाल्न सक्नुहुन्छ, र त्यसलाई क्षतिपूर्ति गर्न प्रयास गर्न सक्नुहुन्छ।\n" + "अप्टिकल फ्लो सामान्य गति दिशाको बारेमा निष्कर्ष निकाल्नको लागि उत्कृष्ट उपकरण हुन सक्छ। उदाहरणका लागि, यदि तपाईंले फ्रेमका सबै पिक्सेलहरू लगभग एउटै दिशामा गइरहेको देख्नुभयो भने - तपाईं क्यामेरा गति भएको निष्कर्ष निकाल्न सक्नुहुन्छ, र त्यसलाई क्षतिपूर्ति गर्न प्रयास गर्न सक्नुहुन्छ।\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**अस्वीकरण**: \nयो दस्तावेज़ AI अनुवाद सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) प्रयोग गरी अनुवाद गरिएको हो। हामी यथासम्भव सटीकता सुनिश्चित गर्न प्रयास गर्छौं, तर कृपया ध्यान दिनुहोस् कि स्वचालित अनुवादहरूमा त्रुटि वा अशुद्धता हुन सक्छ। यसको मूल भाषामा रहेको मूल दस्तावेज़लाई आधिकारिक स्रोत मानिनुपर्छ। महत्त्वपूर्ण जानकारीका लागि, व्यावसायिक मानव अनुवाद सिफारिस गरिन्छ। यस अनुवादको प्रयोगबाट उत्पन्न हुने कुनै पनि गलतफहमी वा गलत व्याख्याका लागि हामी जिम्मेवार हुने छैनौं।\n" + "\n---\n\n**अस्वीकरण**: \nयो दस्तावेज़ AI अनुवाद सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) प्रयोग गरेर अनुवाद गरिएको छ। हामी शुद्धताको लागि प्रयास गर्छौं, तर कृपया ध्यान दिनुहोस् कि स्वचालित अनुवादहरूमा त्रुटि वा अशुद्धता हुन सक्छ। यसको मूल भाषा मा रहेको मूल दस्तावेज़लाई आधिकारिक स्रोत मानिनुपर्छ। महत्वपूर्ण जानकारीको लागि, व्यावसायिक मानव अनुवाद सिफारिस गरिन्छ। यस अनुवादको प्रयोगबाट उत्पन्न हुने कुनै पनि गलतफहमी वा गलत व्याख्याको लागि हामी जिम्मेवार हुने छैनौं।\n" ] } ], @@ -766,8 +766,8 @@ }, "orig_nbformat": 4, "coopTranslator": { - "original_hash": "ad5bdca62175c7a3d4336ef8c761aef3", - "translation_date": "2025-08-28T08:07:46+00:00", + "original_hash": "339b2129f86b24024393ff92b8bd376f", + "translation_date": "2025-09-07T15:01:14+00:00", "source_file": "lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb", "language_code": "ne" } diff --git a/translations/nl/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb b/translations/nl/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb index 9fd4b929..b6956e99 100644 --- a/translations/nl/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb +++ b/translations/nl/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb @@ -44,7 +44,7 @@ "source": [ "## Afbeeldingen Laden\n", "\n", - "Afbeeldingen in Python kunnen handig worden weergegeven door NumPy-arrays. Bijvoorbeeld, een grijswaardenafbeelding met een grootte van 320x200 pixels zou worden opgeslagen in een 200x320-array, en een kleurenafbeelding van dezelfde afmetingen zou de vorm 200x320x3 hebben (voor 3 kleurkanalen).\n", + "Afbeeldingen in Python kunnen handig worden weergegeven door NumPy-arrays. Bijvoorbeeld, een grijswaardenafbeelding met een grootte van 320x200 pixels zou worden opgeslagen in een 200x320-array, en een kleurenafbeelding van dezelfde afmetingen zou een vorm hebben van 200x320x3 (voor 3 kleurkanalen).\n", "\n", "Laten we beginnen met het laden van een afbeelding:\n" ] @@ -94,7 +94,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Zoals je kunt zien, is het een afbeelding van brailletekst. Aangezien we niet erg geïnteresseerd zijn in de daadwerkelijke kleur, kunnen we het omzetten naar zwart-wit:\n" + "Zoals je kunt zien, is het een afbeelding van brailletekst. Aangezien we niet erg geïnteresseerd zijn in de werkelijke kleur, kunnen we het omzetten naar zwart-wit:\n" ] }, { @@ -135,7 +135,7 @@ "source": [ "bw_im = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)\n", "print(bw_im.shape)\n", - "plt.imshow(bw_im)" + "plt.imshow(bw_im, cmap='gray')" ] }, { @@ -192,7 +192,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Om met afbeeldingen te werken, moeten we individuele punten \"extraheren\", d.w.z. de afbeeldingen omzetten naar een set coördinaten van individuele punten. We kunnen dat doen met behulp van **feature extraction**-technieken, zoals SIFT, SURF of [ORB](https://docs.opencv.org/4.x/d1/d89/tutorial_py_orb.html):\n" + "Om met afbeeldingen te werken, moeten we individuele stippen \"extraheren\", d.w.z. de afbeeldingen omzetten naar een set coördinaten van individuele stippen. Dat kunnen we doen met behulp van **feature extraction**-technieken, zoals SIFT, SURF of [ORB](https://docs.opencv.org/4.x/d1/d89/tutorial_py_orb.html):\n" ] }, { @@ -252,7 +252,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Om individuele tekens te scheiden, moeten we de begrenzingsbox van de hele tekst kennen. Om dit te achterhalen, kunnen we eenvoudig de minimale en maximale coördinaten berekenen:\n" + "Om afzonderlijke tekens te scheiden, moeten we de begrenzingsdoos van de hele tekst kennen. Om dit te achterhalen, kunnen we eenvoudig de minimale en maximale coördinaten berekenen:\n" ] }, { @@ -384,20 +384,20 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Je hebt gezien dat behoorlijk veel taken kunnen worden uitgevoerd met puur beeldverwerking, zonder enige kunstmatige intelligentie. Als we computervisie-technieken kunnen gebruiken om het werk van een neuraal netwerk eenvoudiger te maken - moeten we dat zeker doen, omdat het ons in staat stelt problemen op te lossen met een kleiner aantal trainingsgegevens.\n" + "Je hebt gezien dat behoorlijk veel taken kunnen worden uitgevoerd met puur beeldverwerking, zonder enige kunstmatige intelligentie. Als we computervisie-technieken kunnen gebruiken om het werk van een neuraal netwerk eenvoudiger te maken - dan moeten we dat zeker doen, omdat het ons in staat stelt problemen op te lossen met een kleinere hoeveelheid trainingsgegevens.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Bewegingsdetectie met behulp van Frameverschil\n", + "## Bewegingsdetectie met behulp van frameverschillen\n", "\n", - "Bewegingsdetectie in een videostream is een veelvoorkomende taak. Het stelt ons bijvoorbeeld in staat om meldingen te ontvangen wanneer er iets gebeurt op een bewakingscamera. Als we willen begrijpen wat er op de camera gebeurt, kunnen we een neuraal netwerk gebruiken - maar het is veel goedkoper om een neuraal netwerk in te zetten wanneer we al weten dat er iets aan de hand is.\n", + "Bewegingsdetectie in een videostream is een veelvoorkomende taak. Bijvoorbeeld, het stelt ons in staat om meldingen te ontvangen wanneer er iets gebeurt op een bewakingscamera. Als we willen begrijpen wat er op de camera gebeurt, kunnen we een neuraal netwerk gebruiken - maar het is veel goedkoper om een neuraal netwerk te gebruiken wanneer we weten dat er daadwerkelijk iets gaande is.\n", "\n", - "Het basisidee van bewegingsdetectie is eenvoudig. Als de camera vast staat, zouden de frames van de camera behoorlijk op elkaar moeten lijken. Aangezien frames worden weergegeven als arrays, kunnen we door deze arrays van twee opeenvolgende frames van elkaar af te trekken het pixelverschil berekenen. Dit verschil zou laag moeten zijn voor statische frames en hoger worden zodra er aanzienlijke beweging in het beeld is.\n", + "Het belangrijkste idee achter bewegingsdetectie is eenvoudig. Als de camera vast staat, zouden de frames van de camera behoorlijk op elkaar moeten lijken. Aangezien frames worden weergegeven als arrays, kunnen we door die arrays van twee opeenvolgende frames van elkaar af te trekken de pixelverschillen verkrijgen. Deze verschillen zouden laag moeten zijn voor statische frames en hoger worden zodra er aanzienlijke beweging in het beeld is.\n", "\n", - "We beginnen met leren hoe we een video kunnen openen en omzetten in een reeks frames:\n" + "We beginnen met leren hoe we een video kunnen openen en omzetten naar een reeks frames:\n" ] }, { @@ -445,7 +445,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Aangezien kleur niet zo belangrijk is voor bewegingsdetectie, zullen we alle frames omzetten naar grijswaarden. Vervolgens berekenen we de framedifferenties en plotten we hun normen om visueel de hoeveelheid activiteit te zien:\n" + "Aangezien kleur niet zo belangrijk is voor bewegingsdetectie, zullen we alle frames omzetten naar grijstinten. Vervolgens berekenen we de framedifferenties en plotten we hun normen om visueel de hoeveelheid activiteit te zien:\n" ] }, { @@ -490,7 +490,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Stel dat we een rapport willen maken dat laat zien wat er voor de camera is gebeurd door telkens de geschikte afbeelding te tonen wanneer er iets gebeurt. Om dit te doen, willen we waarschijnlijk het begin- en eindframe van een \"gebeurtenis\" vinden en het middelste frame weergeven. Om wat ruis te verwijderen, zullen we ook de curve hierboven gladstrijken met een bewegend gemiddelde functie:\n" + "Stel dat we een rapport willen maken dat laat zien wat er voor de camera is gebeurd door elke keer dat er iets gebeurt de geschikte afbeelding te tonen. Om dit te doen, willen we waarschijnlijk het begin- en eindframe van een \"gebeurtenis\" vinden en het middelste frame weergeven. Om wat ruis te verwijderen, zullen we ook de curve hierboven gladstrijken met een moving average-functie:\n" ] }, { @@ -535,7 +535,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Nu kunnen we frames vinden die een aantal veranderingen boven de drempel hebben door `np.where` te gebruiken, en een reeks opeenvolgende frames extraheren die langer is dan 30 frames:\n" + "Nu kunnen we frames vinden die een hoeveelheid veranderingen boven de drempel hebben door `np.where` te gebruiken, en een reeks opeenvolgende frames extraheren die langer is dan 30 frames:\n" ] }, { @@ -571,7 +571,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "En uiteindelijk kunnen we de afbeelding weergeven:\n" + "En tot slot kunnen we de afbeelding weergeven:\n" ] }, { @@ -610,7 +610,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Je kunt merken dat het kleurenschema op deze afbeelding er niet goed uitziet! Dit komt omdat OpenCV om historische redenen afbeeldingen laadt in de BGR-kleurruimte, terwijl matplotlib de meer traditionele RGB-kleurenvolgorde gebruikt. Meestal is het logisch om afbeeldingen direct na het laden naar RGB te converteren.\n" + "Je merkt misschien dat het kleurenschema op deze afbeelding er niet goed uitziet! Dit komt omdat OpenCV om historische redenen afbeeldingen laadt in de BGR-kleurruimte, terwijl matplotlib de meer traditionele RGB-kleurenvolgorde gebruikt. Meestal is het logisch om afbeeldingen direct na het laden naar RGB om te zetten.\n" ] }, { @@ -651,10 +651,10 @@ "source": [ "## Beweging extraheren met optische stroming\n", "\n", - "Hoewel het vergelijken van twee opeenvolgende frames ons de hoeveelheid veranderingen laat zien, geeft het geen informatie over wat er precies beweegt en waar. Om die informatie te verkrijgen, is er een techniek genaamd **[optische stroming](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)**:\n", + "Hoewel het vergelijken van twee opeenvolgende frames ons de hoeveelheid veranderingen laat zien, geeft het geen informatie over wat daadwerkelijk beweegt en waar. Om die informatie te verkrijgen, is er een techniek genaamd **[optische stroming](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)**:\n", "\n", "* **Dichte optische stroming** berekent het vectorveld dat voor elke pixel laat zien waar deze naartoe beweegt.\n", - "* **Schaars optische stroming** is gebaseerd op het nemen van enkele onderscheidende kenmerken in het beeld (bijv. randen) en het opbouwen van hun traject van frame tot frame.\n", + "* **Spaarzame optische stroming** is gebaseerd op het nemen van enkele onderscheidende kenmerken in de afbeelding (bijv. randen) en het opbouwen van hun traject van frame tot frame.\n", "\n", "Lees meer over optische stroming [in deze geweldige tutorial](https://learnopencv.com/optical-flow-in-opencv/).\n", "\n", @@ -687,9 +687,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Zoals je kunt zien, heeft de flow voor elk frame de afmetingen van het frame en 2 kanalen, die overeenkomen met de x- en y-componenten van de optische flowvector.\n", + "Zoals je kunt zien, heeft de stroom voor elk frame de afmetingen van het frame en 2 kanalen, die overeenkomen met de x- en y-componenten van de optische stroomvector.\n", "\n", - "Het weergeven van optische flow in 2D is een beetje uitdagend, maar we kunnen een slimme aanpak gebruiken. Als we de optische flow omzetten naar polaire coördinaten, krijgen we twee componenten voor elke pixel: *richting* en *intensiteit*. We kunnen intensiteit weergeven door de pixelintensiteit, en richting door verschillende kleuren. We zullen een afbeelding maken in de [HSV (Hue-Saturation-Value) kleurenspace](https://en.wikipedia.org/wiki/HSV_color_space), waarbij de tint wordt bepaald door de richting, de waarde door de intensiteit, en de verzadiging op 255 wordt ingesteld.\n" + "Het weergeven van optische stroom in 2D is een beetje uitdagend, maar we kunnen een slimme aanpak gebruiken. Als we de optische stroom omzetten naar polaire coördinaten, krijgen we twee componenten voor elke pixel: *richting* en *intensiteit*. We kunnen intensiteit weergeven door de pixelintensiteit, en richting door verschillende kleuren. We zullen een afbeelding maken in de [HSV (Hue-Saturation-Value) kleurenspace](https://en.wikipedia.org/wiki/HSV_color_space), waarbij de tint wordt bepaald door de richting, de waarde door de intensiteit, en de verzadiging op 255 wordt gezet.\n" ] }, { @@ -740,14 +740,14 @@ "source": [ "Dus, in die frames komt de groenachtige kleur overeen met beweging naar links, terwijl blauw overeenkomt met beweging naar rechts.\n", "\n", - "Optische stroming kan een geweldig hulpmiddel zijn om conclusies te trekken over de algemene bewegingsrichting. Bijvoorbeeld, als je ziet dat alle pixels in een frame min of meer in één richting bewegen, kun je concluderen dat er camerabeweging is en proberen dat te compenseren.\n" + "Optische stroming kan een geweldig hulpmiddel zijn om conclusies te trekken over de algemene bewegingsrichting. Bijvoorbeeld, als je ziet dat alle pixels in een frame min of meer in één richting bewegen - kun je concluderen dat er camerabeweging is, en proberen dat te compenseren.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**Disclaimer**: \nDit document is vertaald met behulp van de AI-vertalingsservice [Co-op Translator](https://github.com/Azure/co-op-translator). Hoewel we ons best doen voor nauwkeurigheid, dient u zich ervan bewust te zijn dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in zijn oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor cruciale informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling.\n" + "\n---\n\n**Disclaimer**: \nDit document is vertaald met behulp van de AI-vertalingsservice [Co-op Translator](https://github.com/Azure/co-op-translator). Hoewel we streven naar nauwkeurigheid, willen we u erop wijzen dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in de oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor kritieke informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling.\n" ] } ], @@ -774,8 +774,8 @@ }, "orig_nbformat": 4, "coopTranslator": { - "original_hash": "ad5bdca62175c7a3d4336ef8c761aef3", - "translation_date": "2025-08-28T20:45:08+00:00", + "original_hash": "339b2129f86b24024393ff92b8bd376f", + "translation_date": "2025-09-07T15:10:53+00:00", "source_file": "lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb", "language_code": "nl" } diff --git a/translations/no/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb b/translations/no/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb index ea462ae8..ec163425 100644 --- a/translations/no/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb +++ b/translations/no/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb @@ -44,7 +44,7 @@ "source": [ "## Laste inn bilder\n", "\n", - "Bilder i Python kan enkelt representeres ved hjelp av NumPy-arrays. For eksempel vil et gråtonet bilde med størrelsen 320x200 piksler lagres i et 200x320-array, og et fargebilde med samme dimensjon vil ha formen 200x320x3 (for 3 fargekanaler).\n", + "Bilder i Python kan enkelt representeres som NumPy-arrays. For eksempel vil et gråtonet bilde med størrelse 320x200 piksler lagres i et 200x320-array, og et fargebilde med samme dimensjon vil ha formen 200x320x3 (for 3 fargekanaler).\n", "\n", "La oss starte med å laste inn et bilde:\n" ] @@ -94,7 +94,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Som du kan se, er det et bilde av punktskrift. Siden vi ikke er veldig interessert i den faktiske fargen, kan vi konvertere det til svart-hvitt:\n" + "Som du kan se, er det et bilde av punktskrift. Siden vi ikke er særlig interessert i selve fargen, kan vi konvertere det til svart-hvitt:\n" ] }, { @@ -135,16 +135,16 @@ "source": [ "bw_im = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)\n", "print(bw_im.shape)\n", - "plt.imshow(bw_im)" + "plt.imshow(bw_im, cmap='gray')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Prosessering av Braille-bilder\n", + "## Behandling av bilder med blindeskrift\n", "\n", - "Hvis vi ønsker å bruke bildegjenkjenning for å identifisere teksten, må vi klippe ut individuelle symboler for å gjøre dem lik MNIST-bilder som vi har sett tidligere. Dette kan gjøres ved hjelp av [objektdeteksjon](../11-ObjectDetection/README.md)-teknikken som vi skal diskutere senere, men vi kan også prøve å bruke ren datamaskinsyn for dette. En god beskrivelse av hvordan datamaskinsyn kan brukes til å separere tegn finner du [i denne bloggposten](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) - her vil vi kun fokusere på noen datamaskinsynsteknikker.\n", + "Hvis vi ønsker å bruke bildegjenkjenning for å identifisere teksten, må vi klippe ut individuelle symboler for å gjøre dem lik MNIST-bilder som vi har sett tidligere. Dette kan gjøres ved hjelp av [objektdeteksjon](../11-ObjectDetection/README.md)-teknikken som vi skal diskutere senere, men vi kan også prøve å bruke ren datamaskinsyn for dette. En god beskrivelse av hvordan datamaskinsyn kan brukes for å separere tegn finner du [i denne bloggposten](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) - vi vil kun fokusere på noen datamaskinsynsteknikker her.\n", "\n", "Først, la oss prøve å forbedre bildet litt. Vi kan bruke ideen om **terskling** (godt beskrevet [i denne OpenCV-artikkelen](https://docs.opencv.org/4.x/d7/d4d/tutorial_py_thresholding.html)):\n" ] @@ -192,7 +192,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "For å arbeide med bilder, må vi \"ekstrahere\" individuelle punkter, dvs. konvertere bildene til et sett med koordinater for individuelle punkter. Vi kan gjøre det ved hjelp av **funksjonsekstraksjon**-teknikker, som SIFT, SURF eller [ORB](https://docs.opencv.org/4.x/d1/d89/tutorial_py_orb.html):\n" + "For å jobbe med bilder, må vi \"ekstrahere\" individuelle punkter, dvs. konvertere bildene til et sett med koordinater for individuelle punkter. Vi kan gjøre det ved hjelp av **funksjonsekstraksjon**-teknikker, som SIFT, SURF eller [ORB](https://docs.opencv.org/4.x/d1/d89/tutorial_py_orb.html):\n" ] }, { @@ -252,7 +252,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "For å separere individuelle tegn, må vi vite avgrensningsboksen for hele teksten. For å finne det ut, kan vi bare beregne min- og makskoordinater:\n" + "For å skille individuelle tegn, må vi vite avgrensningsboksen for hele teksten. For å finne den, kan vi bare beregne min- og makskoordinater:\n" ] }, { @@ -293,7 +293,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "For å gjøre det perfekt justert, må vi utføre en såkalt **perspektivtransformasjon**. Vi vil ta et rektangel definert av punktene $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ og justere det med et nytt bilde med proporsjonale dimensjoner:\n" + "Denne teksten kan også være delvis rotert, og for å gjøre den perfekt justert må vi utføre en såkalt **perspektivtransformasjon**. Vi vil ta et rektangel definert av punktene $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ og justere det med et nytt bilde med proporsjonale dimensjoner:\n" ] }, { @@ -391,7 +391,7 @@ "\n", "Å oppdage bevegelse i en videostrøm er en svært vanlig oppgave. For eksempel gir det oss mulighet til å få varsler når noe skjer på et overvåkingskamera. Hvis vi ønsker å forstå hva som skjer på kameraet, kan vi bruke et nevralt nettverk – men det er mye billigere å bruke et nevralt nettverk når vi allerede vet at noe foregår.\n", "\n", - "Hovedideen bak bevegelsesdeteksjon er enkel. Hvis kameraet er fastmontert, bør rammene fra kameraet være ganske like hverandre. Siden rammer er representert som matriser, kan vi bare trekke fra disse matrisene for to påfølgende rammer, og da får vi pikselforskjellen. Denne forskjellen bør være lav for statiske rammer, og bli høyere når det er betydelig bevegelse i bildet.\n", + "Hovedideen bak bevegelsesdeteksjon er enkel. Hvis kameraet er fastmontert, bør rammene fra kameraet være ganske like hverandre. Siden rammer er representert som matriser, kan vi bare trekke fra disse matrisene for to påfølgende rammer for å få pikselforskjellen, som bør være lav for statiske rammer, og bli høyere når det er betydelig bevegelse i bildet.\n", "\n", "Vi starter med å lære hvordan vi åpner en video og konverterer den til en sekvens av rammer:\n" ] @@ -486,7 +486,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Anta at vi ønsker å lage en rapport som viser hva som skjedde foran kameraet ved å vise det passende bildet hver gang noe skjer. For å gjøre det, vil vi sannsynligvis finne start- og sluttbildet for en \"hendelse\", og vise midtbildet. For å fjerne noe støy, vil vi også jevne ut kurven ovenfor med en glidende gjennomsnittsfunksjon:\n" + "Anta at vi ønsker å lage en rapport som viser hva som skjedde foran kameraet ved å vise det passende bildet hver gang noe skjer. For å gjøre det, vil vi sannsynligvis finne start- og sluttbildet av en \"hendelse\", og vise midtbilde. For å fjerne noe støy, vil vi også jevne ut kurven ovenfor med en glidende gjennomsnittsfunksjon:\n" ] }, { @@ -641,9 +641,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Ekstraher bevegelse ved hjelp av optisk flyt\n", + "## Ekstraher bevegelse med optisk flyt\n", "\n", - "Selv om det å sammenligne to påfølgende bilder lar oss se mengden endringer, gir det ingen informasjon om hva som faktisk beveger seg og hvor. For å få den informasjonen finnes det en teknikk kalt **[optisk flyt](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)**:\n", + "Å sammenligne to påfølgende bilder kan vise oss mengden av endringer, men det gir ingen informasjon om hva som faktisk beveger seg og hvor. For å få den informasjonen finnes det en teknikk kalt **[optisk flyt](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)**:\n", "\n", "* **Tett optisk flyt** beregner vektorfeltet som viser hvor hver piksel beveger seg.\n", "* **Sparsom optisk flyt** baserer seg på å ta noen karakteristiske trekk i bildet (f.eks. kanter) og bygge deres bane fra bilde til bilde.\n", @@ -679,9 +679,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Som du kan se, har strømmen for hver ramme dimensjonen til rammen og 2 kanaler som tilsvarer x- og y-komponentene til den optiske flytvektoren.\n", + "Som du kan se, har hver ramme flyten med dimensjonen til rammen og 2 kanaler, som tilsvarer x- og y-komponentene til den optiske flytvektoren.\n", "\n", - "Å vise optisk flyt i 2D er litt utfordrende, men vi kan bruke en smart idé. Hvis vi konverterer optisk flyt til polarkoordinater, får vi to komponenter for hver piksel: *retning* og *intensitet*. Vi kan representere intensiteten med pikselens lysstyrke, og retningen med forskjellige farger. Vi vil lage et bilde i [HSV (Hue-Saturation-Value) fargerom](https://en.wikipedia.org/wiki/HSV_color_space), der fargetonen (hue) defineres av retningen, verdien (value) av intensiteten, og metningen (saturation) settes til 255.\n" + "Å vise optisk flyt i 2D er litt utfordrende, men vi kan bruke en smart idé. Hvis vi konverterer optisk flyt til polarkoordinater, får vi to komponenter for hver piksel: *retning* og *intensitet*. Vi kan representere intensitet med pikselens lysstyrke, og retning med forskjellige farger. Vi vil lage et bilde i [HSV (Hue-Saturation-Value) fargerom](https://en.wikipedia.org/wiki/HSV_color_space), der fargetonen (hue) defineres av retning, verdien (value) av intensitet, og metningen (saturation) settes til 255.\n" ] }, { @@ -730,16 +730,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Så i disse rammene tilsvarer grønnaktig farge bevegelse til venstre, mens blå tilsvarer bevegelse til høyre.\n", + "Så i disse rammene tilsvarer grønnaktig farge bevegelse mot venstre, mens blå tilsvarer bevegelse mot høyre.\n", "\n", - "Optisk flyt kan være et flott verktøy for å trekke konklusjoner om generell bevegelsesretning. For eksempel, hvis du ser at alle pikslene i en ramme beveger seg mer eller mindre i én retning, kan du konkludere med at det er kamerabevegelse, og prøve å kompensere for det.\n" + "Optisk flyt kan være et flott verktøy for å trekke konklusjoner om den generelle bevegelsesretningen. For eksempel, hvis du ser at alle pikslene i en ramme beveger seg mer eller mindre i én retning, kan du konkludere med at det er kamerabevegelse, og prøve å kompensere for det.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**Ansvarsfraskrivelse**: \nDette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi streber etter nøyaktighet, vær oppmerksom på at automatiserte oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen.\n" + "\n---\n\n**Ansvarsfraskrivelse**: \nDette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vennligst vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen.\n" ] } ], @@ -766,8 +766,8 @@ }, "orig_nbformat": 4, "coopTranslator": { - "original_hash": "ad5bdca62175c7a3d4336ef8c761aef3", - "translation_date": "2025-08-28T16:39:03+00:00", + "original_hash": "339b2129f86b24024393ff92b8bd376f", + "translation_date": "2025-09-07T15:09:26+00:00", "source_file": "lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb", "language_code": "no" } diff --git a/translations/pa/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb b/translations/pa/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb index ab30ed6f..bbdc796a 100644 --- a/translations/pa/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb +++ b/translations/pa/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb @@ -8,11 +8,11 @@ "\n", "ਇਹ ਨੋਟਬੁੱਕ [AI for Beginners Curriculum](http://aka.ms/ai-beginners) ਦਾ ਹਿੱਸਾ ਹੈ।\n", "\n", - "[OpenCV](https://opencv.org/) ਨੂੰ ਚਿੱਤਰ ਪ੍ਰਕਿਰਿਆ ਲਈ *ਡਿ ਫੈਕਟੋ* ਮਿਆਰ ਮੰਨਿਆ ਜਾਂਦਾ ਹੈ। ਇਸ ਵਿੱਚ ਕਈ ਲਾਭਦਾਇਕ ਐਲਗੋਰਿਥਮ ਹਨ, ਜੋ C++ ਵਿੱਚ ਲਿਖੇ ਗਏ ਹਨ। ਤੁਸੀਂ Python ਤੋਂ ਵੀ OpenCV ਨੂੰ ਕਾਲ ਕਰ ਸਕਦੇ ਹੋ।\n", + "[OpenCV](https://opencv.org/) ਚਿੱਤਰ ਪ੍ਰਕਿਰਿਆ ਲਈ *de facto* ਮਿਆਰ ਮੰਨਿਆ ਜਾਂਦਾ ਹੈ। ਇਸ ਵਿੱਚ ਕਈ ਲਾਭਦਾਇਕ ਐਲਗੋਰਿਥਮ ਹਨ, ਜੋ C++ ਵਿੱਚ ਲਾਗੂ ਕੀਤੇ ਗਏ ਹਨ। ਤੁਸੀਂ OpenCV ਨੂੰ Python ਤੋਂ ਵੀ ਕਾਲ ਕਰ ਸਕਦੇ ਹੋ।\n", "\n", - "ਇਸ ਨੋਟਬੁੱਕ ਵਿੱਚ, ਅਸੀਂ ਤੁਹਾਨੂੰ OpenCV ਵਰਤਣ ਦੇ ਕੁਝ ਉਦਾਹਰਨਾਂ ਦਿਆਂਗੇ। ਹੋਰ ਜਾਣਕਾਰੀ ਲਈ, ਤੁਸੀਂ [Learn OpenCV](https://learnopencv.com/getting-started-with-opencv/) ਆਨਲਾਈਨ ਕੋਰਸ ਵੇਖ ਸਕਦੇ ਹੋ।\n", + "ਇਸ ਨੋਟਬੁੱਕ ਵਿੱਚ, ਅਸੀਂ ਤੁਹਾਨੂੰ OpenCV ਦੀ ਵਰਤੋਂ ਲਈ ਕੁਝ ਉਦਾਹਰਨਾਂ ਦੇਵਾਂਗੇ। ਹੋਰ ਵੇਰਵੇ ਲਈ, ਤੁਸੀਂ [Learn OpenCV](https://learnopencv.com/getting-started-with-opencv/) ਆਨਲਾਈਨ ਕੋਰਸ 'ਤੇ ਜਾ ਸਕਦੇ ਹੋ।\n", "\n", - "ਸਭ ਤੋਂ ਪਹਿਲਾਂ, ਆਓ `import cv2` ਕਰੀਏ, ਨਾਲ ਹੀ ਕੁਝ ਹੋਰ ਲਾਭਦਾਇਕ ਲਾਇਬ੍ਰੇਰੀਜ਼ ਨੂੰ ਵੀ ਸ਼ਾਮਲ ਕਰੀਏ:\n" + "ਸਭ ਤੋਂ ਪਹਿਲਾਂ, ਆਓ `import cv2` ਕਰੀਏ, ਨਾਲ ਹੀ ਕੁਝ ਹੋਰ ਲਾਭਦਾਇਕ ਲਾਇਬ੍ਰੇਰੀਜ਼:\n" ] }, { @@ -44,7 +44,7 @@ "source": [ "## ਤਸਵੀਰਾਂ ਲੋਡ ਕਰਨਾ\n", "\n", - "Python ਵਿੱਚ ਤਸਵੀਰਾਂ ਨੂੰ ਆਸਾਨੀ ਨਾਲ NumPy ਐਰੇਜ਼ ਦੁਆਰਾ ਦਰਸਾਇਆ ਜਾ ਸਕਦਾ ਹੈ। ਉਦਾਹਰਣ ਵਜੋਂ, 320x200 ਪਿਕਸਲ ਦੇ ਆਕਾਰ ਵਾਲੀ ਗ੍ਰੇਸਕੇਲ ਤਸਵੀਰ ਨੂੰ 200x320 ਐਰੇ ਵਿੱਚ ਸਟੋਰ ਕੀਤਾ ਜਾਵੇਗਾ, ਅਤੇ ਇਸੇ ਆਕਾਰ ਦੀ ਰੰਗੀਨ ਤਸਵੀਰ ਦਾ ਆਕਾਰ 200x320x3 ਹੋਵੇਗਾ (3 ਰੰਗ ਚੈਨਲਾਂ ਲਈ)।\n", + "ਪਾਇਥਨ ਵਿੱਚ ਤਸਵੀਰਾਂ ਨੂੰ ਆਸਾਨੀ ਨਾਲ NumPy ਐਰੇਜ਼ ਦੁਆਰਾ ਦਰਸਾਇਆ ਜਾ ਸਕਦਾ ਹੈ। ਉਦਾਹਰਣ ਵਜੋਂ, 320x200 ਪਿਕਸਲ ਦੇ ਆਕਾਰ ਵਾਲੀ ਗ੍ਰੇਸਕੇਲ ਤਸਵੀਰ ਨੂੰ 200x320 ਐਰੇ ਵਿੱਚ ਸਟੋਰ ਕੀਤਾ ਜਾਵੇਗਾ, ਅਤੇ ਇਸੇ ਆਕਾਰ ਦੀ ਰੰਗੀਨ ਤਸਵੀਰ ਦਾ ਆਕਾਰ 200x320x3 ਹੋਵੇਗਾ (3 ਰੰਗ ਚੈਨਲਾਂ ਲਈ)। \n", "\n", "ਆਓ ਇੱਕ ਤਸਵੀਰ ਲੋਡ ਕਰਕੇ ਸ਼ੁਰੂ ਕਰੀਏ:\n" ] @@ -135,7 +135,7 @@ "source": [ "bw_im = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)\n", "print(bw_im.shape)\n", - "plt.imshow(bw_im)" + "plt.imshow(bw_im, cmap='gray')" ] }, { @@ -144,9 +144,9 @@ "source": [ "## ਬ੍ਰੇਲ ਚਿੱਤਰ ਪ੍ਰਕਿਰਿਆ\n", "\n", - "ਜੇ ਅਸੀਂ ਚਿੱਤਰ ਵਰਗੀਕਰਨ ਨੂੰ ਲਾਗੂ ਕਰਕੇ ਲਿਖਤ ਨੂੰ ਪਛਾਣਨਾ ਚਾਹੁੰਦੇ ਹਾਂ, ਤਾਂ ਸਾਨੂੰ ਵਿਅਕਤੀਗਤ ਚਿੰਨ੍ਹਾਂ ਨੂੰ ਕੱਟਣਾ ਪਵੇਗਾ ਤਾਂ ਜੋ ਉਹ MNIST ਚਿੱਤਰਾਂ ਦੇ ਸਮਾਨ ਹੋਣ ਜੋ ਅਸੀਂ ਪਹਿਲਾਂ ਦੇਖੇ ਹਨ। ਇਹ [ਵਸਤੂ ਪਛਾਣ](../11-ObjectDetection/README.md) ਤਕਨੀਕ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ ਜਿਸ ਬਾਰੇ ਅਸੀਂ ਬਾਅਦ ਵਿੱਚ ਚਰਚਾ ਕਰਾਂਗੇ, ਪਰ ਅਸੀਂ ਇਸ ਲਈ ਸਿਰਫ ਕੰਪਿਊਟਰ ਵਿਜ਼ਨ ਦੀ ਵਰਤੋਂ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਵੀ ਕਰ ਸਕਦੇ ਹਾਂ। ਕਿਰਦਾਰ ਵੱਖ ਕਰਨ ਲਈ ਕਿਵੇਂ ਕੰਪਿਊਟਰ ਵਿਜ਼ਨ ਦੀ ਵਰਤੋਂ ਕੀਤੀ ਜਾ ਸਕਦੀ ਹੈ ਇਸ ਬਾਰੇ ਇੱਕ ਚੰਗੀ ਵਰਣਨਾ [ਇਸ ਬਲੌਗ ਪੋਸਟ](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) ਵਿੱਚ ਮਿਲਦੀ ਹੈ - ਅਸੀਂ ਇੱਥੇ ਸਿਰਫ ਕੁਝ ਕੰਪਿਊਟਰ ਵਿਜ਼ਨ ਤਕਨੀਕਾਂ 'ਤੇ ਧਿਆਨ ਦੇਵਾਂਗੇ।\n", + "ਜੇਕਰ ਅਸੀਂ ਚਿੱਤਰ ਵਰਗੀਕਰਨ ਨੂੰ ਲਾਗੂ ਕਰਕੇ ਲਿਖਤ ਦੀ ਪਹਿਚਾਣ ਕਰਨੀ ਹੈ, ਤਾਂ ਸਾਨੂੰ ਵਿਅਕਤੀਗਤ ਚਿੰਨ੍ਹਾਂ ਨੂੰ ਕੱਟਣਾ ਪਵੇਗਾ ਤਾਂ ਜੋ ਉਹ MNIST ਚਿੱਤਰਾਂ ਦੇ ਸਮਾਨ ਹੋਣ ਜੋ ਅਸੀਂ ਪਹਿਲਾਂ ਦੇਖੇ ਹਨ। ਇਹ [ਵਸਤੂ ਪਛਾਣ](../11-ObjectDetection/README.md) ਤਕਨੀਕ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ ਜਿਸ ਬਾਰੇ ਅਸੀਂ ਬਾਅਦ ਵਿੱਚ ਚਰਚਾ ਕਰਾਂਗੇ, ਪਰ ਅਸੀਂ ਇਸ ਲਈ ਸਿਰਫ ਕੰਪਿਊਟਰ ਵਿਜ਼ਨ ਦੀ ਵਰਤੋਂ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਵੀ ਕਰ ਸਕਦੇ ਹਾਂ। ਕੰਪਿਊਟਰ ਵਿਜ਼ਨ ਨੂੰ ਅੱਖਰਾਂ ਦੀ ਵੱਖਰੀਕਰਨ ਲਈ ਕਿਵੇਂ ਵਰਤਿਆ ਜਾ ਸਕਦਾ ਹੈ ਇਸ ਬਾਰੇ ਇੱਕ ਚੰਗਾ ਵੇਰਵਾ [ਇਸ ਬਲੌਗ ਪੋਸਟ](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) ਵਿੱਚ ਮਿਲਦਾ ਹੈ - ਅਸੀਂ ਇੱਥੇ ਸਿਰਫ ਕੁਝ ਕੰਪਿਊਟਰ ਵਿਜ਼ਨ ਤਕਨੀਕਾਂ 'ਤੇ ਧਿਆਨ ਦੇਵਾਂਗੇ।\n", "\n", - "ਸਭ ਤੋਂ ਪਹਿਲਾਂ, ਆਓ ਚਿੱਤਰ ਨੂੰ ਥੋੜਾ ਬਹਿਤਰ ਬਣਾਉਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੀਏ। ਅਸੀਂ **ਥ੍ਰੈਸ਼ਹੋਲਡਿੰਗ** ਦੇ ਵਿਚਾਰ ਦੀ ਵਰਤੋਂ ਕਰ ਸਕਦੇ ਹਾਂ (ਜੋ [ਇਸ OpenCV ਲੇਖ](https://docs.opencv.org/4.x/d7/d4d/tutorial_py_thresholding.html) ਵਿੱਚ ਚੰਗੀ ਤਰ੍ਹਾਂ ਵਰਣਿਤ ਹੈ):\n" + "ਸਭ ਤੋਂ ਪਹਿਲਾਂ, ਆਓ ਚਿੱਤਰ ਨੂੰ ਥੋੜ੍ਹਾ ਬਹਿਤਰ ਬਣਾਉਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੀਏ। ਅਸੀਂ **ਥ੍ਰੈਸ਼ਹੋਲਡਿੰਗ** ਦੇ ਵਿਚਾਰ ਦੀ ਵਰਤੋਂ ਕਰ ਸਕਦੇ ਹਾਂ (ਜੋ [ਇਸ OpenCV ਲੇਖ](https://docs.opencv.org/4.x/d7/d4d/tutorial_py_thresholding.html) ਵਿੱਚ ਚੰਗੀ ਤਰ੍ਹਾਂ ਵਰਣਿਤ ਹੈ):\n" ] }, { @@ -192,7 +192,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "ਤਸਵੀਰਾਂ ਨਾਲ ਕੰਮ ਕਰਨ ਲਈ, ਸਾਨੂੰ \"ਇਕੱਲੇ ਬਿੰਦੂ\" ਨਿਕਾਲਣ ਦੀ ਲੋੜ ਹੈ, ਅਰਥਾਤ ਤਸਵੀਰਾਂ ਨੂੰ ਇਕੱਲੇ ਬਿੰਦੂਆਂ ਦੇ ਕੋਆਰਡੀਨੇਟਸ ਦੇ ਸੈੱਟ ਵਿੱਚ ਰੂਪਾਂਤਰਿਤ ਕਰਨਾ ਪਵੇਗਾ। ਅਸੀਂ ਇਹ ਕੰਮ **ਫੀਚਰ ਐਕਸਟ੍ਰੈਕਸ਼ਨ** ਤਕਨੀਕਾਂ ਜਿਵੇਂ ਕਿ SIFT, SURF ਜਾਂ [ORB](https://docs.opencv.org/4.x/d1/d89/tutorial_py_orb.html) ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਕਰ ਸਕਦੇ ਹਾਂ:\n" + "ਤਸਵੀਰਾਂ ਨਾਲ ਕੰਮ ਕਰਨ ਲਈ, ਸਾਨੂੰ \"ਇਕੱਠੇ\" ਵੱਖ-ਵੱਖ ਬਿੰਦੂਆਂ ਨੂੰ ਕੱਢਣਾ ਪੈਂਦਾ ਹੈ, ਅਰਥਾਤ ਤਸਵੀਰਾਂ ਨੂੰ ਵੱਖ-ਵੱਖ ਬਿੰਦੂਆਂ ਦੇ ਕੋਆਰਡੀਨੇਟਸ ਦੇ ਸੈੱਟ ਵਿੱਚ ਰੂਪਾਂਤਰਿਤ ਕਰਨਾ ਪੈਂਦਾ ਹੈ। ਅਸੀਂ ਇਹ ਕੰਮ **ਫੀਚਰ ਐਕਸਟ੍ਰੈਕਸ਼ਨ** ਤਕਨੀਕਾਂ ਜਿਵੇਂ ਕਿ SIFT, SURF ਜਾਂ [ORB](https://docs.opencv.org/4.x/d1/d89/tutorial_py_orb.html) ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਕਰ ਸਕਦੇ ਹਾਂ:\n" ] }, { @@ -252,7 +252,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "ਇਨਦੀਵਿਜੁਅਲ ਅੱਖਰਾਂ ਨੂੰ ਵੱਖ ਕਰਨ ਲਈ, ਸਾਨੂੰ ਪੂਰੇ ਪਾਠ ਦਾ ਬਾਊਂਡਿੰਗ ਬਾਕਸ ਪਤਾ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ। ਇਸਨੂੰ ਪਤਾ ਕਰਨ ਲਈ, ਅਸੀਂ ਸਿਰਫ ਘੱਟ ਤੋਂ ਘੱਟ ਅਤੇ ਵੱਧ ਤੋਂ ਵੱਧ ਕੋਆਰਡੀਨੇਟਸ ਦੀ ਗਣਨਾ ਕਰ ਸਕਦੇ ਹਾਂ:\n" + "ਇਨਦੀ ਵਿਅਕਤੀਗਤ ਅੱਖਰਾਂ ਨੂੰ ਵੱਖ ਕਰਨ ਲਈ, ਸਾਨੂੰ ਪੂਰੇ ਪਾਠ ਦਾ ਬਾਊਂਡਿੰਗ ਬਾਕਸ ਪਤਾ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ। ਇਸਨੂੰ ਪਤਾ ਕਰਨ ਲਈ, ਅਸੀਂ ਸਿਰਫ ਘੱਟੋ-ਘੱਟ ਅਤੇ ਵੱਧ ਤੋਂ ਵੱਧ ਕੋਆਰਡੀਨੇਟਸ ਦੀ ਗਿਣਤੀ ਕਰ ਸਕਦੇ ਹਾਂ:\n" ] }, { @@ -293,7 +293,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "ਇਸ ਪਾਠ ਨੂੰ ਪੂਰੀ ਤਰ੍ਹਾਂ ਸਿੱਧਾ ਕਰਨ ਲਈ, ਸਾਨੂੰ ਇਸਨੂੰ **ਪਰਸਪੈਕਟਿਵ ਟ੍ਰਾਂਸਫਾਰਮੇਸ਼ਨ** ਕਹੀ ਜਾਣ ਵਾਲੀ ਪ੍ਰਕਿਰਿਆ ਦੀ ਲੋੜ ਹੈ। ਅਸੀਂ ਬਿੰਦੂ $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ ਦੁਆਰਾ ਪਰਿਭਾਸ਼ਿਤ ਇੱਕ ਆਯਤ ਨੂੰ ਲਵਾਂਗੇ ਅਤੇ ਇਸਨੂੰ ਨਵੀਂ ਚਿੱਤਰ ਦੇ ਅਨੁਪਾਤੀ ਆਕਾਰਾਂ ਨਾਲ ਸਿੱਧਾ ਕਰਾਂਗੇ:\n" + "ਇਹ ਪਾਠ ਹਿੱਸੇਵਾਰ ਘੁਮਾਇਆ ਜਾ ਸਕਦਾ ਹੈ, ਅਤੇ ਇਸਨੂੰ ਬਿਲਕੁਲ ਸਹੀ ਤਰ੍ਹਾਂ ਸੰਰਚਿਤ ਕਰਨ ਲਈ ਸਾਨੂੰ ਇਸਨੂੰ **ਦ੍ਰਿਸ਼ਟੀਕੋਣ ਪਰਿਵਰਤਨ** ਕਰਨਾ ਪਵੇਗਾ। ਅਸੀਂ ਬਿੰਦੂ $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ ਦੁਆਰਾ ਪਰਿਭਾਸ਼ਿਤ ਇੱਕ ਆਯਤ ਲਵਾਂਗੇ ਅਤੇ ਇਸਨੂੰ ਨਵੀਂ ਚਿੱਤਰ ਦੇ ਅਨੁਪਾਤੀ ਆਕਾਰਾਂ ਨਾਲ ਸੰਰਚਿਤ ਕਰਾਂਗੇ:\n" ] }, { @@ -340,7 +340,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "ਜਦੋਂ ਸਾਨੂੰ ਇਹ ਚੰਗੀ ਤਰ੍ਹਾਂ ਸੰਰੂਪਿਤ ਚਿੱਤਰ ਮਿਲ ਜਾਂਦਾ ਹੈ, ਤਾਂ ਇਸਨੂੰ ਟੁਕੜਿਆਂ ਵਿੱਚ ਵੰਡਣਾ ਸੌਖਾ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ:\n" + "ਇਸ ਚੰਗੀ ਤਰ੍ਹਾਂ ਸੰਰੂਪਿਤ ਚਿੱਤਰ ਪ੍ਰਾਪਤ ਕਰਨ ਤੋਂ ਬਾਅਦ, ਇਸਨੂੰ ਟੁਕੜਿਆਂ ਵਿੱਚ ਵੰਡਣਾ ਸਹੀ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ:\n" ] }, { @@ -384,20 +384,20 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "ਤੁਸੀਂ ਵੇਖਿਆ ਹੈ ਕਿ ਕਾਫ਼ੀ ਸਾਰੇ ਕੰਮ ਖਾਲਿਸ ਚਿੱਤਰ ਪ੍ਰਕਿਰਿਆਵਾਂ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਕੀਤੇ ਜਾ ਸਕਦੇ ਹਨ, ਬਿਨਾਂ ਕਿਸੇ ਕ੍ਰਿਤ੍ਰਿਮ ਬੁੱਧੀ ਦੇ। ਜੇਕਰ ਅਸੀਂ ਕੰਪਿਊਟਰ ਦ੍ਰਿਸ਼ਟੀ ਤਕਨੀਕਾਂ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਨਿਊਰਲ ਨੈੱਟਵਰਕ ਦੇ ਕੰਮ ਨੂੰ ਆਸਾਨ ਬਣਾ ਸਕੀਏ - ਤਾਂ ਸਾਨੂੰ ਇਹ ਜ਼ਰੂਰ ਕਰਨਾ ਚਾਹੀਦਾ ਹੈ, ਕਿਉਂਕਿ ਇਸ ਨਾਲ ਸਾਨੂੰ ਘੱਟ ਸਿਖਲਾਈ ਡਾਟਾ ਨਾਲ ਸਮੱਸਿਆਵਾਂ ਦਾ ਹੱਲ ਲੱਭਣ ਦੀ ਆਗਿਆ ਮਿਲੇਗੀ।\n" + "ਤੁਸੀਂ ਵੇਖਿਆ ਹੈ ਕਿ ਕਾਫ਼ੀ ਸਾਰੇ ਕੰਮ ਖਾਲਿਸ ਚਿੱਤਰ ਪ੍ਰਕਿਰਿਆਵਾਂ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਕੀਤੇ ਜਾ ਸਕਦੇ ਹਨ, ਬਿਨਾਂ ਕਿਸੇ ਕ੍ਰਿਤ੍ਰਿਮ ਬੁੱਧੀ ਦੇ। ਜੇ ਅਸੀਂ ਕੰਪਿਊਟਰ ਦ੍ਰਿਸ਼ਟੀ ਤਕਨੀਕਾਂ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਨਿਊਰਲ ਨੈੱਟਵਰਕ ਦੇ ਕੰਮ ਨੂੰ ਆਸਾਨ ਬਣਾ ਸਕੀਏ - ਤਾਂ ਸਾਨੂੰ ਇਹ ਜ਼ਰੂਰ ਕਰਨਾ ਚਾਹੀਦਾ ਹੈ, ਕਿਉਂਕਿ ਇਹ ਸਾਨੂੰ ਘੱਟ ਤਰਬੀਅਤ ਡਾਟਾ ਨਾਲ ਸਮੱਸਿਆਵਾਂ ਨੂੰ ਹੱਲ ਕਰਨ ਦੀ ਆਗਿਆ ਦੇਵੇਗਾ।\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## ਫਰੇਮ ਅੰਤਰ ਦੀ ਵਰਤੋਂ ਨਾਲ ਮੋਸ਼ਨ ਡਿਟੈਕਸ਼ਨ\n", + "## ਫ੍ਰੇਮ ਅੰਤਰ ਦੀ ਵਰਤੋਂ ਨਾਲ ਮੋਸ਼ਨ ਡਿਟੈਕਸ਼ਨ\n", "\n", - "ਵੀਡੀਓ ਸਟ੍ਰੀਮ 'ਤੇ ਮੋਸ਼ਨ ਦਾ ਪਤਾ ਲਗਾਉਣਾ ਇੱਕ ਬਹੁਤ ਹੀ ਆਮ ਕੰਮ ਹੈ। ਉਦਾਹਰਣ ਵਜੋਂ, ਇਹ ਸਾਨੂੰ ਨਿਗਰਾਨੀ ਕੈਮਰੇ 'ਤੇ ਕੁਝ ਹੋਣ 'ਤੇ ਚੇਤਾਵਨੀ ਪ੍ਰਾਪਤ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਜੇ ਅਸੀਂ ਸਮਝਣਾ ਚਾਹੁੰਦੇ ਹਾਂ ਕਿ ਕੈਮਰੇ 'ਤੇ ਕੀ ਹੋ ਰਿਹਾ ਹੈ, ਤਾਂ ਅਸੀਂ ਨਿਊਰਲ ਨੈੱਟਵਰਕ ਦੀ ਵਰਤੋਂ ਕਰ ਸਕਦੇ ਹਾਂ - ਪਰ ਜਦੋਂ ਸਾਨੂੰ ਪਤਾ ਹੋਵੇ ਕਿ ਕੁਝ ਚਲ ਰਿਹਾ ਹੈ, ਤਾਂ ਨਿਊਰਲ ਨੈੱਟਵਰਕ ਦੀ ਵਰਤੋਂ ਕਰਨਾ ਕਾਫ਼ੀ ਸਸਤਾ ਹੁੰਦਾ ਹੈ।\n", + "ਵੀਡੀਓ ਸਟ੍ਰੀਮ 'ਤੇ ਮੋਸ਼ਨ ਦਾ ਪਤਾ ਲਗਾਉਣਾ ਇੱਕ ਬਹੁਤ ਹੀ ਆਮ ਕੰਮ ਹੈ। ਉਦਾਹਰਣ ਵਜੋਂ, ਇਹ ਸਾਨੂੰ ਸੁਰੱਖਿਆ ਕੈਮਰੇ 'ਤੇ ਕੁਝ ਹੋਣ 'ਤੇ ਚੇਤਾਵਨੀ ਪ੍ਰਾਪਤ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਜੇਕਰ ਅਸੀਂ ਸਮਝਣਾ ਚਾਹੁੰਦੇ ਹਾਂ ਕਿ ਕੈਮਰੇ 'ਤੇ ਕੀ ਹੋ ਰਿਹਾ ਹੈ, ਤਾਂ ਅਸੀਂ ਨਿਊਰਲ ਨੈੱਟਵਰਕ ਦੀ ਵਰਤੋਂ ਕਰ ਸਕਦੇ ਹਾਂ - ਪਰ ਜਦੋਂ ਸਾਨੂੰ ਪਤਾ ਹੋਵੇ ਕਿ ਕੁਝ ਚਲ ਰਿਹਾ ਹੈ, ਤਾਂ ਨਿਊਰਲ ਨੈੱਟਵਰਕ ਦੀ ਵਰਤੋਂ ਕਰਨਾ ਕਾਫ਼ੀ ਸਸਤਾ ਹੁੰਦਾ ਹੈ।\n", "\n", - "ਮੋਸ਼ਨ ਡਿਟੈਕਸ਼ਨ ਦਾ ਮੁੱਖ ਵਿਚਾਰ ਸਧਾਰਨ ਹੈ। ਜੇ ਕੈਮਰਾ ਸਥਿਰ ਹੈ, ਤਾਂ ਕੈਮਰੇ ਤੋਂ ਆਉਣ ਵਾਲੇ ਫਰੇਮ ਇੱਕ ਦੂਜੇ ਨਾਲ ਕਾਫ਼ੀ ਮਿਲਦੇ-ਜੁਲਦੇ ਹੋਣੇ ਚਾਹੀਦੇ ਹਨ। ਕਿਉਂਕਿ ਫਰੇਮ ਐਰੇਜ਼ ਵਜੋਂ ਦਰਸਾਏ ਜਾਂਦੇ ਹਨ, ਸਿਰਫ਼ ਦੋ ਲਗਾਤਾਰ ਫਰੇਮਾਂ ਲਈ ਉਹਨਾਂ ਐਰੇਜ਼ ਨੂੰ ਘਟਾ ਕੇ ਸਾਨੂੰ ਪਿਕਸਲ ਅੰਤਰ ਮਿਲੇਗਾ, ਜੋ ਸਥਿਰ ਫਰੇਮਾਂ ਲਈ ਘੱਟ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ, ਅਤੇ ਤਸਵੀਰ ਵਿੱਚ ਵੱਡੇ ਪੱਧਰ 'ਤੇ ਮੋਸ਼ਨ ਹੋਣ 'ਤੇ ਵਧ ਜਾਵੇਗਾ।\n", + "ਮੋਸ਼ਨ ਡਿਟੈਕਸ਼ਨ ਦਾ ਮੁੱਖ ਵਿਚਾਰ ਸਧਾਰਨ ਹੈ। ਜੇਕਰ ਕੈਮਰਾ ਸਥਿਰ ਹੈ, ਤਾਂ ਕੈਮਰੇ ਤੋਂ ਆਉਣ ਵਾਲੇ ਫ੍ਰੇਮ ਇੱਕ ਦੂਜੇ ਨਾਲ ਕਾਫ਼ੀ ਮਿਲਦੇ-ਜੁਲਦੇ ਹੋਣੇ ਚਾਹੀਦੇ ਹਨ। ਕਿਉਂਕਿ ਫ੍ਰੇਮ ਐਰੇਜ਼ ਵਜੋਂ ਦਰਸਾਏ ਜਾਂਦੇ ਹਨ, ਸਿਰਫ਼ ਦੋ ਲਗਾਤਾਰ ਫ੍ਰੇਮਾਂ ਲਈ ਉਹਨਾਂ ਐਰੇਜ਼ ਨੂੰ ਘਟਾ ਕੇ ਸਾਨੂੰ ਪਿਕਸਲ ਅੰਤਰ ਮਿਲੇਗਾ, ਜੋ ਸਥਿਰ ਫ੍ਰੇਮਾਂ ਲਈ ਘੱਟ ਹੋਵੇਗਾ ਅਤੇ ਤਸਵੀਰ ਵਿੱਚ ਵੱਡੇ ਪੱਧਰ 'ਤੇ ਮੋਸ਼ਨ ਹੋਣ 'ਤੇ ਵੱਧ ਜਾਵੇਗਾ।\n", "\n", - "ਅਸੀਂ ਸਿੱਖਣ ਦੀ ਸ਼ੁਰੂਆਤ ਕਰਾਂਗੇ ਕਿ ਵੀਡੀਓ ਨੂੰ ਕਿਵੇਂ ਖੋਲ੍ਹਣਾ ਹੈ ਅਤੇ ਇਸਨੂੰ ਫਰੇਮਾਂ ਦੀ ਲੜੀ ਵਿੱਚ ਕਿਵੇਂ ਬਦਲਣਾ ਹੈ:\n" + "ਅਸੀਂ ਸਿੱਖਣ ਦੀ ਸ਼ੁਰੂਆਤ ਕਰਾਂਗੇ ਕਿ ਵੀਡੀਓ ਨੂੰ ਕਿਵੇਂ ਖੋਲ੍ਹਣਾ ਹੈ ਅਤੇ ਇਸਨੂੰ ਫ੍ਰੇਮਾਂ ਦੀ ਲੜੀ ਵਿੱਚ ਕਿਵੇਂ ਬਦਲਣਾ ਹੈ:\n" ] }, { @@ -445,7 +445,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "ਕਿਉਂਕਿ ਰੰਗ ਗਤੀ ਦਾ ਪਤਾ ਲਗਾਉਣ ਲਈ ਇੰਨਾ ਮਹੱਤਵਪੂਰਨ ਨਹੀਂ ਹੈ, ਅਸੀਂ ਸਾਰੇ ਫ੍ਰੇਮਾਂ ਨੂੰ ਸਲੇਟੀ ਰੰਗ ਵਿੱਚ ਬਦਲਾਂਗੇ। ਫਿਰ, ਅਸੀਂ ਫ੍ਰੇਮਾਂ ਦੇ ਅੰਤਰਾਂ ਦੀ ਗਣਨਾ ਕਰਾਂਗੇ ਅਤੇ ਉਨ੍ਹਾਂ ਦੇ ਨਾਰਮਜ਼ ਨੂੰ ਪਲਾਟ ਕਰਾਂਗੇ ਤਾਂ ਜੋ ਦ੍ਰਿਸ਼ਟੀਗੋਚਰ ਤੌਰ 'ਤੇ ਚਾਲੂ ਗਤੀ ਦੀ ਮਾਤਰਾ ਵੇਖੀ ਜਾ ਸਕੇ:\n" + "ਕਿਉਂਕਿ ਰੰਗ ਗਤੀ ਦਾ ਪਤਾ ਲਗਾਉਣ ਲਈ ਇੰਨਾ ਮਹੱਤਵਪੂਰਨ ਨਹੀਂ ਹੈ, ਅਸੀਂ ਸਾਰੇ ਫ੍ਰੇਮਾਂ ਨੂੰ ਗ੍ਰੇਸਕੇਲ ਵਿੱਚ ਬਦਲਾਂਗੇ। ਫਿਰ, ਅਸੀਂ ਫ੍ਰੇਮਾਂ ਦੇ ਅੰਤਰਾਂ ਦੀ ਗਣਨਾ ਕਰਾਂਗੇ ਅਤੇ ਉਨ੍ਹਾਂ ਦੇ ਨਾਰਮਜ਼ ਨੂੰ ਪਲਾਟ ਕਰਾਂਗੇ ਤਾਂ ਜੋ ਦ੍ਰਿਸ਼ਟੀਗਤ ਤੌਰ 'ਤੇ ਚਲ ਰਹੀ ਗਤੀ ਦੀ ਮਾਤਰਾ ਨੂੰ ਦੇਖ ਸਕੀਏ:\n" ] }, { @@ -490,7 +490,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "ਫਰਜ ਕਰੋ ਅਸੀਂ ਇੱਕ ਰਿਪੋਰਟ ਬਣਾਉਣੀ ਚਾਹੁੰਦੇ ਹਾਂ ਜੋ ਕੈਮਰੇ ਦੇ ਸਾਹਮਣੇ ਹੋਈ ਘਟਨਾ ਨੂੰ ਦਰਸਾਉਂਦੀ ਹੈ, ਹਰ ਵਾਰ ਕੁਝ ਹੋਣ 'ਤੇ ਉਚਿਤ ਚਿੱਤਰ ਦਿਖਾ ਕੇ। ਇਹ ਕਰਨ ਲਈ, ਸਾਨੂੰ ਸ਼ਾਇਦ \"ਘਟਨਾ\" ਦੇ ਸ਼ੁਰੂ ਅਤੇ ਅੰਤ ਵਾਲੇ ਫਰੇਮ ਦਾ ਪਤਾ ਲਗਾਉਣਾ ਪਵੇਗਾ ਅਤੇ ਵਿਚਕਾਰ ਵਾਲਾ ਫਰੇਮ ਦਿਖਾਉਣਾ ਪਵੇਗਾ। ਕੁਝ ਸ਼ੋਰ ਨੂੰ ਹਟਾਉਣ ਲਈ, ਅਸੀਂ ਉੱਪਰ ਦਿੱਤੀ ਗਈ ਵਕਰ ਨੂੰ ਮੂਵਿੰਗ ਐਵਰੇਜ ਫੰਕਸ਼ਨ ਨਾਲ ਸਮਤਲ ਕਰਾਂਗੇ:\n" + "ਫਰਜ ਕਰੋ ਅਸੀਂ ਇੱਕ ਰਿਪੋਰਟ ਬਣਾਉਣੀ ਚਾਹੁੰਦੇ ਹਾਂ ਜੋ ਦਿਖਾਵੇ ਕਿ ਕੈਮਰੇ ਦੇ ਸਾਹਮਣੇ ਕੀ ਵਾਪਰਿਆ ਸੀ, ਹਰ ਵਾਰ ਕੁਝ ਵਾਪਰਨ 'ਤੇ ਉਚਿਤ ਚਿੱਤਰ ਦਿਖਾ ਕੇ। ਇਹ ਕਰਨ ਲਈ, ਅਸੀਂ ਸ਼ਾਇਦ \"ਘਟਨਾ\" ਦੇ ਸ਼ੁਰੂ ਅਤੇ ਅੰਤ ਵਾਲੇ ਫਰੇਮ ਦਾ ਪਤਾ ਲਗਾਉਣਾ ਚਾਹੁੰਦੇ ਹਾਂ ਅਤੇ ਵਿਚਕਾਰਲੇ ਫਰੇਮ ਨੂੰ ਦਿਖਾਉਣਾ ਚਾਹੁੰਦੇ ਹਾਂ। ਕੁਝ ਸ਼ੋਰ ਨੂੰ ਹਟਾਉਣ ਲਈ, ਅਸੀਂ ਉੱਪਰ ਦਿੱਤੀ ਗਈ ਵਕਰੀ ਨੂੰ ਮੋਵਿੰਗ ਐਵਰੇਜ ਫੰਕਸ਼ਨ ਨਾਲ ਸਮਤਲ ਕਰਾਂਗੇ:\n" ] }, { @@ -535,7 +535,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "ਹੁਣ ਅਸੀਂ `np.where` ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਉਹ ਫ੍ਰੇਮ ਲੱਭ ਸਕਦੇ ਹਾਂ ਜਿਨ੍ਹਾਂ ਵਿੱਚ ਬਦਲਾਅ ਦੀ ਮਾਤਰਾ ਥ੍ਰੈਸ਼ਹੋਲਡ ਤੋਂ ਵੱਧ ਹੈ, ਅਤੇ 30 ਫ੍ਰੇਮਾਂ ਤੋਂ ਲੰਬੇ ਲਗਾਤਾਰ ਫ੍ਰੇਮਾਂ ਦੀ ਲੜੀ ਨਿਕਾਲ ਸਕਦੇ ਹਾਂ:\n" + "ਹੁਣ ਅਸੀਂ `np.where` ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਉਹ ਫ੍ਰੇਮ ਲੱਭ ਸਕਦੇ ਹਾਂ ਜਿਨ੍ਹਾਂ ਵਿੱਚ ਬਦਲਾਅ ਦੀ ਮਾਤਰਾ ਥ੍ਰੈਸ਼ਹੋਲਡ ਤੋਂ ਉੱਪਰ ਹੈ, ਅਤੇ 30 ਫ੍ਰੇਮਾਂ ਤੋਂ ਵੱਧ ਲੰਬੇ ਲਗਾਤਾਰ ਫ੍ਰੇਮਾਂ ਦੀ ਲੜੀ ਨਿਕਾਲ ਸਕਦੇ ਹਾਂ:\n" ] }, { @@ -608,7 +608,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "ਤੁਸੀਂ ਧਿਆਨ ਦੇ ਸਕਦੇ ਹੋ ਕਿ ਇਸ ਚਿੱਤਰ ਦਾ ਰੰਗ ਸਕੀਮ ਸਹੀ ਨਹੀਂ ਲੱਗ ਰਹੀ! ਇਹ ਇਸ ਲਈ ਹੈ ਕਿਉਂਕਿ ਇਤਿਹਾਸਕ ਕਾਰਨਾਂ ਕਰਕੇ OpenCV ਚਿੱਤਰਾਂ ਨੂੰ BGR ਰੰਗ ਸਪੇਸ ਵਿੱਚ ਲੋਡ ਕਰਦਾ ਹੈ, ਜਦਕਿ matplotlib ਵਧੇਰੇ ਰਵਾਇਤੀ RGB ਰੰਗ ਕ੍ਰਮ ਵਰਤਦਾ ਹੈ। ਜ਼ਿਆਦਾਤਰ ਮੌਕਿਆਂ 'ਤੇ, ਚਿੱਤਰਾਂ ਨੂੰ ਲੋਡ ਕਰਨ ਤੋਂ ਤੁਰੰਤ ਬਾਅਦ RGB ਵਿੱਚ ਪਰਿਵਰਤਿਤ ਕਰਨਾ ਸਮਝਦਾਰ ਹੁੰਦਾ ਹੈ।\n" + "ਤੁਸੀਂ ਧਿਆਨ ਦੇ ਸਕਦੇ ਹੋ ਕਿ ਇਸ ਚਿੱਤਰ ਦਾ ਰੰਗ ਸਕੀਮ ਸਹੀ ਨਹੀਂ ਲੱਗ ਰਹੀ! ਇਹ ਇਸ ਲਈ ਹੈ ਕਿਉਂਕਿ ਇਤਿਹਾਸਕ ਕਾਰਨਾਂ ਕਰਕੇ OpenCV ਚਿੱਤਰਾਂ ਨੂੰ BGR ਰੰਗ ਸਪੇਸ ਵਿੱਚ ਲੋਡ ਕਰਦਾ ਹੈ, ਜਦਕਿ matplotlib ਵਧੇਰੇ ਰਵਾਇਤੀ RGB ਰੰਗ ਕ੍ਰਮ ਦਾ ਪ੍ਰਯੋਗ ਕਰਦਾ ਹੈ। ਜ਼ਿਆਦਾਤਰ ਮੌਕਿਆਂ 'ਤੇ, ਚਿੱਤਰਾਂ ਨੂੰ ਲੋਡ ਕਰਨ ਤੋਂ ਤੁਰੰਤ ਬਾਅਦ RGB ਵਿੱਚ ਬਦਲਣਾ ਸਮਝਦਾਰੀ ਹੁੰਦੀ ਹੈ।\n" ] }, { @@ -649,14 +649,14 @@ "source": [ "## ਮੋਸ਼ਨ ਨੂੰ Optical Flow ਦੀ ਵਰਤੋਂ ਨਾਲ ਕੱਢੋ\n", "\n", - "ਜਦੋਂ ਸਿਰਫ਼ ਦੋ ਲਗਾਤਾਰ ਫਰੇਮਾਂ ਦੀ ਤੁਲਨਾ ਕੀਤੀ ਜਾਂਦੀ ਹੈ, ਤਾਂ ਇਹ ਸਾਨੂੰ ਬਦਲਾਅ ਦੀ ਮਾਤਰਾ ਦੇਖਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ, ਪਰ ਇਹ ਨਹੀਂ ਦੱਸਦਾ ਕਿ ਅਸਲ ਵਿੱਚ ਕੀ ਹਿਲ ਰਿਹਾ ਹੈ ਅਤੇ ਕਿੱਥੇ। ਇਹ ਜਾਣਕਾਰੀ ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ, ਇੱਕ ਤਕਨੀਕ ਹੈ ਜਿਸਨੂੰ **[optical flow](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)** ਕਿਹਾ ਜਾਂਦਾ ਹੈ:\n", + "ਜਦੋਂ ਅਸੀਂ ਸਿਰਫ਼ ਦੋ ਲਗਾਤਾਰ ਫ੍ਰੇਮਾਂ ਦੀ ਤੁਲਨਾ ਕਰਦੇ ਹਾਂ, ਤਾਂ ਇਹ ਸਾਨੂੰ ਬਦਲਾਅ ਦੀ ਮਾਤਰਾ ਦੇਖਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ, ਪਰ ਇਹ ਸਾਨੂੰ ਇਹ ਜਾਣਕਾਰੀ ਨਹੀਂ ਦਿੰਦਾ ਕਿ ਅਸਲ ਵਿੱਚ ਕੀ ਹਿਲ ਰਿਹਾ ਹੈ ਅਤੇ ਕਿੱਥੇ। ਇਹ ਜਾਣਕਾਰੀ ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ, ਇੱਕ ਤਕਨੀਕ ਹੈ ਜਿਸਨੂੰ **[optical flow](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)** ਕਿਹਾ ਜਾਂਦਾ ਹੈ:\n", "\n", "* **Dense Optical Flow** ਹਰ ਪਿਕਸਲ ਲਈ ਵੇਖਾਉਂਦਾ ਹੈ ਕਿ ਉਹ ਕਿੱਥੇ ਹਿਲ ਰਿਹਾ ਹੈ, ਇਸ ਲਈ ਇਹ ਵੈਕਟਰ ਫੀਲਡ ਦੀ ਗਣਨਾ ਕਰਦਾ ਹੈ।\n", - "* **Sparse Optical Flow** ਚਿੱਤਰ ਵਿੱਚ ਕੁਝ ਵਿਸ਼ੇਸ਼ ਲੱਛਣ (ਜਿਵੇਂ ਕਿ edges) ਲੈਂਦਾ ਹੈ ਅਤੇ ਫਰੇਮ ਤੋਂ ਫਰੇਮ ਤੱਕ ਉਨ੍ਹਾਂ ਦੀ ਰਾਹ ਨੂੰ ਬਣਾਉਂਦਾ ਹੈ।\n", + "* **Sparse Optical Flow** ਚਿੱਤਰ ਵਿੱਚ ਕੁਝ ਵਿਸ਼ੇਸ਼ ਲੱਛਣ (ਜਿਵੇਂ ਕਿ edges) ਲੈਂਦਾ ਹੈ ਅਤੇ ਫ੍ਰੇਮ ਤੋਂ ਫ੍ਰੇਮ ਤੱਕ ਉਨ੍ਹਾਂ ਦੀ trajectory ਬਣਾਉਂਦਾ ਹੈ।\n", "\n", - "Optical Flow ਬਾਰੇ ਹੋਰ ਪੜ੍ਹੋ [ਇਸ ਸ਼ਾਨਦਾਰ ਟਿਊਟੋਰਿਅਲ ਵਿੱਚ](https://learnopencv.com/optical-flow-in-opencv/)।\n", + "Optical Flow ਬਾਰੇ ਹੋਰ ਜਾਣਕਾਰੀ ਲਈ [ਇਹ ਸ਼ਾਨਦਾਰ ਟਿਊਟੋਰਿਅਲ](https://learnopencv.com/optical-flow-in-opencv/) ਪੜ੍ਹੋ।\n", "\n", - "ਆਓ ਆਪਣੇ ਫਰੇਮਾਂ ਦੇ ਵਿਚਕਾਰ dense optical flow ਦੀ ਗਣਨਾ ਕਰੀਏ:\n" + "ਆਓ ਆਪਣੇ ਫ੍ਰੇਮਾਂ ਦੇ ਵਿਚਕਾਰ dense optical flow ਦੀ ਗਣਨਾ ਕਰੀਏ:\n" ] }, { @@ -685,9 +685,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "ਹਰ ਫਰੇਮ ਲਈ, ਫਲੋ ਵਿੱਚ ਫਰੇਮ ਦਾ ਆਕਾਰ ਹੁੰਦਾ ਹੈ, ਅਤੇ 2 ਚੈਨਲ ਹੁੰਦੇ ਹਨ, ਜੋ ਕਿ ਆਪਟਿਕਲ ਫਲੋ ਵੇਕਟਰ ਦੇ x ਅਤੇ y ਘਟਕਾਂ ਨੂੰ ਦਰਸਾਉਂਦੇ ਹਨ।\n", + "ਜਿਵੇਂ ਤੁਸੀਂ ਦੇਖ ਸਕਦੇ ਹੋ, ਹਰ ਫਰੇਮ ਲਈ ਫਲੋ ਵਿੱਚ ਫਰੇਮ ਦੇ ਆਕਾਰ ਦੀ ਮਾਪ ਹੁੰਦੀ ਹੈ, ਅਤੇ 2 ਚੈਨਲ ਹੁੰਦੇ ਹਨ, ਜੋ ਕਿ ਆਪਟਿਕਲ ਫਲੋ ਵੈਕਟਰ ਦੇ x ਅਤੇ y ਘਟਕਾਂ ਨੂੰ ਦਰਸਾਉਂਦੇ ਹਨ।\n", "\n", - "2D ਵਿੱਚ ਆਪਟਿਕਲ ਫਲੋ ਨੂੰ ਦਿਖਾਉਣਾ ਥੋੜ੍ਹਾ ਮੁਸ਼ਕਲ ਹੋ ਸਕਦਾ ਹੈ, ਪਰ ਅਸੀਂ ਇੱਕ ਚਲਾਕ ਵਿਚਾਰ ਵਰਤ ਸਕਦੇ ਹਾਂ। ਜੇ ਅਸੀਂ ਆਪਟਿਕਲ ਫਲੋ ਨੂੰ ਧ੍ਰੁਵਿਕ ਨਿਰਦੇਸ਼ਾਂਕਾਂ (polar coordinates) ਵਿੱਚ ਬਦਲ ਦਈਏ, ਤਾਂ ਸਾਨੂੰ ਹਰ ਪਿਕਸਲ ਲਈ ਦੋ ਘਟਕਾਂ ਮਿਲਣਗੀਆਂ: *ਦਿਸ਼ਾ* ਅਤੇ *ਤੀਬਰਤਾ*। ਅਸੀਂ ਤੀਬਰਤਾ ਨੂੰ ਪਿਕਸਲ ਦੀ ਤੀਬਰਤਾ ਨਾਲ ਦਰਸਾ ਸਕਦੇ ਹਾਂ, ਅਤੇ ਦਿਸ਼ਾ ਨੂੰ ਵੱਖ-ਵੱਖ ਰੰਗਾਂ ਨਾਲ। ਅਸੀਂ ਇੱਕ ਚਿੱਤਰ ਬਣਾਵਾਂਗੇ [HSV (ਹਿਊ-ਸੈਚੂਰੇਸ਼ਨ-ਵੈਲਯੂ) ਰੰਗ ਸਪੇਸ](https://en.wikipedia.org/wiki/HSV_color_space) ਵਿੱਚ, ਜਿੱਥੇ ਹਿਊ (hue) ਨੂੰ ਦਿਸ਼ਾ ਦੁਆਰਾ ਪਰਿਭਾਸ਼ਿਤ ਕੀਤਾ ਜਾਵੇਗਾ, ਵੈਲਯੂ (value) ਨੂੰ ਤੀਬਰਤਾ ਦੁਆਰਾ, ਅਤੇ ਸੈਚੂਰੇਸ਼ਨ 255 ਹੋਵੇਗੀ।\n" + "2D ਵਿੱਚ ਆਪਟਿਕਲ ਫਲੋ ਨੂੰ ਦਿਖਾਉਣਾ ਥੋੜ੍ਹਾ ਮੁਸ਼ਕਲ ਹੈ, ਪਰ ਅਸੀਂ ਇੱਕ ਚਤੁਰਾਈ ਭਰਾ ਵਿਚਾਰ ਵਰਤ ਸਕਦੇ ਹਾਂ। ਜੇ ਅਸੀਂ ਆਪਟਿਕਲ ਫਲੋ ਨੂੰ ਧ੍ਰੁਵਿਕ ਨਿਰਦੇਸ਼ਾਂ (polar coordinates) ਵਿੱਚ ਰੂਪਾਂਤਰਿਤ ਕਰੀਏ, ਤਾਂ ਹਰ ਪਿਕਸਲ ਲਈ ਸਾਨੂੰ ਦੋ ਘਟਕਾਂ ਮਿਲਣਗੀਆਂ: *ਦਿਸ਼ਾ* ਅਤੇ *ਤੀਬਰਤਾ*। ਅਸੀਂ ਤੀਬਰਤਾ ਨੂੰ ਪਿਕਸਲ ਦੀ ਤੀਬਰਤਾ ਨਾਲ ਦਰਸਾ ਸਕਦੇ ਹਾਂ, ਅਤੇ ਦਿਸ਼ਾ ਨੂੰ ਵੱਖ-ਵੱਖ ਰੰਗਾਂ ਨਾਲ। ਅਸੀਂ [HSV (ਹਿਊ-ਸੈਚੁਰੇਸ਼ਨ-ਵੈਲਯੂ) ਰੰਗ ਸਥਾਨ](https://en.wikipedia.org/wiki/HSV_color_space) ਵਿੱਚ ਇੱਕ ਚਿੱਤਰ ਬਣਾਵਾਂਗੇ, ਜਿੱਥੇ ਹਿਊ ਨੂੰ ਦਿਸ਼ਾ ਦੁਆਰਾ ਪਰਿਭਾਸ਼ਿਤ ਕੀਤਾ ਜਾਵੇਗਾ, ਵੈਲਯੂ - ਤੀਬਰਤਾ ਦੁਆਰਾ, ਅਤੇ ਸੈਚੁਰੇਸ਼ਨ 255 ਹੋਵੇਗੀ।\n" ] }, { @@ -736,16 +736,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "ਇਨ੍ਹਾਂ ਫ੍ਰੇਮਾਂ ਵਿੱਚ ਹਰਾ ਰੰਗ ਖੱਬੇ ਵੱਲ ਜਾਣ ਨੂੰ ਦਰਸਾਉਂਦਾ ਹੈ, ਜਦਕਿ ਨੀਲਾ ਰੰਗ ਸੱਜੇ ਵੱਲ ਜਾਣ ਨੂੰ ਦਰਸਾਉਂਦਾ ਹੈ।\n", + "ਇਨ੍ਹਾਂ ਫ੍ਰੇਮਾਂ ਵਿੱਚ ਹਰਾ ਰੰਗ ਖੱਬੇ ਵੱਲ ਹਿਲਣ ਨੂੰ ਦਰਸਾਉਂਦਾ ਹੈ, ਜਦਕਿ ਨੀਲਾ ਰੰਗ ਸੱਜੇ ਵੱਲ ਹਿਲਣ ਨੂੰ ਦਰਸਾਉਂਦਾ ਹੈ।\n", "\n", - "ਆਪਟੀਕਲ ਫਲੋ ਹਲਚਲ ਦੀ ਸਮੁੱਚੀ ਦਿਸ਼ਾ ਬਾਰੇ ਨਤੀਜੇ ਕੱਢਣ ਲਈ ਇੱਕ ਸ਼ਾਨਦਾਰ ਸਾਧਨ ਹੋ ਸਕਦਾ ਹੈ। ਉਦਾਹਰਣ ਲਈ, ਜੇ ਤੁਸੀਂ ਦੇਖਦੇ ਹੋ ਕਿ ਫ੍ਰੇਮ ਵਿੱਚ ਸਾਰੇ ਪਿਕਸਲ ਜ਼ਿਆਦਾਤਰ ਇੱਕ ਹੀ ਦਿਸ਼ਾ ਵਿੱਚ ਹਿਲ ਰਹੇ ਹਨ - ਤਾਂ ਤੁਸੀਂ ਨਤੀਜਾ ਕੱਢ ਸਕਦੇ ਹੋ ਕਿ ਕੈਮਰਾ ਹਿਲ ਰਿਹਾ ਹੈ, ਅਤੇ ਇਸ ਨੂੰ ਪੂਰਾ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰ ਸਕਦੇ ਹੋ।\n" + "ਆਪਟਿਕਲ ਫਲੋ ਆਮ ਹਿਲਚਲ ਦੀ ਦਿਸ਼ਾ ਬਾਰੇ ਨਤੀਜੇ ਕੱਢਣ ਲਈ ਇੱਕ ਸ਼ਾਨਦਾਰ ਸਾਧਨ ਹੋ ਸਕਦਾ ਹੈ। ਉਦਾਹਰਣ ਵਜੋਂ, ਜੇ ਤੁਸੀਂ ਵੇਖਦੇ ਹੋ ਕਿ ਕਿਸੇ ਫ੍ਰੇਮ ਦੇ ਸਾਰੇ ਪਿਕਸਲ ਜ਼ਿਆਦਾ ਜਾਂ ਘੱਟ ਇੱਕੋ ਦਿਸ਼ਾ ਵਿੱਚ ਹਿਲ ਰਹੇ ਹਨ - ਤਾਂ ਤੁਸੀਂ ਨਤੀਜਾ ਕੱਢ ਸਕਦੇ ਹੋ ਕਿ ਕੈਮਰੇ ਦੀ ਹਿਲਚਲ ਹੋ ਰਹੀ ਹੈ, ਅਤੇ ਉਸਨੂੰ ਪੂਰਾ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰ ਸਕਦੇ ਹੋ।\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**ਅਸਵੀਕਰਤੀ**: \nਇਹ ਦਸਤਾਵੇਜ਼ AI ਅਨੁਵਾਦ ਸੇਵਾ [Co-op Translator](https://github.com/Azure/co-op-translator) ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਅਨੁਵਾਦ ਕੀਤਾ ਗਿਆ ਹੈ। ਜਦੋਂ ਕਿ ਅਸੀਂ ਸਹੀ ਹੋਣ ਦਾ ਯਤਨ ਕਰਦੇ ਹਾਂ, ਕਿਰਪਾ ਕਰਕੇ ਧਿਆਨ ਦਿਓ ਕਿ ਸਵੈਚਾਲਿਤ ਅਨੁਵਾਦਾਂ ਵਿੱਚ ਗਲਤੀਆਂ ਜਾਂ ਅਸੁੱਤੀਆਂ ਹੋ ਸਕਦੀਆਂ ਹਨ। ਇਸ ਦੀ ਮੂਲ ਭਾਸ਼ਾ ਵਿੱਚ ਮੌਜੂਦ ਮੂਲ ਦਸਤਾਵੇਜ਼ ਨੂੰ ਪ੍ਰਮਾਣਿਕ ਸਰੋਤ ਮੰਨਿਆ ਜਾਣਾ ਚਾਹੀਦਾ ਹੈ। ਮਹੱਤਵਪੂਰਨ ਜਾਣਕਾਰੀ ਲਈ, ਪੇਸ਼ੇਵਰ ਮਨੁੱਖੀ ਅਨੁਵਾਦ ਦੀ ਸਿਫਾਰਸ਼ ਕੀਤੀ ਜਾਂਦੀ ਹੈ। ਇਸ ਅਨੁਵਾਦ ਦੇ ਪ੍ਰਯੋਗ ਤੋਂ ਪੈਦਾ ਹੋਣ ਵਾਲੇ ਕਿਸੇ ਵੀ ਗਲਤਫਹਮੀ ਜਾਂ ਗਲਤ ਵਿਆਖਿਆ ਲਈ ਅਸੀਂ ਜ਼ਿੰਮੇਵਾਰ ਨਹੀਂ ਹਾਂ। \n" + "\n---\n\n**ਅਸਵੀਕਾਰਨਾ**: \nਇਹ ਦਸਤਾਵੇਜ਼ AI ਅਨੁਵਾਦ ਸੇਵਾ [Co-op Translator](https://github.com/Azure/co-op-translator) ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਅਨੁਵਾਦ ਕੀਤਾ ਗਿਆ ਹੈ। ਹਾਲਾਂਕਿ ਅਸੀਂ ਸਹੀਅਤਾ ਲਈ ਯਤਨਸ਼ੀਲ ਹਾਂ, ਕਿਰਪਾ ਕਰਕੇ ਧਿਆਨ ਦਿਓ ਕਿ ਸਵੈਚਾਲਿਤ ਅਨੁਵਾਦਾਂ ਵਿੱਚ ਗਲਤੀਆਂ ਜਾਂ ਅਸੁੱਤੀਆਂ ਹੋ ਸਕਦੀਆਂ ਹਨ। ਮੂਲ ਦਸਤਾਵੇਜ਼ ਨੂੰ ਇਸਦੀ ਮੂਲ ਭਾਸ਼ਾ ਵਿੱਚ ਅਧਿਕਾਰਤ ਸਰੋਤ ਮੰਨਿਆ ਜਾਣਾ ਚਾਹੀਦਾ ਹੈ। ਮਹੱਤਵਪੂਰਨ ਜਾਣਕਾਰੀ ਲਈ, ਪੇਸ਼ੇਵਰ ਮਨੁੱਖੀ ਅਨੁਵਾਦ ਦੀ ਸਿਫਾਰਸ਼ ਕੀਤੀ ਜਾਂਦੀ ਹੈ। ਇਸ ਅਨੁਵਾਦ ਦੀ ਵਰਤੋਂ ਤੋਂ ਪੈਦਾ ਹੋਣ ਵਾਲੇ ਕਿਸੇ ਵੀ ਗਲਤਫਹਿਮੀ ਜਾਂ ਗਲਤ ਵਿਆਖਿਆ ਲਈ ਅਸੀਂ ਜ਼ਿੰਮੇਵਾਰ ਨਹੀਂ ਹਾਂ।\n" ] } ], @@ -772,8 +772,8 @@ }, "orig_nbformat": 4, "coopTranslator": { - "original_hash": "ad5bdca62175c7a3d4336ef8c761aef3", - "translation_date": "2025-08-28T08:09:08+00:00", + "original_hash": "339b2129f86b24024393ff92b8bd376f", + "translation_date": "2025-09-07T15:02:09+00:00", "source_file": "lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb", "language_code": "pa" } diff --git a/translations/pl/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb b/translations/pl/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb index e90448cb..7dbb8d73 100644 --- a/translations/pl/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb +++ b/translations/pl/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb @@ -44,7 +44,7 @@ "source": [ "## Ładowanie obrazów\n", "\n", - "Obrazy w Pythonie można wygodnie reprezentować za pomocą tablic NumPy. Na przykład obraz w skali szarości o rozmiarze 320x200 pikseli byłby przechowywany w tablicy o wymiarach 200x320, a kolorowy obraz o tych samych wymiarach miałby kształt 200x320x3 (dla 3 kanałów kolorów).\n", + "Obrazy w Pythonie można wygodnie reprezentować za pomocą tablic NumPy. Na przykład obraz w skali szarości o rozmiarze 320x200 pikseli byłby przechowywany w tablicy 200x320, a kolorowy obraz o tych samych wymiarach miałby kształt 200x320x3 (dla 3 kanałów kolorów).\n", "\n", "Zacznijmy od załadowania obrazu:\n" ] @@ -135,7 +135,7 @@ "source": [ "bw_im = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)\n", "print(bw_im.shape)\n", - "plt.imshow(bw_im)" + "plt.imshow(bw_im, cmap='gray')" ] }, { @@ -144,9 +144,9 @@ "source": [ "## Przetwarzanie obrazów Braille'a\n", "\n", - "Jeśli chcemy zastosować klasyfikację obrazów do rozpoznawania tekstu, musimy wyciąć pojedyncze symbole, aby były podobne do obrazów MNIST, które widzieliśmy wcześniej. Można to zrobić za pomocą techniki [detekcji obiektów](../11-ObjectDetection/README.md), którą omówimy później, ale możemy również spróbować wykorzystać do tego czystą wizję komputerową. Dobry opis tego, jak wizja komputerowa może być używana do separacji znaków, można znaleźć [w tym wpisie na blogu](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) - tutaj skupimy się tylko na niektórych technikach wizji komputerowej.\n", + "Jeśli chcemy zastosować klasyfikację obrazów do rozpoznawania tekstu, musimy wyciąć pojedyncze symbole, aby były podobne do obrazów MNIST, które widzieliśmy wcześniej. Można to zrobić za pomocą techniki [detekcji obiektów](../11-ObjectDetection/README.md), którą omówimy później, ale możemy również spróbować użyć czystej wizji komputerowej do tego celu. Dobry opis tego, jak wizja komputerowa może być użyta do separacji znaków, można znaleźć [w tym wpisie na blogu](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) - tutaj skupimy się tylko na niektórych technikach wizji komputerowej.\n", "\n", - "Najpierw spróbujmy nieco poprawić obraz. Możemy wykorzystać ideę **progowania** (dobrze opisaną [w tym artykule OpenCV](https://docs.opencv.org/4.x/d7/d4d/tutorial_py_thresholding.html)):\n" + "Najpierw spróbujmy trochę poprawić obraz. Możemy skorzystać z pomysłu **progowania** (dobrze opisany [w tym artykule OpenCV](https://docs.opencv.org/4.x/d7/d4d/tutorial_py_thresholding.html)):\n" ] }, { @@ -192,7 +192,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Aby pracować z obrazami, musimy \"wyodrębnić\" pojedyncze punkty, tj. przekształcić obrazy na zestaw współrzędnych pojedynczych punktów. Możemy to zrobić za pomocą technik **ekstrakcji cech**, takich jak SIFT, SURF lub [ORB](https://docs.opencv.org/4.x/d1/d89/tutorial_py_orb.html):\n" + "Aby pracować z obrazami, musimy \"wyodrębnić\" pojedyncze punkty, tj. przekształcić obrazy w zbiór współrzędnych pojedynczych punktów. Możemy to zrobić za pomocą technik **ekstrakcji cech**, takich jak SIFT, SURF lub [ORB](https://docs.opencv.org/4.x/d1/d89/tutorial_py_orb.html):\n" ] }, { @@ -293,7 +293,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Tekst ten może być częściowo obrócony, a aby go idealnie wyrównać, musimy wykonać tak zwaną **transformację perspektywy**. Weźmiemy prostokąt zdefiniowany przez punkty $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ i wyrównamy go z nowym obrazem o proporcjonalnych wymiarach:\n" + "Ten tekst może być częściowo obrócony, a aby go idealnie wyrównać, musimy wykonać tak zwaną **transformację perspektywy**. Weźmiemy prostokąt zdefiniowany przez punkty $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ i wyrównamy go z nowym obrazem o proporcjonalnych wymiarach:\n" ] }, { @@ -340,7 +340,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Po uzyskaniu dobrze wyrównanego obrazu, powinno być stosunkowo łatwo podzielić go na kawałki:\n" + "Po uzyskaniu tego dobrze wyrównanego obrazu, powinno być stosunkowo łatwo podzielić go na kawałki:\n" ] }, { @@ -393,7 +393,7 @@ "source": [ "## Wykrywanie ruchu za pomocą różnicy między klatkami\n", "\n", - "Wykrywanie ruchu w strumieniu wideo to bardzo częste zadanie. Na przykład pozwala nam otrzymywać powiadomienia, gdy coś dzieje się na kamerze monitoringu. Jeśli chcemy zrozumieć, co dzieje się na kamerze, możemy użyć sieci neuronowej – ale jest to znacznie tańsze, gdy używamy sieci neuronowej tylko wtedy, gdy wiemy, że coś się dzieje.\n", + "Wykrywanie ruchu w strumieniu wideo to bardzo częste zadanie. Na przykład pozwala nam otrzymywać powiadomienia, gdy coś dzieje się na kamerze monitoringu. Jeśli chcemy zrozumieć, co dzieje się na kamerze, możemy użyć sieci neuronowej – ale korzystanie z niej jest znacznie tańsze, gdy wiemy, że coś faktycznie się dzieje.\n", "\n", "Główna idea wykrywania ruchu jest prosta. Jeśli kamera jest nieruchoma, to klatki z kamery powinny być do siebie bardzo podobne. Ponieważ klatki są reprezentowane jako tablice, wystarczy odjąć te tablice dla dwóch kolejnych klatek, aby uzyskać różnicę pikseli, która powinna być niska dla statycznych klatek, a wzrastać, gdy w obrazie pojawia się znaczący ruch.\n", "\n", @@ -490,7 +490,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Przypuśćmy, że chcemy stworzyć raport pokazujący, co działo się przed kamerą, wyświetlając odpowiedni obraz za każdym razem, gdy coś się dzieje. Aby to zrobić, prawdopodobnie będziemy chcieli znaleźć początkową i końcową klatkę \"zdarzenia\" i wyświetlić środkową klatkę. Aby usunąć trochę szumu, wygładzimy również powyższą krzywą za pomocą funkcji średniej kroczącej:\n" + "Załóżmy, że chcemy stworzyć raport pokazujący, co działo się przed kamerą, wyświetlając odpowiedni obraz za każdym razem, gdy coś się dzieje. Aby to zrobić, prawdopodobnie będziemy chcieli znaleźć początkową i końcową klatkę \"zdarzenia\" i wyświetlić środkową klatkę. Aby usunąć trochę szumu, wygładzimy również powyższą krzywą za pomocą funkcji średniej kroczącej:\n" ] }, { @@ -610,7 +610,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Możesz zauważyć, że schemat kolorów na tym obrazie nie wygląda poprawnie! Dzieje się tak, ponieważ OpenCV z powodów historycznych ładuje obrazy w przestrzeni kolorów BGR, podczas gdy matplotlib używa bardziej tradycyjnego porządku kolorów RGB. Większość czasu ma sens, aby natychmiast po załadowaniu przekonwertować obrazy na RGB.\n" + "Możesz zauważyć, że schemat kolorów na tym obrazie nie wygląda poprawnie! Dzieje się tak, ponieważ OpenCV z powodów historycznych ładuje obrazy w przestrzeni kolorów BGR, podczas gdy matplotlib używa bardziej tradycyjnego porządku kolorów RGB. W większości przypadków warto natychmiast po załadowaniu przekonwertować obrazy na RGB.\n" ] }, { @@ -653,7 +653,7 @@ "\n", "Porównywanie dwóch kolejnych klatek pozwala zobaczyć ilość zmian, ale nie dostarcza informacji o tym, co dokładnie się porusza i gdzie. Aby uzyskać te informacje, stosuje się technikę zwaną **[optycznym przepływem](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)**:\n", "\n", - "* **Gęsty optyczny przepływ** oblicza pole wektorowe, które pokazuje, gdzie każdy piksel się przemieszcza.\n", + "* **Gęsty optyczny przepływ** oblicza pole wektorowe, które pokazuje, gdzie każdy piksel się porusza\n", "* **Rzadki optyczny przepływ** opiera się na wybraniu charakterystycznych cech obrazu (np. krawędzi) i śledzeniu ich trajektorii z klatki na klatkę.\n", "\n", "Więcej o optycznym przepływie przeczytasz [w tym świetnym poradniku](https://learnopencv.com/optical-flow-in-opencv/).\n", @@ -687,9 +687,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Jak widać, dla każdej klatki przepływ ma wymiary klatki oraz 2 kanały, odpowiadające składowym x i y wektora optycznego przepływu.\n", + "Jak widać, dla każdej klatki przepływ ma wymiary odpowiadające klatce oraz 2 kanały, które odpowiadają składowym x i y wektora optycznego przepływu.\n", "\n", - "Wyświetlanie optycznego przepływu w 2D jest nieco trudne, ale możemy zastosować sprytny pomysł. Jeśli przekształcimy optyczny przepływ na współrzędne biegunowe, otrzymamy dwa komponenty dla każdego piksela: *kierunek* i *intensywność*. Intensywność możemy przedstawić za pomocą jasności piksela, a kierunek za pomocą różnych kolorów. Stworzymy obraz w [przestrzeni barw HSV (Hue-Saturation-Value)](https://en.wikipedia.org/wiki/HSV_color_space), gdzie odcień (hue) będzie określany przez kierunek, wartość (value) przez intensywność, a nasycenie (saturation) będzie wynosić 255.\n" + "Wyświetlanie optycznego przepływu w 2D jest nieco trudne, ale możemy skorzystać z pewnego sprytnego pomysłu. Jeśli przekształcimy optyczny przepływ na współrzędne biegunowe, otrzymamy dwie składowe dla każdego piksela: *kierunek* i *intensywność*. Intensywność możemy przedstawić za pomocą jasności piksela, a kierunek za pomocą różnych kolorów. Stworzymy obraz w [przestrzeni kolorów HSV (Hue-Saturation-Value)](https://en.wikipedia.org/wiki/HSV_color_space), gdzie odcień (hue) będzie określany przez kierunek, wartość (value) przez intensywność, a nasycenie (saturation) będzie wynosić 255.\n" ] }, { @@ -740,14 +740,14 @@ "source": [ "Więc w tych klatkach zielonkawy kolor odpowiada ruchowi w lewo, a niebieski - ruchowi w prawo.\n", "\n", - "Optyczny przepływ może być świetnym narzędziem do wyciągania wniosków na temat ogólnego kierunku ruchu. Na przykład, jeśli zauważysz, że wszystkie piksele w klatce poruszają się mniej więcej w jednym kierunku - możesz wywnioskować, że ma miejsce ruch kamery i spróbować to skompensować.\n" + "Optyczny przepływ może być świetnym narzędziem do wyciągania wniosków na temat ogólnego kierunku ruchu. Na przykład, jeśli widzisz, że wszystkie piksele w klatce poruszają się mniej więcej w jednym kierunku - możesz wywnioskować, że jest ruch kamery i spróbować to skompensować.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**Zastrzeżenie**: \nTen dokument został przetłumaczony za pomocą usługi tłumaczenia AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż staramy się zapewnić dokładność, prosimy mieć na uwadze, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za wiarygodne źródło. W przypadku informacji krytycznych zaleca się skorzystanie z profesjonalnego tłumaczenia wykonanego przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia.\n" + "\n---\n\n**Zastrzeżenie**: \nTen dokument został przetłumaczony za pomocą usługi tłumaczeniowej AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż dokładamy wszelkich starań, aby tłumaczenie było precyzyjne, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za wiarygodne źródło. W przypadku informacji krytycznych zaleca się skorzystanie z profesjonalnego tłumaczenia wykonanego przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z korzystania z tego tłumaczenia.\n" ] } ], @@ -774,8 +774,8 @@ }, "orig_nbformat": 4, "coopTranslator": { - "original_hash": "ad5bdca62175c7a3d4336ef8c761aef3", - "translation_date": "2025-08-31T12:56:45+00:00", + "original_hash": "339b2129f86b24024393ff92b8bd376f", + "translation_date": "2025-09-07T15:04:55+00:00", "source_file": "lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb", "language_code": "pl" } diff --git a/translations/pt/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb b/translations/pt/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb index 618e41cd..ebe6a369 100644 --- a/translations/pt/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb +++ b/translations/pt/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb @@ -8,11 +8,11 @@ "\n", "Este notebook faz parte do [Currículo de IA para Iniciantes](http://aka.ms/ai-beginners).\n", "\n", - "O [OpenCV](https://opencv.org/) é considerado o padrão *de facto* para processamento de imagens. Ele contém muitos algoritmos úteis, implementados em C++. Também é possível utilizar o OpenCV com Python.\n", + "[OpenCV](https://opencv.org/) é considerado o padrão *de facto* para processamento de imagens. Ele contém muitos algoritmos úteis, implementados em C++. Também é possível utilizar o OpenCV com Python.\n", "\n", - "Neste notebook, iremos apresentar alguns exemplos de como usar o OpenCV. Para mais detalhes, pode visitar o curso online [Learn OpenCV](https://learnopencv.com/getting-started-with-opencv/).\n", + "Neste notebook, iremos mostrar alguns exemplos de como usar o OpenCV. Para mais detalhes, pode visitar o curso online [Learn OpenCV](https://learnopencv.com/getting-started-with-opencv/).\n", "\n", - "Primeiro, vamos `import cv2`, bem como algumas outras bibliotecas úteis:\n" + "Primeiro, vamos `importar cv2`, assim como algumas outras bibliotecas úteis:\n" ] }, { @@ -135,7 +135,7 @@ "source": [ "bw_im = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)\n", "print(bw_im.shape)\n", - "plt.imshow(bw_im)" + "plt.imshow(bw_im, cmap='gray')" ] }, { @@ -144,7 +144,7 @@ "source": [ "## Processamento de Imagens em Braille\n", "\n", - "Se quisermos aplicar classificação de imagens para reconhecer o texto, precisamos recortar os símbolos individuais para torná-los semelhantes às imagens MNIST que vimos anteriormente. Isso pode ser feito utilizando a técnica de [detecção de objetos](../11-ObjectDetection/README.md), que discutiremos mais tarde, mas também podemos tentar usar visão computacional pura para isso. Uma boa descrição de como a visão computacional pode ser usada para separar caracteres pode ser encontrada [neste artigo de blog](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) - aqui vamos focar apenas em algumas técnicas de visão computacional.\n", + "Se quisermos aplicar classificação de imagens para reconhecer o texto, precisamos recortar os símbolos individuais para torná-los semelhantes às imagens MNIST que vimos anteriormente. Isso pode ser feito usando a técnica de [detecção de objetos](../11-ObjectDetection/README.md), que discutiremos mais tarde, mas também podemos tentar usar visão computacional pura para isso. Uma boa descrição de como a visão computacional pode ser usada para separar caracteres pode ser encontrada [neste artigo de blog](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) - aqui vamos focar apenas em algumas técnicas de visão computacional.\n", "\n", "Primeiro, vamos tentar melhorar um pouco a imagem. Podemos usar a ideia de **limiarização** (bem descrita [neste artigo do OpenCV](https://docs.opencv.org/4.x/d7/d4d/tutorial_py_thresholding.html)):\n" ] @@ -340,7 +340,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Depois de obtermos esta imagem bem alinhada, deverá ser relativamente fácil dividi-la em partes:\n" + "Depois de obtermos esta imagem bem alinhada, deverá ser relativamente fácil cortá-la em pedaços:\n" ] }, { @@ -384,18 +384,18 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Você viu que muitas tarefas podem ser realizadas usando apenas processamento de imagem, sem qualquer inteligência artificial. Se pudermos usar técnicas de visão computacional para simplificar o trabalho de uma rede neural - devemos definitivamente fazê-lo, porque isso nos permitirá resolver problemas com um número menor de dados de treino.\n" + "Já viu que muitas tarefas podem ser realizadas utilizando apenas processamento de imagem puro, sem qualquer inteligência artificial. Se pudermos usar técnicas de visão por computador para simplificar o trabalho de uma rede neural - devemos definitivamente fazê-lo, pois isso permitirá resolver problemas com um número menor de dados de treino.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Deteção de Movimento usando Diferença de Frames\n", + "## Detecção de Movimento usando Diferença de Frames\n", "\n", - "A deteção de movimento em transmissões de vídeo é uma tarefa muito comum. Por exemplo, permite-nos receber alertas quando algo acontece numa câmara de vigilância. Se quisermos compreender o que está a acontecer na câmara, podemos então usar uma rede neural - mas é muito mais económico usar a rede neural apenas quando sabemos que algo está a acontecer.\n", + "Detectar movimento em transmissões de vídeo é uma tarefa muito comum. Por exemplo, permite-nos receber alertas quando algo acontece numa câmara de vigilância. Se quisermos compreender o que está a acontecer na câmara, podemos então usar uma rede neural - mas é muito mais económico utilizar uma rede neural apenas quando sabemos que algo está a acontecer.\n", "\n", - "A ideia principal da deteção de movimento é simples. Se a câmara estiver fixa, os frames capturados pela câmara devem ser bastante semelhantes entre si. Como os frames são representados como matrizes, ao subtrair essas matrizes de dois frames consecutivos, obtemos a diferença de píxeis, que deve ser baixa para frames estáticos e tornar-se mais elevada quando há um movimento significativo na imagem.\n", + "A ideia principal da detecção de movimento é simples. Se a câmara estiver fixa, os frames capturados pela câmara devem ser bastante semelhantes entre si. Como os frames são representados como matrizes, ao subtrair essas matrizes de dois frames consecutivos, obtemos a diferença de pixels, que deve ser baixa para frames estáticos e tornar-se mais alta quando há movimento significativo na imagem.\n", "\n", "Vamos começar por aprender como abrir um vídeo e convertê-lo numa sequência de frames:\n" ] @@ -610,7 +610,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Pode notar que o esquema de cores nesta imagem não parece correto! Isto acontece porque o OpenCV, por razões históricas, carrega imagens no espaço de cores BGR, enquanto o matplotlib utiliza a ordem de cores RGB mais tradicional. Na maioria das vezes, faz sentido converter as imagens para RGB imediatamente após carregá-las.\n" + "Pode notar que o esquema de cores nesta imagem não parece correto! Isto deve-se ao facto de o OpenCV, por razões históricas, carregar imagens no espaço de cores BGR, enquanto o matplotlib utiliza a ordem de cores RGB mais tradicional. Na maioria das vezes, faz sentido converter as imagens para RGB imediatamente após carregá-las.\n" ] }, { @@ -649,16 +649,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Extrair Movimento usando Fluxo Ótico\n", + "## Extrair Movimento usando Fluxo Óptico\n", "\n", - "Embora comparar dois fotogramas consecutivos nos permita ver a quantidade de mudanças, isso não fornece informações sobre o que está realmente a mover-se e onde. Para obter essas informações, existe uma técnica chamada **[fluxo ótico](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)**:\n", + "Embora comparar dois fotogramas consecutivos nos permita ver a quantidade de mudanças, isso não fornece informações sobre o que está realmente a mover-se e onde. Para obter essas informações, existe uma técnica chamada **[fluxo óptico](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)**:\n", "\n", - "* **Fluxo Ótico Denso** calcula o campo vetorial que mostra para cada pixel para onde está a mover-se.\n", - "* **Fluxo Ótico Esparso** baseia-se em identificar algumas características distintivas na imagem (por exemplo, contornos) e construir a sua trajetória de fotograma para fotograma.\n", + "* **Fluxo Óptico Denso** calcula o campo vetorial que mostra para cada pixel para onde está a mover-se.\n", + "* **Fluxo Óptico Esparso** baseia-se em identificar algumas características distintivas na imagem (por exemplo, contornos) e construir a sua trajetória de fotograma para fotograma.\n", "\n", - "Leia mais sobre fluxo ótico [neste excelente tutorial](https://learnopencv.com/optical-flow-in-opencv/).\n", + "Leia mais sobre fluxo óptico [neste excelente tutorial](https://learnopencv.com/optical-flow-in-opencv/).\n", "\n", - "Vamos calcular o fluxo ótico denso entre os nossos fotogramas:\n" + "Vamos calcular o fluxo óptico denso entre os nossos fotogramas:\n" ] }, { @@ -738,16 +738,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Assim, nesses fotogramas, a cor esverdeada corresponde ao movimento para a esquerda, enquanto o azul indica movimento para a direita.\n", + "Então, nesses frames, a cor esverdeada corresponde ao movimento para a esquerda, enquanto o azul indica movimento para a direita.\n", "\n", - "O fluxo ótico pode ser uma excelente ferramenta para tirar conclusões sobre a direção geral do movimento. Por exemplo, se observar que todos os píxeis num fotograma estão a mover-se mais ou menos numa única direção, pode concluir que há movimento da câmara e tentar compensar isso.\n" + "O fluxo óptico pode ser uma excelente ferramenta para tirar conclusões sobre a direção geral do movimento. Por exemplo, se observar que todos os píxeis num frame estão a mover-se mais ou menos numa única direção, pode concluir que há movimento da câmara e tentar compensar isso.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**Aviso**: \nEste documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos pela precisão, é importante notar que traduções automáticas podem conter erros ou imprecisões. O documento original na sua língua nativa deve ser considerado a fonte autoritária. Para informações críticas, recomenda-se uma tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações incorretas decorrentes da utilização desta tradução.\n" + "\n---\n\n**Aviso Legal**: \nEste documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automáticas podem conter erros ou imprecisões. O documento original no seu idioma nativo deve ser considerado a fonte oficial. Para informações críticas, recomenda-se uma tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações incorretas resultantes do uso desta tradução.\n" ] } ], @@ -774,8 +774,8 @@ }, "orig_nbformat": 4, "coopTranslator": { - "original_hash": "ad5bdca62175c7a3d4336ef8c761aef3", - "translation_date": "2025-08-31T11:42:38+00:00", + "original_hash": "339b2129f86b24024393ff92b8bd376f", + "translation_date": "2025-09-07T15:02:50+00:00", "source_file": "lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb", "language_code": "pt" } diff --git a/translations/ro/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb b/translations/ro/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb index a9836963..7a033d00 100644 --- a/translations/ro/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb +++ b/translations/ro/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb @@ -135,7 +135,7 @@ "source": [ "bw_im = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)\n", "print(bw_im.shape)\n", - "plt.imshow(bw_im)" + "plt.imshow(bw_im, cmap='gray')" ] }, { @@ -192,7 +192,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Pentru a lucra cu imagini, trebuie să \"extragem\" punctele individuale, adică să convertim imaginile într-un set de coordonate ale punctelor individuale. Putem face acest lucru folosind tehnici de **extragere a caracteristicilor**, cum ar fi SIFT, SURF sau [ORB](https://docs.opencv.org/4.x/d1/d89/tutorial_py_orb.html):\n" + "Pentru a lucra cu imagini, trebuie să \"extragem\" punctele individuale, adică să convertim imaginile într-un set de coordonate ale punctelor individuale. Putem face acest lucru folosind tehnici de **extragere a caracteristicilor**, precum SIFT, SURF sau [ORB](https://docs.opencv.org/4.x/d1/d89/tutorial_py_orb.html):\n" ] }, { @@ -384,7 +384,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Ați văzut că destul de multe sarcini pot fi realizate folosind procesarea pură a imaginilor, fără nicio inteligență artificială. Dacă putem utiliza tehnici de viziune computerizată pentru a simplifica munca unei rețele neuronale - ar trebui să o facem cu siguranță, deoarece ne va permite să rezolvăm problemele cu un număr mai mic de date de antrenament.\n" + "Ai văzut că destul de multe sarcini pot fi realizate folosind procesarea pură a imaginilor, fără inteligență artificială. Dacă putem utiliza tehnici de viziune computerizată pentru a simplifica munca unei rețele neuronale - ar trebui să o facem cu siguranță, deoarece acest lucru ne va permite să rezolvăm problemele cu un număr mai mic de date de antrenament.\n" ] }, { @@ -395,7 +395,7 @@ "\n", "Detectarea mișcării într-un flux video este o sarcină foarte frecventă. De exemplu, ne permite să primim alerte atunci când se întâmplă ceva pe o cameră de supraveghere. Dacă vrem să înțelegem ce se întâmplă pe cameră, putem folosi o rețea neuronală - dar este mult mai ieftin să utilizăm o rețea neuronală doar atunci când știm că ceva se întâmplă.\n", "\n", - "Ideea principală a detectării mișcării este simplă. Dacă camera este fixă, atunci cadrele capturate de cameră ar trebui să fie destul de similare între ele. Deoarece cadrele sunt reprezentate ca matrice, doar scăzând aceste matrice pentru două cadre consecutive vom obține diferența de pixeli, care ar trebui să fie mică pentru cadre statice și să devină mai mare atunci când există o mișcare semnificativă în imagine.\n", + "Ideea principală a detectării mișcării este simplă. Dacă camera este fixă, atunci cadrele capturate de cameră ar trebui să fie destul de similare între ele. Deoarece cadrele sunt reprezentate ca matrice, doar prin scăderea acestor matrice pentru două cadre consecutive vom obține diferența de pixeli, care ar trebui să fie mică pentru cadre statice și să devină mai mare atunci când există o mișcare semnificativă în imagine.\n", "\n", "Vom începe prin a învăța cum să deschidem un videoclip și să-l convertim într-o secvență de cadre:\n" ] @@ -445,7 +445,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Deoarece culoarea nu este atât de importantă pentru detectarea mișcării, vom converti toate cadrele în tonuri de gri. Apoi, vom calcula diferențele dintre cadre și vom reprezenta normele acestora pentru a vedea vizual cantitatea de activitate care are loc:\n" + "Deoarece culoarea nu este atât de importantă pentru detectarea mișcării, vom converti toate cadrele în tonuri de gri. Apoi, vom calcula diferențele dintre cadre și vom reprezenta grafic normele acestora pentru a vedea vizual cantitatea de activitate care are loc:\n" ] }, { @@ -490,7 +490,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Presupunem că dorim să creăm un raport care să arate ce s-a întâmplat în fața camerei, afișând imaginea potrivită de fiecare dată când se întâmplă ceva. Pentru a face acest lucru, probabil dorim să identificăm cadrul de început și cel de sfârșit al unui „eveniment” și să afișăm cadrul din mijloc. Pentru a elimina un pic de zgomot, vom netezi, de asemenea, curba de mai sus cu funcția de medie mobilă:\n" + "Presupunem că dorim să creăm un raport care să arate ce s-a întâmplat în fața camerei, afișând imaginea potrivită de fiecare dată când se întâmplă ceva. Pentru a face acest lucru, probabil dorim să identificăm cadrul de început și cel de sfârșit al unui „eveniment” și să afișăm cadrul din mijloc. Pentru a elimina un pic de zgomot, vom netezi, de asemenea, curba de mai sus folosind funcția de medie mobilă:\n" ] }, { @@ -535,7 +535,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Acum putem găsi cadrele care au numărul de modificări peste prag folosind `np.where` și extrage o secvență de cadre consecutive care este mai lungă de 30 de cadre:\n" + "Acum putem găsi cadrele care au numărul de modificări peste prag folosind `np.where` și putem extrage o secvență de cadre consecutive care este mai lungă de 30 de cadre:\n" ] }, { @@ -608,7 +608,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "S-ar putea să observați că schema de culori din această imagine nu arată corect! Acest lucru se întâmplă deoarece OpenCV, din motive istorice, încarcă imaginile în spațiul de culori BGR, în timp ce matplotlib folosește ordinea de culori RGB mai tradițională. De cele mai multe ori, are sens să convertiți imaginile în RGB imediat după ce le încărcați.\n" + "Este posibil să observați că schema de culori din această imagine nu arată corect! Acest lucru se întâmplă deoarece OpenCV, din motive istorice, încarcă imaginile în spațiul de culori BGR, în timp ce matplotlib folosește ordinea mai tradițională de culori RGB. De cele mai multe ori, are sens să convertiți imaginile în RGB imediat după ce le încărcați.\n" ] }, { @@ -649,7 +649,7 @@ "source": [ "## Extrage Mișcarea folosind Fluxul Optic\n", "\n", - "Deși compararea a două cadre consecutive ne permite să vedem cantitatea de schimbări, nu oferă informații despre ce anume se mișcă și unde. Pentru a obține aceste informații, există o tehnică numită **[flux optic](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)**:\n", + "Deși compararea a două cadre consecutive ne permite să vedem cantitatea de schimbări, aceasta nu oferă informații despre ce anume se mișcă și unde. Pentru a obține aceste informații, există o tehnică numită **[flux optic](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)**:\n", "\n", "* **Flux Optic Dens** calculează câmpul vectorial care arată pentru fiecare pixel unde se mișcă.\n", "* **Flux Optic Rar** se bazează pe identificarea unor caracteristici distinctive în imagine (de exemplu, margini) și construirea traiectoriei lor de la un cadru la altul.\n", @@ -687,7 +687,7 @@ "source": [ "Așa cum se poate observa, pentru fiecare cadru, fluxul are dimensiunea cadrului și 2 canale, corespunzătoare componentelor x și y ale vectorului de flux optic.\n", "\n", - "Afișarea fluxului optic în 2D este puțin provocatoare, dar putem folosi o idee ingenioasă. Dacă convertim fluxul optic în coordonate polare, vom obține două componente pentru fiecare pixel: *direcție* și *intensitate*. Putem reprezenta intensitatea prin intensitatea pixelului, iar direcția prin culori diferite. Vom crea o imagine în [spațiul de culoare HSV (Hue-Saturation-Value)](https://en.wikipedia.org/wiki/HSV_color_space), unde nuanța (hue) va fi definită de direcție, valoarea (value) de intensitate, iar saturația va fi 255.\n" + "Afișarea fluxului optic în 2D este puțin dificilă, dar putem folosi o idee ingenioasă. Dacă convertim fluxul optic în coordonate polare, vom obține două componente pentru fiecare pixel: *direcția* și *intensitatea*. Putem reprezenta intensitatea prin intensitatea pixelului, iar direcția prin culori diferite. Vom crea o imagine în [spațiul de culori HSV (Hue-Saturation-Value)](https://en.wikipedia.org/wiki/HSV_color_space), unde nuanța va fi definită de direcție, valoarea - de intensitate, iar saturația va fi 255.\n" ] }, { @@ -745,7 +745,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**Declinare de responsabilitate**: \nAcest document a fost tradus folosind serviciul de traducere AI [Co-op Translator](https://github.com/Azure/co-op-translator). Deși ne străduim să asigurăm acuratețea, vă rugăm să fiți conștienți că traducerile automate pot conține erori sau inexactități. Documentul original în limba sa natală ar trebui considerat sursa autoritară. Pentru informații critice, se recomandă traducerea profesională realizată de un specialist uman. Nu ne asumăm responsabilitatea pentru eventualele neînțelegeri sau interpretări greșite care pot apărea din utilizarea acestei traduceri.\n" + "\n---\n\n**Declinarea responsabilității**: \nAcest document a fost tradus folosind serviciul de traducere AI [Co-op Translator](https://github.com/Azure/co-op-translator). Deși depunem eforturi pentru a asigura acuratețea, vă rugăm să aveți în vedere că traducerile automate pot conține erori sau inexactități. Documentul original în limba sa nativă ar trebui considerat sursa autoritară. Pentru informații critice, se recomandă traducerea profesională realizată de un specialist uman. Nu ne asumăm răspunderea pentru eventualele neînțelegeri sau interpretări greșite care pot apărea din utilizarea acestei traduceri.\n" ] } ], @@ -772,8 +772,8 @@ }, "orig_nbformat": 4, "coopTranslator": { - "original_hash": "ad5bdca62175c7a3d4336ef8c761aef3", - "translation_date": "2025-08-29T23:31:53+00:00", + "original_hash": "339b2129f86b24024393ff92b8bd376f", + "translation_date": "2025-09-07T15:18:23+00:00", "source_file": "lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb", "language_code": "ro" } diff --git a/translations/ru/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb b/translations/ru/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb index d5ad161d..05af1fdf 100644 --- a/translations/ru/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb +++ b/translations/ru/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb @@ -12,7 +12,7 @@ "\n", "В этом ноутбуке мы приведем несколько примеров использования OpenCV. Для получения более подробной информации вы можете посетить онлайн-курс [Learn OpenCV](https://learnopencv.com/getting-started-with-opencv/).\n", "\n", - "Сначала давайте `импортируем cv2`, а также некоторые другие полезные библиотеки:\n" + "Сначала давайте `import cv2`, а также некоторые другие полезные библиотеки:\n" ] }, { @@ -135,14 +135,14 @@ "source": [ "bw_im = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)\n", "print(bw_im.shape)\n", - "plt.imshow(bw_im)" + "plt.imshow(bw_im, cmap='gray')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Обработка изображений Брайля\n", + "## Обработка изображений шрифта Брайля\n", "\n", "Если мы хотим применить классификацию изображений для распознавания текста, нам нужно вырезать отдельные символы, чтобы они были похожи на изображения MNIST, которые мы видели ранее. Это можно сделать с помощью техники [обнаружения объектов](../11-ObjectDetection/README.md), о которой мы поговорим позже, но также можно попробовать использовать чисто методы компьютерного зрения. Хорошее описание того, как компьютерное зрение может быть использовано для разделения символов, можно найти [в этом блоге](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) - мы сосредоточимся только на некоторых техниках компьютерного зрения здесь.\n", "\n", @@ -252,7 +252,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Чтобы разделить отдельные символы, нам нужно знать ограничивающую рамку всего текста. Чтобы узнать её, мы можем просто вычислить минимальные и максимальные координаты:\n" + "Чтобы разделить отдельные символы, нам нужно знать ограничивающую рамку всего текста. Чтобы определить её, мы можем просто вычислить минимальные и максимальные координаты:\n" ] }, { @@ -293,7 +293,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Кроме того, этот текст может быть частично повернут, и для его идеального выравнивания нам нужно выполнить так называемое **перспективное преобразование**. Мы возьмем прямоугольник, определенный точками $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ и выровняем его с новым изображением с пропорциональными размерами:\n" + "Также этот текст может быть частично повернут, и для идеального выравнивания нам нужно выполнить так называемое **преобразование перспективы**. Мы возьмем прямоугольник, определенный точками $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ и выровняем его с новым изображением с пропорциональными размерами:\n" ] }, { @@ -443,7 +443,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Поскольку цвет не так важен для обнаружения движения, мы преобразуем все кадры в оттенки серого. Затем мы вычислим разницу между кадрами и построим их нормы, чтобы визуально увидеть количество происходящей активности:\n" + "Поскольку цвет не так важен для обнаружения движения, мы преобразуем все кадры в оттенки серого. Затем мы вычислим разности кадров и построим их нормы, чтобы визуально увидеть уровень активности:\n" ] }, { @@ -488,7 +488,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Предположим, мы хотим создать отчет, который показывает, что происходило перед камерой, отображая подходящее изображение каждый раз, когда что-то происходит. Для этого, вероятно, нужно определить начальный и конечный кадр \"события\" и показать средний кадр. Чтобы убрать некоторый шум, мы также сгладим кривую выше с помощью функции скользящего среднего:\n" + "Предположим, мы хотим создать отчет, который показывает, что происходило перед камерой, отображая подходящее изображение каждый раз, когда что-то происходит. Для этого мы, вероятно, захотим определить начальный и конечный кадры \"события\" и показать средний кадр. Чтобы убрать некоторый шум, мы также сгладим кривую выше с помощью функции скользящего среднего:\n" ] }, { @@ -533,7 +533,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Теперь мы можем найти кадры, в которых количество изменений превышает пороговое значение, используя `np.where`, и извлечь последовательность последовательных кадров, которая длиннее 30 кадров:\n" + "Теперь мы можем найти кадры, в которых количество изменений превышает порог, используя `np.where`, и извлечь последовательность из более чем 30 последовательных кадров:\n" ] }, { @@ -606,7 +606,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Вы можете заметить, что цветовая схема на этом изображении выглядит неправильно! Это потому, что OpenCV по историческим причинам загружает изображения в цветовом пространстве BGR, тогда как matplotlib использует более традиционный порядок цветов RGB. Чаще всего имеет смысл конвертировать изображения в RGB сразу после их загрузки.\n" + "Вы можете заметить, что цветовая схема на этом изображении выглядит неправильно! Это происходит потому, что OpenCV по историческим причинам загружает изображения в цветовом пространстве BGR, тогда как matplotlib использует более традиционный порядок цветов RGB. В большинстве случаев имеет смысл конвертировать изображения в RGB сразу после их загрузки.\n" ] }, { @@ -647,7 +647,7 @@ "source": [ "## Извлечение движения с помощью оптического потока\n", "\n", - "Простое сравнение двух последовательных кадров позволяет увидеть количество изменений, но не дает информации о том, что именно движется и где. Чтобы получить эту информацию, существует техника, называемая **[оптический поток](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)**:\n", + "Простое сравнение двух последовательных кадров позволяет увидеть количество изменений, но не дает информации о том, что именно движется и где. Для получения этой информации существует техника, называемая **[оптический поток](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)**:\n", "\n", "* **Плотный оптический поток** вычисляет векторное поле, которое показывает, куда движется каждый пиксель.\n", "* **Разреженный оптический поток** основывается на выделении некоторых характерных особенностей изображения (например, краев) и построении их траектории от кадра к кадру.\n", @@ -683,9 +683,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Как видно, для каждого кадра поток имеет размерность кадра и 2 канала, соответствующие компонентам x и y вектора оптического потока.\n", + "Как вы можете видеть, для каждого кадра поток имеет размерность кадра и 2 канала, соответствующие x и y компонентам вектора оптического потока.\n", "\n", - "Отображение оптического потока в 2D представляет собой некоторую сложность, но можно использовать одну хитрую идею. Если преобразовать оптический поток в полярные координаты, то для каждого пикселя мы получим два компонента: *направление* и *интенсивность*. Интенсивность можно представить через яркость пикселя, а направление — через различные цвета. Мы создадим изображение в [цветовом пространстве HSV (оттенок-насыщенность-яркость)](https://en.wikipedia.org/wiki/HSV_color_space), где оттенок будет определяться направлением, яркость — интенсивностью, а насыщенность будет равна 255.\n" + "Отображение оптического потока в 2D представляет собой некоторую сложность, но здесь можно использовать одну интересную идею. Если преобразовать оптический поток в полярные координаты, то для каждого пикселя мы получим две составляющие: *направление* и *интенсивность*. Интенсивность можно представить через яркость пикселя, а направление — через различные цвета. Мы создадим изображение в [цветовой модели HSV (оттенок-насыщенность-яркость)](https://en.wikipedia.org/wiki/HSV_color_space), где оттенок будет определяться направлением, яркость — интенсивностью, а насыщенность будет равна 255.\n" ] }, { @@ -736,14 +736,14 @@ "source": [ "Итак, в этих кадрах зеленоватый цвет соответствует движению влево, а синий - движению вправо.\n", "\n", - "Оптический поток может быть отличным инструментом для вывода общих направлений движения. Например, если вы видите, что все пиксели в кадре движутся более или менее в одном направлении, вы можете сделать вывод о движении камеры и попытаться компенсировать это.\n" + "Оптический поток может быть отличным инструментом для анализа общего направления движения. Например, если вы видите, что все пиксели в кадре движутся более-менее в одном направлении, можно сделать вывод о движении камеры и попытаться компенсировать это.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**Отказ от ответственности**: \nЭтот документ был переведен с использованием сервиса автоматического перевода [Co-op Translator](https://github.com/Azure/co-op-translator). Несмотря на наши усилия обеспечить точность, автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется профессиональный перевод человеком. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникающие в результате использования данного перевода.\n" + "\n---\n\n**Отказ от ответственности**: \nЭтот документ был переведен с помощью сервиса автоматического перевода [Co-op Translator](https://github.com/Azure/co-op-translator). Хотя мы стремимся к точности, пожалуйста, имейте в виду, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его исходном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется профессиональный перевод человеком. Мы не несем ответственности за любые недоразумения или неправильные толкования, возникшие в результате использования данного перевода.\n" ] } ], @@ -770,8 +770,8 @@ }, "orig_nbformat": 4, "coopTranslator": { - "original_hash": "ad5bdca62175c7a3d4336ef8c761aef3", - "translation_date": "2025-08-28T11:08:56+00:00", + "original_hash": "339b2129f86b24024393ff92b8bd376f", + "translation_date": "2025-09-07T14:51:39+00:00", "source_file": "lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb", "language_code": "ru" } diff --git a/translations/sk/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb b/translations/sk/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb index 0053d0ae..cbdcd645 100644 --- a/translations/sk/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb +++ b/translations/sk/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb @@ -6,11 +6,11 @@ "source": [ "# Počítačové videnie a OpenCV\n", "\n", - "Tento notebook je súčasťou [učebných osnov AI pre začiatočníkov](http://aka.ms/ai-beginners).\n", + "Tento notebook je súčasťou [AI for Beginners Curriculum](http://aka.ms/ai-beginners).\n", "\n", - "[OpenCV](https://opencv.org/) je považovaný za *de facto* štandard pre spracovanie obrazu. Obsahuje množstvo užitočných algoritmov, implementovaných v C++. OpenCV môžete používať aj z Pythonu.\n", + "[OpenCV](https://opencv.org/) je považovaný za *de facto* štandard pre spracovanie obrázkov. Obsahuje množstvo užitočných algoritmov, implementovaných v C++. OpenCV môžete používať aj z Pythonu.\n", "\n", - "V tomto notebooku vám ukážeme niekoľko príkladov použitia OpenCV. Pre viac podrobností môžete navštíviť online kurz [Learn OpenCV](https://learnopencv.com/getting-started-with-opencv/).\n", + "V tomto notebooku vám ukážeme niekoľko príkladov použitia OpenCV. Pre viac informácií môžete navštíviť online kurz [Learn OpenCV](https://learnopencv.com/getting-started-with-opencv/).\n", "\n", "Najskôr si `importujeme cv2`, ako aj niektoré ďalšie užitočné knižnice:\n" ] @@ -42,9 +42,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Načítavanie obrázkov\n", + "## Načítanie obrázkov\n", "\n", - "Obrázky v Pythone môžu byť pohodlne reprezentované pomocou polí NumPy. Napríklad, čiernobiely obrázok s rozmermi 320x200 pixelov by bol uložený v poli s rozmermi 200x320, a farebný obrázok s rovnakými rozmermi by mal tvar 200x320x3 (pre 3 farebné kanály).\n", + "Obrázky v Pythone môžu byť pohodlne reprezentované pomocou polí NumPy. Napríklad, čiernobiely obrázok s rozmermi 320x200 pixelov by bol uložený v poli 200x320, a farebný obrázok s rovnakými rozmermi by mal tvar 200x320x3 (pre 3 farebné kanály).\n", "\n", "Začnime načítaním obrázka:\n" ] @@ -94,7 +94,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Ako môžete vidieť, ide o obrázok textu v Braillovom písme. Keďže nás skutočná farba príliš nezaujíma, môžeme ho previesť na čiernobiely:\n" + "Ako môžete vidieť, ide o obrázok textu v Braillovom písme. Keďže nás skutočná farba veľmi nezaujíma, môžeme ho previesť na čiernobiely:\n" ] }, { @@ -135,7 +135,7 @@ "source": [ "bw_im = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)\n", "print(bw_im.shape)\n", - "plt.imshow(bw_im)" + "plt.imshow(bw_im, cmap='gray')" ] }, { @@ -144,9 +144,9 @@ "source": [ "## Spracovanie Braillových obrázkov\n", "\n", - "Ak chceme použiť klasifikáciu obrázkov na rozpoznanie textu, musíme vyrezať jednotlivé symboly, aby boli podobné obrázkom MNIST, ktoré sme videli predtým. To sa dá dosiahnuť pomocou techniky [detekcie objektov](../11-ObjectDetection/README.md), ktorú si neskôr preberieme, ale môžeme sa pokúsiť použiť aj čisté počítačové videnie. Dobrý popis toho, ako sa dá počítačové videnie použiť na oddelenie znakov, nájdete [v tomto blogovom príspevku](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) - my sa tu zameriame len na niektoré techniky počítačového videnia.\n", + "Ak chceme použiť klasifikáciu obrázkov na rozpoznávanie textu, musíme vyrezať jednotlivé symboly, aby boli podobné obrázkom MNIST, ktoré sme už videli. To sa dá dosiahnuť pomocou techniky [detekcie objektov](../11-ObjectDetection/README.md), o ktorej budeme hovoriť neskôr, ale môžeme sa tiež pokúsiť použiť na tento účel čisté počítačové videnie. Dobrý popis toho, ako možno počítačové videnie použiť na oddelenie znakov, nájdete [v tomto blogovom príspevku](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) - my sa tu zameriame iba na niektoré techniky počítačového videnia.\n", "\n", - "Najskôr sa pokúsme obrázok trochu vylepšiť. Môžeme použiť metódu **prahovania** (dobre popísanú [v tomto článku o OpenCV](https://docs.opencv.org/4.x/d7/d4d/tutorial_py_thresholding.html)):\n" + "Najprv sa pokúsme obrázok trochu vylepšiť. Môžeme použiť myšlienku **prahovania** (dobre popísanú [v tomto článku o OpenCV](https://docs.opencv.org/4.x/d7/d4d/tutorial_py_thresholding.html)):\n" ] }, { @@ -192,7 +192,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Aby sme mohli pracovať s obrázkami, musíme „extrahovať“ jednotlivé body, t.j. previesť obrázky na súbor súradníc jednotlivých bodov. Môžeme to urobiť pomocou techník **extrakcie vlastností**, ako sú SIFT, SURF alebo [ORB](https://docs.opencv.org/4.x/d1/d89/tutorial_py_orb.html):\n" + "Na prácu s obrázkami potrebujeme „extrahovať“ jednotlivé body, t. j. previesť obrázky na súbor súradníc jednotlivých bodov. Môžeme to urobiť pomocou techník **extrakcie príznakov**, ako sú SIFT, SURF alebo [ORB](https://docs.opencv.org/4.x/d1/d89/tutorial_py_orb.html):\n" ] }, { @@ -293,7 +293,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Tento text môže byť čiastočne otočený, a aby bol dokonale zarovnaný, musíme vykonať tzv. **perspektívnu transformáciu**. Vezmeme obdĺžnik definovaný bodmi $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ a zarovnáme ho s novým obrazom s proporčnými rozmermi:\n" + "Tento text môže byť čiastočne otočený a na jeho dokonalé zarovnanie musíme vykonať takzvanú **perspektívnu transformáciu**. Vezmeme obdĺžnik definovaný bodmi $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ a zarovnáme ho s novým obrázkom s proporcionálnymi rozmermi:\n" ] }, { @@ -340,7 +340,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Potom, čo získame tento dobre zarovnaný obrázok, malo by byť relatívne jednoduché rozrezať ho na kúsky:\n" + "Po získaní tejto dobre zarovnanej snímky by malo byť relatívne jednoduché rozdeliť ju na časti:\n" ] }, { @@ -391,9 +391,9 @@ "source": [ "## Detekcia pohybu pomocou rozdielu snímok\n", "\n", - "Detekcia pohybu vo videozázname je veľmi častá úloha. Napríklad nám umožňuje dostať upozornenia, keď sa niečo deje na bezpečnostnej kamere. Ak chceme pochopiť, čo sa na kamere deje, môžeme použiť neurónovú sieť – ale je oveľa lacnejšie použiť neurónovú sieť, keď vieme, že sa niečo deje.\n", + "Detekcia pohybu vo video prúde je veľmi častou úlohou. Napríklad nám umožňuje dostať upozornenia, keď sa niečo deje na bezpečnostnej kamere. Ak chceme pochopiť, čo sa na kamere deje, môžeme použiť neurónovú sieť – ale je oveľa lacnejšie použiť neurónovú sieť, keď vieme, že sa niečo deje.\n", "\n", - "Hlavná myšlienka detekcie pohybu je jednoduchá. Ak je kamera pevná, snímky z kamery by mali byť dosť podobné. Keďže snímky sú reprezentované ako polia, jednoduchým odčítaním týchto polí pre dve po sebe idúce snímky získame rozdiel pixelov, ktorý by mal byť nízky pre statické snímky a zvýši sa, keď sa na obraze objaví výrazný pohyb.\n", + "Hlavná myšlienka detekcie pohybu je jednoduchá. Ak je kamera pevná, snímky z kamery by mali byť navzájom veľmi podobné. Keďže snímky sú reprezentované ako polia, jednoduchým odčítaním týchto polí pre dva po sebe idúce snímky získame rozdiel pixelov, ktorý by mal byť nízky pre statické snímky a stúpnuť, keď sa na obraze objaví výrazný pohyb.\n", "\n", "Začneme tým, že sa naučíme, ako otvoriť video a previesť ho na sekvenciu snímok:\n" ] @@ -443,7 +443,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Keďže farba nie je taká dôležitá pre detekciu pohybu, všetky snímky prevedieme na odtiene sivej. Potom vypočítame rozdiely medzi snímkami a vykreslíme ich normy, aby sme vizuálne videli množstvo aktivity:\n" + "Keďže farba nie je taká dôležitá pre detekciu pohybu, všetky snímky prevedieme na odtiene sivej. Potom vypočítame rozdiely medzi snímkami a vykreslíme ich normy, aby sme vizuálne videli množstvo prebiehajúcej aktivity:\n" ] }, { @@ -488,7 +488,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Predpokladajme, že chceme vytvoriť správu, ktorá ukazuje, čo sa stalo pred kamerou, zobrazením vhodného obrázka vždy, keď sa niečo stane. Na to pravdepodobne chceme zistiť začiatočný a koncový snímok \"udalosti\" a zobraziť stredný snímok. Na odstránenie niektorých šumov tiež vyhladíme krivku vyššie pomocou funkcie pohyblivého priemeru:\n" + "Predpokladajme, že chceme vytvoriť správu, ktorá ukazuje, čo sa stalo pred kamerou, zobrazením vhodného obrázka vždy, keď sa niečo stane. Na to pravdepodobne chceme zistiť začiatočný a koncový snímok \"udalosti\" a zobraziť stredný snímok. Na odstránenie niektorých šumov tiež vyhladíme krivku vyššie pomocou funkcie kĺzavého priemeru:\n" ] }, { @@ -533,7 +533,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Teraz môžeme nájsť snímky, ktoré majú množstvo zmien nad prahovou hodnotou pomocou `np.where`, a extrahovať sekvenciu po sebe idúcich snímok, ktorá je dlhšia ako 30 snímok:\n" + "Teraz môžeme nájsť snímky, ktoré majú množstvo zmien nad prahovou hodnotou, pomocou `np.where`, a extrahovať sekvenciu po sebe idúcich snímok, ktorá je dlhšia ako 30 snímok:\n" ] }, { @@ -647,10 +647,10 @@ "source": [ "## Extrahovanie pohybu pomocou optického toku\n", "\n", - "Porovnávanie dvoch po sebe nasledujúcich snímok nám síce umožňuje vidieť množstvo zmien, ale neposkytuje informácie o tom, čo sa vlastne pohybuje a kde. Na získanie týchto informácií existuje technika nazývaná **[optický tok](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)**:\n", + "Porovnávanie dvoch po sebe nasledujúcich snímok nám síce umožňuje vidieť množstvo zmien, ale neposkytuje informácie o tom, čo sa skutočne pohybuje a kde. Na získanie týchto informácií existuje technika nazývaná **[optický tok](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)**:\n", "\n", "* **Hustý optický tok** vypočíta vektorové pole, ktoré ukazuje, kam sa každý pixel pohybuje.\n", - "* **Riedky optický tok** je založený na výbere niektorých charakteristických prvkov v obraze (napr. hrany) a sledovaní ich trajektórie medzi snímkami.\n", + "* **Riedky optický tok** je založený na výbere niektorých výrazných prvkov v obraze (napr. hrany) a sledovaní ich trajektórie zo snímky na snímku.\n", "\n", "Viac o optickom toku si môžete prečítať [v tomto skvelom tutoriáli](https://learnopencv.com/optical-flow-in-opencv/).\n", "\n", @@ -683,9 +683,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Ako vidíte, pre každý rámec má tok rozmery rámca a 2 kanály, ktoré zodpovedajú x a y komponentom vektora optického toku.\n", + "Ako môžete vidieť, pre každý rámec má tok rozmery rámca a 2 kanály, ktoré zodpovedajú x a y zložkám vektora optického toku.\n", "\n", - "Zobrazenie optického toku v 2D je trochu náročné, ale môžeme použiť jeden šikovný nápad. Ak prevedieme optický tok na polárne súradnice, získame pre každý pixel dve zložky: *smer* a *intenzitu*. Intenzitu môžeme reprezentovať intenzitou pixelu a smer rôznymi farbami. Vytvoríme obraz v [farebnom priestore HSV (Hue-Saturation-Value)](https://en.wikipedia.org/wiki/HSV_color_space), kde odtieň bude definovaný smerom, hodnota intenzitou a saturácia bude 255.\n" + "Zobrazenie optického toku v 2D je trochu náročné, ale môžeme použiť jeden šikovný nápad. Ak prevedieme optický tok na polárne súradnice, získame pre každý pixel dve zložky: *smer* a *intenzitu*. Intenzitu môžeme reprezentovať intenzitou pixelu a smer rôznymi farbami. Vytvoríme obrázok vo [farebnom priestore HSV (Hue-Saturation-Value)](https://en.wikipedia.org/wiki/HSV_color_space), kde odtieň (hue) bude definovaný smerom, hodnota (value) intenzitou a sýtosť (saturation) bude 255.\n" ] }, { @@ -736,14 +736,14 @@ "source": [ "Takže v týchto snímkach zelenkastá farba zodpovedá pohybu doľava, zatiaľ čo modrá - pohybu doprava.\n", "\n", - "Optický tok môže byť skvelým nástrojom na vyvodenie záverov o všeobecnom smere pohybu. Napríklad, ak vidíte, že všetky pixely v snímke sa pohybujú viac-menej jedným smerom, môžete usúdiť, že dochádza k pohybu kamery, a pokúsiť sa to kompenzovať.\n" + "Optický tok môže byť skvelým nástrojom na vyvodenie záverov o všeobecnom smere pohybu. Napríklad, ak vidíte, že všetky pixely v snímke sa pohybujú viac-menej jedným smerom - môžete usúdiť, že ide o pohyb kamery, a pokúsiť sa to kompenzovať.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**Upozornenie**: \nTento dokument bol preložený pomocou služby AI prekladu [Co-op Translator](https://github.com/Azure/co-op-translator). Hoci sa snažíme o presnosť, prosím, berte na vedomie, že automatizované preklady môžu obsahovať chyby alebo nepresnosti. Pôvodný dokument v jeho rodnom jazyku by mal byť považovaný za autoritatívny zdroj. Pre kritické informácie sa odporúča profesionálny ľudský preklad. Nie sme zodpovední za akékoľvek nedorozumenia alebo nesprávne interpretácie vyplývajúce z použitia tohto prekladu.\n" + "\n---\n\n**Upozornenie**: \nTento dokument bol preložený pomocou služby na automatický preklad [Co-op Translator](https://github.com/Azure/co-op-translator). Aj keď sa snažíme o presnosť, upozorňujeme, že automatické preklady môžu obsahovať chyby alebo nepresnosti. Pôvodný dokument v jeho pôvodnom jazyku by mal byť považovaný za autoritatívny zdroj. Pre dôležité informácie sa odporúča profesionálny ľudský preklad. Nezodpovedáme za akékoľvek nedorozumenia alebo nesprávne interpretácie vyplývajúce z použitia tohto prekladu.\n" ] } ], @@ -770,8 +770,8 @@ }, "orig_nbformat": 4, "coopTranslator": { - "original_hash": "ad5bdca62175c7a3d4336ef8c761aef3", - "translation_date": "2025-08-29T23:31:07+00:00", + "original_hash": "339b2129f86b24024393ff92b8bd376f", + "translation_date": "2025-09-07T15:17:37+00:00", "source_file": "lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb", "language_code": "sk" } diff --git a/translations/sl/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb b/translations/sl/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb index 4d8a72a7..c3418c37 100644 --- a/translations/sl/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb +++ b/translations/sl/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb @@ -12,7 +12,7 @@ "\n", "V tem zvezku vam bomo predstavili nekaj primerov uporabe OpenCV. Za več podrobnosti lahko obiščete spletni tečaj [Learn OpenCV](https://learnopencv.com/getting-started-with-opencv/).\n", "\n", - "Najprej `uvozimo cv2`, kot tudi nekatere druge uporabne knjižnice:\n" + "Najprej uvozimo `cv2` ter nekaj drugih uporabnih knjižnic:\n" ] }, { @@ -44,7 +44,7 @@ "source": [ "## Nalaganje slik\n", "\n", - "Slike v Pythonu lahko priročno predstavimo z NumPy polji. Na primer, črno-bela slika velikosti 320x200 pik bi bila shranjena v polju velikosti 200x320, barvna slika enakih dimenzij pa bi imela obliko 200x320x3 (za 3 barvne kanale).\n", + "Slike v Pythonu lahko enostavno predstavimo z NumPy polji. Na primer, sivinska slika velikosti 320x200 pik bi bila shranjena v polju velikosti 200x320, medtem ko bi barvna slika enakih dimenzij imela obliko 200x320x3 (za 3 barvne kanale).\n", "\n", "Začnimo z nalaganjem slike:\n" ] @@ -135,7 +135,7 @@ "source": [ "bw_im = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)\n", "print(bw_im.shape)\n", - "plt.imshow(bw_im)" + "plt.imshow(bw_im, cmap='gray')" ] }, { @@ -252,7 +252,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Za ločevanje posameznih znakov moramo poznati obrobo celotnega besedila. Da jo ugotovimo, lahko preprosto izračunamo minimalne in maksimalne koordinate:\n" + "Da ločimo posamezne znake, moramo poznati obrobo celotnega besedila. Da jo ugotovimo, lahko preprosto izračunamo minimalne in maksimalne koordinate:\n" ] }, { @@ -293,7 +293,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Besedilo je lahko delno zasukano, zato moramo za popolno poravnavo izvesti tako imenovano **perspektivno transformacijo**. Vzeli bomo pravokotnik, določen s točkami $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ in ga poravnali z novo sliko s proporcionalnimi dimenzijami:\n" + "Prav tako je ta besedilo lahko delno zasukano, in da bi ga popolnoma poravnali, moramo izvesti tako imenovano **perspektivno transformacijo**. Vzeli bomo pravokotnik, določen s točkami $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ in ga poravnali z novo sliko s proporcionalnimi dimenzijami:\n" ] }, { @@ -384,7 +384,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Videli ste, da je mogoče precej nalog opraviti z uporabo čiste obdelave slik, brez umetne inteligence. Če lahko uporabimo tehnike računalniškega vida za poenostavitev dela nevronske mreže, bi to vsekakor morali storiti, saj nam bo to omogočilo reševanje težav z manjšim številom učnih podatkov.\n" + "Videli ste, da je mogoče precej nalog opraviti z uporabo čiste obdelave slik, brez umetne inteligence. Če lahko uporabimo tehnike računalniškega vida, da poenostavimo delo nevronske mreže - to vsekakor storimo, saj nam bo to omogočilo reševanje težav z manjšim številom učnih podatkov.\n" ] }, { @@ -393,9 +393,9 @@ "source": [ "## Zaznavanje gibanja z razliko med okvirji\n", "\n", - "Zaznavanje gibanja na video posnetku je zelo pogosta naloga. Na primer, omogoča nam, da prejmemo opozorila, ko se kaj zgodi na nadzorni kameri. Če želimo razumeti, kaj se dogaja na kameri, lahko uporabimo nevronsko mrežo – vendar je uporaba nevronske mreže veliko cenejša, ko že vemo, da se nekaj dogaja.\n", + "Zaznavanje gibanja na video posnetku je zelo pogosta naloga. Na primer, omogoča nam, da prejmemo opozorila, ko se nekaj zgodi na nadzorni kameri. Če želimo razumeti, kaj se dogaja na kameri, lahko uporabimo nevronsko mrežo – vendar je uporaba nevronske mreže veliko cenejša, ko že vemo, da se nekaj dogaja.\n", "\n", - "Glavna ideja zaznavanja gibanja je preprosta. Če je kamera nepremična, bi morali biti okvirji iz kamere precej podobni drug drugemu. Ker so okvirji predstavljeni kot matrike, lahko z odštevanjem teh matrik za dva zaporedna okvirja dobimo razliko med piksli, ki bi morala biti nizka za statične okvirje, in postati višja, ko je v sliki prisotno znatno gibanje.\n", + "Glavna ideja zaznavanja gibanja je preprosta. Če je kamera fiksna, bi morali biti okvirji iz kamere precej podobni drug drugemu. Ker so okvirji predstavljeni kot matrike, lahko z odštevanjem teh matrik za dva zaporedna okvirja dobimo razliko med piksli, ki bi morala biti nizka za statične okvirje, in postati višja, ko je v sliki prisotno znatno gibanje.\n", "\n", "Začeli bomo z učenjem, kako odpreti video in ga pretvoriti v zaporedje okvirjev:\n" ] @@ -445,7 +445,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Ker barva ni tako pomembna za zaznavanje gibanja, bomo vse okvirje pretvorili v odtenke sive. Nato bomo izračunali razlike med okvirji in narisali njihove norme, da vizualno vidimo količino aktivnosti:\n" + "Ker barva ni tako pomembna za zaznavanje gibanja, bomo vse okvirje pretvorili v odtenke sive. Nato bomo izračunali razlike med okvirji in narisali njihove norme, da bomo vizualno videli količino aktivnosti:\n" ] }, { @@ -535,7 +535,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Zdaj lahko s pomočjo `np.where` poiščemo okvirje, ki imajo količino sprememb nad pragom, in izločimo zaporedje zaporednih okvirjev, daljše od 30 okvirjev:\n" + "Zdaj lahko z uporabo `np.where` poiščemo okvirje, ki imajo količino sprememb nad pragom, in izvlečemo zaporedje zaporednih okvirjev, ki je daljše od 30 okvirjev:\n" ] }, { @@ -651,12 +651,12 @@ "source": [ "## Izvleček gibanja z optičnim tokom\n", "\n", - "Čeprav primerjava dveh zaporednih sličic omogoča vpogled v količino sprememb, ne poda informacij o tem, kaj se dejansko premika in kje. Za pridobitev teh informacij obstaja tehnika, imenovana **[optični tok](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)**:\n", + "Čeprav primerjava dveh zaporednih sličic omogoča opazovanje količine sprememb, ne poda informacij o tem, kaj se dejansko premika in kje. Za pridobitev teh informacij obstaja tehnika, imenovana **[optični tok](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)**:\n", "\n", "* **Gost optični tok** izračuna vektorsko polje, ki za vsak piksel pokaže, kam se premika.\n", - "* **Redek optični tok** temelji na izbiri nekaterih značilnih lastnosti slike (npr. robov) in sledenju njihove poti iz sličice v sličico.\n", + "* **Redek optični tok** temelji na izbiri nekaterih značilnih lastnosti slike (npr. robovi) in sledenju njihove poti od sličice do sličice.\n", "\n", - "Več o optičnem toku si lahko preberete [v tem odličnem vodiču](https://learnopencv.com/optical-flow-in-opencv/).\n", + "Več o optičnem toku si preberite [v tem odličnem vodiču](https://learnopencv.com/optical-flow-in-opencv/).\n", "\n", "Izračunajmo gost optični tok med našimi sličicami:\n" ] @@ -687,9 +687,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Kot lahko vidite, ima tok za vsak okvir dimenzijo okvira in 2 kanala, ki ustrezata x in y komponentama vektorja optičnega toka.\n", + "Kot lahko vidite, ima tok za vsak okvir dimenzijo okvirja in 2 kanala, ki ustrezata x in y komponentama vektorja optičnega toka.\n", "\n", - "Prikazovanje optičnega toka v 2D je nekoliko zahtevno, vendar lahko uporabimo eno pametno idejo. Če optični tok pretvorimo v polarne koordinate, dobimo dve komponenti za vsak piksel: *smer* in *intenziteto*. Intenziteto lahko predstavimo z intenziteto piksla, smer pa z različnimi barvami. Ustvarili bomo sliko v [HSV (Hue-Saturation-Value) barvnem prostoru](https://en.wikipedia.org/wiki/HSV_color_space), kjer bo odtenek (hue) določen s smerjo, vrednost (value) z intenziteto, nasičenost (saturation) pa bo 255.\n" + "Prikazovanje optičnega toka v 2D je nekoliko zahtevno, vendar lahko uporabimo eno pametno idejo. Če optični tok pretvorimo v polarne koordinate, dobimo dve komponenti za vsak piksel: *smer* in *intenzivnost*. Intenzivnost lahko predstavimo z intenzivnostjo piksla, smer pa z različnimi barvami. Ustvarili bomo sliko v [HSV (barvno nasičenost-vrednost) barvnem prostoru](https://en.wikipedia.org/wiki/HSV_color_space), kjer bo barvni odtenek določen s smerjo, vrednost z intenzivnostjo, nasičenost pa bo 255.\n" ] }, { @@ -738,16 +738,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Torej, v teh okvirjih zelena barva ustreza gibanju v levo, medtem ko modra - gibanju v desno.\n", + "Torej, v teh okvirjih zelena barva ustreza premikanju v levo, medtem ko modra - premikanju v desno.\n", "\n", - "Optični tok je lahko odlično orodje za sklepanje o splošni smeri gibanja. Na primer, če opazite, da se vsi piksli v okvirju premikajo bolj ali manj v eno smer, lahko sklepate, da gre za gibanje kamere, in poskusite to kompenzirati.\n" + "Optični tok je lahko odlično orodje za sklepanje o splošni smeri gibanja. Na primer, če opazite, da se vsi piksli v okvirju premikajo bolj ali manj v eno smer - lahko sklepate, da gre za premikanje kamere, in poskusite to kompenzirati.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**Omejitev odgovornosti**: \nTa dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazuma ali napačne razlage, ki bi izhajale iz uporabe tega prevoda.\n" + "\n---\n\n**Omejitev odgovornosti**: \nTa dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda.\n" ] } ], @@ -774,8 +774,8 @@ }, "orig_nbformat": 4, "coopTranslator": { - "original_hash": "ad5bdca62175c7a3d4336ef8c761aef3", - "translation_date": "2025-08-30T07:29:01+00:00", + "original_hash": "339b2129f86b24024393ff92b8bd376f", + "translation_date": "2025-09-07T15:21:32+00:00", "source_file": "lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb", "language_code": "sl" } diff --git a/translations/sr/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb b/translations/sr/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb index aa564092..37c8ea0f 100644 --- a/translations/sr/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb +++ b/translations/sr/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb @@ -6,11 +6,11 @@ "source": [ "# Компјутерски вид и OpenCV\n", "\n", - "Овај нотебук је део [AI за почетнике наставног плана](http://aka.ms/ai-beginners).\n", + "Овај нотес је део [AI за почетнике наставног плана](http://aka.ms/ai-beginners).\n", "\n", "[OpenCV](https://opencv.org/) се сматра *де факто* стандардом за обраду слика. Садржи много корисних алгоритама, имплементираних у C++. OpenCV можете користити и из Python-а.\n", "\n", - "У овом нотебуку, даћемо вам неке примере коришћења OpenCV-а. За више детаља, можете посетити онлајн курс [Learn OpenCV](https://learnopencv.com/getting-started-with-opencv/).\n", + "У овом нотесу, даћемо вам неке примере коришћења OpenCV-а. За више детаља, можете посетити [Learn OpenCV](https://learnopencv.com/getting-started-with-opencv/) онлајн курс.\n", "\n", "Прво, хајде да `import cv2`, као и неке друге корисне библиотеке:\n" ] @@ -44,9 +44,9 @@ "source": [ "## Учитавање слика\n", "\n", - "Слике у Пајтону могу се једноставно представити помоћу НумПај низова. На пример, слика у сивим тоновима величине 320x200 пиксела била би сачувана у низу величине 200x320, док би колор слика истих димензија имала облик 200x320x3 (за 3 колор канала).\n", + "Слике у Пајтону могу бити лако представљене помоћу NumPy низова. На пример, слика у сивим тоновима величине 320x200 пиксела би била сачувана у низу величине 200x320, док би колор слика истих димензија имала облик 200x320x3 (за три канала боја).\n", "\n", - "Хајде да почнемо са учитавањем слике:\n" + "Хајде да започнемо учитавањем слике:\n" ] }, { @@ -94,7 +94,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Као што можете видети, то је слика текста на Брајевом писму. Пошто нас стварна боја не занима много, можемо је претворити у црно-бело:\n" + "Као што видите, то је слика текста на Брајевом писму. Пошто нас стварна боја не занима много, можемо је претворити у црно-бело:\n" ] }, { @@ -135,18 +135,18 @@ "source": [ "bw_im = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)\n", "print(bw_im.shape)\n", - "plt.imshow(bw_im)" + "plt.imshow(bw_im, cmap='gray')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Обрада слика Брајевог писма\n", + "## Обрада слика за Брајево писмо\n", "\n", - "Ако желимо да применимо класификацију слика за препознавање текста, потребно је да издвојимо појединачне симболе како би били слични MNIST сликама које смо раније видели. Ово се може урадити помоћу [детекције објеката](../11-ObjectDetection/README.md), о чему ћемо касније разговарати, али можемо покушати да користимо и чисту компјутерску визију за ту сврху. Добар опис како се компјутерска визија може користити за раздвајање карактера може се наћи [у овом блогу](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) - овде ћемо се фокусирати само на неке технике компјутерске визије.\n", + "Ако желимо да применимо класификацију слика како бисмо препознали текст, потребно је да исечемо појединачне симболе како би били слични MNIST сликама које смо раније видели. Ово се може урадити коришћењем технике [детекције објеката](../11-ObjectDetection/README.md), коју ћемо касније разматрати, али такође можемо покушати да користимо чисту рачунарску визију за то. Добар опис како се рачунарска визија може користити за раздвајање карактера можете пронаћи [у овом блогу](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) - овде ћемо се фокусирати само на неке технике рачунарске визије.\n", "\n", - "Прво, хајде да покушамо мало да побољшамо слику. Можемо користити идеју **праговања** (добро описану [у овом OpenCV чланку](https://docs.opencv.org/4.x/d7/d4d/tutorial_py_thresholding.html)):\n" + "Прво, хајде да покушамо мало да побољшамо слику. Можемо користити идеју **праговања** (добро описану [у овом чланку о OpenCV-у](https://docs.opencv.org/4.x/d7/d4d/tutorial_py_thresholding.html)):\n" ] }, { @@ -192,7 +192,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Да бисмо радили са сликама, потребно је да „извучемо“ појединачне тачке, односно да слике претворимо у скуп координата појединачних тачака. То можемо урадити користећи технике **екстракције карактеристика**, као што су SIFT, SURF или [ORB](https://docs.opencv.org/4.x/d1/d89/tutorial_py_orb.html):\n" + "Да бисмо радили са сликама, потребно је „извући“ појединачне тачке, односно претворити слике у скуп координата појединачних тачака. То можемо урадити користећи технике **екстракције карактеристика**, као што су SIFT, SURF или [ORB](https://docs.opencv.org/4.x/d1/d89/tutorial_py_orb.html):\n" ] }, { @@ -252,7 +252,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Да бисмо раздвојили појединачне карактере, потребно је да знамо оквир целог текста. Да бисмо то сазнали, можемо једноставно израчунати минималне и максималне координате:\n" + "Да бисмо раздвојили појединачне карактере, потребно је да знамо гранични оквир целог текста. Да бисмо то сазнали, можемо једноставно израчунати минималне и максималне координате:\n" ] }, { @@ -293,7 +293,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Такође, овај текст може бити делимично ротирани, и да би био савршено поравнат, потребно је урадити такозвану **перспективну трансформацију**. Узећемо правоугаоник дефинисан тачкама $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ и поравнати га са новом сликом пропорционалних димензија:\n" + "Такође, овај текст може бити делимично ротирани, и да бисмо га савршено поравнали потребно је урадити такозвану **перспективну трансформацију**. Узећемо правоугаоник дефинисан тачкама $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ и поравнати га са новом сликом пропорционалних димензија:\n" ] }, { @@ -340,7 +340,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Након што добијемо ову добро поравнату слику, требало би да буде релативно лако исецкати је на делове:\n" + "Након што добијемо ову добро поравнату слику, требало би да буде релативно лако исећи је на делове:\n" ] }, { @@ -384,20 +384,20 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Видели сте да се доста задатака може обавити користећи чисту обраду слике, без икакве вештачке интелигенције. Ако можемо користити технике рачунарског вида да олакшамо рад неуронске мреже - дефинитивно би требало то да урадимо, јер ће нам то омогућити да решавамо проблеме са мањим бројем података за обуку.\n" + "Видели сте да се доста задатака може обавити користећи чисту обраду слике, без икакве вештачке интелигенције. Ако можемо користити технике рачунарског вида да поједноставимо рад неуронске мреже - дефинитивно бисмо то требали урадити, јер ће нам то омогућити да решавамо проблеме са мањим бројем података за обуку.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Детекција покрета коришћењем разлике између кадрова\n", + "## Детекција покрета помоћу разлике између кадрова\n", "\n", - "Детекција покрета на видео стриму је веома чест задатак. На пример, омогућава нам да добијемо обавештења када се нешто деси на надзорној камери. Ако желимо да разумемо шта се дешава на камери, можемо користити неуронску мрежу – али је много јефтиније користити неуронску мрежу када знамо да се нешто дешава.\n", + "Детекција покрета на видео стриму је веома честа задатак. На пример, омогућава нам да добијемо обавештења када се нешто догоди на надзорној камери. Ако желимо да разумемо шта се дешава на камери, можемо користити неуронску мрежу - али је много јефтиније користити неуронску мрежу када знамо да се нешто дешава.\n", "\n", - "Главна идеја детекције покрета је једноставна. Ако је камера фиксирана, онда би кадрови са камере требало да буду прилично слични један другом. Пошто су кадрови представљени као низови, једноставним одузимањем тих низова за два узастопна кадра добићемо разлику у пикселима, која би требало да буде мала за статичне кадрове, а да постане већа када постоји значајно кретање на слици.\n", + "Главна идеја детекције покрета је једноставна. Ако је камера фиксна, онда би кадрови са камере требало да буду прилично слични један другом. Пошто су кадрови представљени као низови, једноставним одузимањем тих низова за два узастопна кадра добијамо разлику пиксела, која би требало да буде мала за статичне кадрове, а да постане већа када постоји значајан покрет на слици.\n", "\n", - "Почећемо тако што ћемо научити како да отворимо видео и претворимо га у секвенцу кадрова:\n" + "Почећемо тако што ћемо научити како да отворимо видео и претворимо га у низ кадрова:\n" ] }, { @@ -445,7 +445,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Пошто боја није толико важна за детекцију кретања, конвертоваћемо све кадрове у сиве тонове. Затим ћемо израчунати разлике између кадрова и приказати њихове норме како бисмо визуелно видели количину активности која се дешава:\n" + "Пошто боја није толико важна за детекцију кретања, све кадрове ћемо претворити у нијансе сиве. Затим ћемо израчунати разлике између кадрова и нацртати њихове норме како бисмо визуелно видели количину активности која се дешава:\n" ] }, { @@ -490,7 +490,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Претпоставимо да желимо да направимо извештај који показује шта се догодило испред камере приказујући одговарајућу слику сваки пут када се нешто догоди. Да бисмо то урадили, вероватно желимо да пронађемо почетни и завршни кадар „догађаја“ и прикажемо средњи кадар. Да бисмо уклонили мало шума, такође ћемо изгладити криву изнад функцијом покретног просека:\n" + "Претпоставимо да желимо да направимо извештај који приказује шта се догодило испред камере тако што ће сваки пут када се нешто деси приказати одговарајућу слику. Да бисмо то урадили, вероватно желимо да пронађемо почетни и завршни кадар \"догађаја\" и прикажемо средњи кадар. Да бисмо уклонили неку буку, такође ћемо изравнати криву изнад помоћу функције покретног просека:\n" ] }, { @@ -610,7 +610,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Можете приметити да шема боја на овој слици не изгледа исправно! То је зато што OpenCV из историјских разлога учитава слике у BGR колор простору, док matplotlib користи традиционалнији RGB редослед боја. У већини случајева, има смисла конвертовати слике у RGB одмах након учитавања.\n" + "Можда ћете приметити да шема боја на овој слици не изгледа исправно! То је зато што OpenCV из историјских разлога учитава слике у BGR колор простору, док matplotlib користи традиционалнији редослед боја RGB. У већини случајева, има смисла конвертовати слике у RGB одмах након учитавања.\n" ] }, { @@ -653,8 +653,8 @@ "\n", "Иако само поређење два узастопна кадра омогућава да видимо количину промена, оно не пружа информације о томе шта се заправо креће и где. Да бисмо добили те информације, постоји техника која се зове **[оптички ток](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)**:\n", "\n", - "* **Густи оптички ток** израчунава векторско поље које показује за сваки пиксел где се креће.\n", - "* **Ретки оптички ток** заснива се на узимању неких карактеристичних елемената у слици (нпр. ивица) и праћењу њихове путање од кадра до кадра.\n", + "* **Густи оптички ток** израчунава векторско поље које показује за сваки пиксел где се креће\n", + "* **Ретки оптички ток** заснива се на узимању неких карактеристичних елемената у слици (нпр. ивица) и праћењу њихове путање из кадра у кадар.\n", "\n", "Прочитајте више о оптичком току [у овом одличном туторијалу](https://learnopencv.com/optical-flow-in-opencv/).\n", "\n", @@ -687,9 +687,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Као што можете видети, за сваки кадар ток има димензије кадра и 2 канала, који одговарају x и y компонентама вектора оптичког тока.\n", + "Као што можете видети, за сваки кадар проток има димензије кадра и 2 канала, који одговарају x и y компонентама вектора оптичког протока.\n", "\n", - "Приказивање оптичког тока у 2Д је помало изазовно, али можемо искористити једну паметну идеју. Ако конвертујемо оптички ток у поларне координате, добићемо две компоненте за сваки пиксел: *правац* и *интензитет*. Интензитет можемо представити интензитетом пиксела, а правац различитим бојама. Направићемо слику у [HSV (Hue-Saturation-Value) колор простору](https://en.wikipedia.org/wiki/HSV_color_space), где ће нијанса (hue) бити дефинисана правцем, вредност (value) - интензитетом, а засићеност (saturation) ће бити 255.\n" + "Приказивање оптичког протока у 2D је мало изазовно, али можемо искористити једну паметну идеју. Ако конвертујемо оптички проток у поларне координате, добићемо две компоненте за сваки пиксел: *правац* и *интензитет*. Интензитет можемо представити интензитетом пиксела, а правац различитим бојама. Направићемо слику у [HSV (Hue-Saturation-Value) колор простору](https://en.wikipedia.org/wiki/HSV_color_space), где ће нијанса бити дефинисана правцем, вредност - интензитетом, а засићеност ће бити 255.\n" ] }, { @@ -738,16 +738,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Дакле, у тим кадровима зеленкаста боја означава кретање улево, док плава - кретање удесно.\n", + "Дакле, у тим кадровима зеленкаста боја одговара кретању улево, док плава означава кретање удесно.\n", "\n", - "Оптички ток може бити одличан алат за доношење закључака о општем правцу кретања. На пример, ако видите да се сви пиксели у кадру крећу мање-више у једном правцу - можете закључити да постоји кретање камере и покушати да то компензујете.\n" + "Оптички ток може бити одличан алат за доношење закључака о општем правцу кретања. На пример, ако видите да се сви пиксели у кадру крећу мање-више у једном правцу, можете закључити да постоји кретање камере и покушати да то компензујете.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**Одрицање од одговорности**: \nОвај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако се трудимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на његовом изворном језику треба сматрати меродавним извором. За критичне информације препоручује се професионални превод од стране људи. Не преузимамо одговорност за било каква погрешна тумачења или неспоразуме који могу настати услед коришћења овог превода.\n" + "\n---\n\n**Одрицање од одговорности**: \nОвај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако тежимо тачности, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква неспоразумевања или погрешна тумачења која могу произаћи из коришћења овог превода.\n" ] } ], @@ -774,8 +774,8 @@ }, "orig_nbformat": 4, "coopTranslator": { - "original_hash": "ad5bdca62175c7a3d4336ef8c761aef3", - "translation_date": "2025-08-29T23:33:31+00:00", + "original_hash": "339b2129f86b24024393ff92b8bd376f", + "translation_date": "2025-09-07T15:20:02+00:00", "source_file": "lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb", "language_code": "sr" } diff --git a/translations/sv/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb b/translations/sv/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb index 0dc2a0c8..06554ae0 100644 --- a/translations/sv/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb +++ b/translations/sv/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb @@ -6,11 +6,11 @@ "source": [ "# Datorseende och OpenCV\n", "\n", - "Den här anteckningsboken är en del av [AI för nybörjare-kursen](http://aka.ms/ai-beginners).\n", + "Den här anteckningsboken är en del av [AI for Beginners Curriculum](http://aka.ms/ai-beginners).\n", "\n", - "[OpenCV](https://opencv.org/) anses vara *de facto*-standarden för bildbehandling. Den innehåller många användbara algoritmer, implementerade i C++. Du kan även använda OpenCV med Python.\n", + "[OpenCV](https://opencv.org/) anses vara *de facto* standarden för bildbehandling. Den innehåller många användbara algoritmer, implementerade i C++. Du kan även använda OpenCV från Python.\n", "\n", - "I den här anteckningsboken kommer vi att ge dig några exempel på hur du kan använda OpenCV. För mer information kan du besöka onlinekursen [Learn OpenCV](https://learnopencv.com/getting-started-with-opencv/).\n", + "I den här anteckningsboken kommer vi att ge dig några exempel på hur du använder OpenCV. För mer information kan du besöka onlinekursen [Learn OpenCV](https://learnopencv.com/getting-started-with-opencv/).\n", "\n", "Först ska vi `importera cv2`, samt några andra användbara bibliotek:\n" ] @@ -135,7 +135,7 @@ "source": [ "bw_im = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)\n", "print(bw_im.shape)\n", - "plt.imshow(bw_im)" + "plt.imshow(bw_im, cmap='gray')" ] }, { @@ -144,7 +144,7 @@ "source": [ "## Bildbehandling för Braille\n", "\n", - "Om vi vill använda bildklassificering för att känna igen texten, behöver vi klippa ut individuella symboler för att göra dem liknande MNIST-bilder som vi har sett tidigare. Detta kan göras med hjälp av [objektdetektion](../11-ObjectDetection/README.md), en teknik som vi kommer att diskutera senare, men vi kan också försöka använda ren datorsyn för detta. En bra beskrivning av hur datorsyn kan användas för att separera tecken finns [i detta blogginlägg](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) - här kommer vi endast att fokusera på några datorsynstekniker.\n", + "Om vi vill använda bildklassificering för att känna igen texten, behöver vi klippa ut individuella symboler för att göra dem liknande MNIST-bilder som vi har sett tidigare. Detta kan göras med hjälp av [objektdetektion](../11-ObjectDetection/README.md), en teknik som vi kommer att diskutera senare, men vi kan också försöka använda ren datorsyn för detta. En bra beskrivning av hur datorsyn kan användas för att separera tecken finns [i detta blogginlägg](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) - vi kommer här att fokusera på några specifika tekniker inom datorsyn.\n", "\n", "Först ska vi försöka förbättra bilden lite. Vi kan använda idén om **tröskling** (väl beskriven [i denna OpenCV-artikel](https://docs.opencv.org/4.x/d7/d4d/tutorial_py_thresholding.html)):\n" ] @@ -192,7 +192,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "För att arbeta med bilder behöver vi \"extrahera\" individuella punkter, dvs. konvertera bilderna till en uppsättning koordinater för individuella punkter. Det kan vi göra med hjälp av **funktionsutvinning**-tekniker, såsom SIFT, SURF eller [ORB](https://docs.opencv.org/4.x/d1/d89/tutorial_py_orb.html):\n" + "För att arbeta med bilder behöver vi \"extrahera\" individuella punkter, dvs. konvertera bilderna till en uppsättning koordinater för individuella punkter. Det kan vi göra med hjälp av **feature extraction**-tekniker, såsom SIFT, SURF eller [ORB](https://docs.opencv.org/4.x/d1/d89/tutorial_py_orb.html):\n" ] }, { @@ -252,7 +252,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "För att separera individuella tecken behöver vi veta den totala textens begränsningsram. För att ta reda på det kan vi helt enkelt beräkna min- och maxkoordinater:\n" + "För att separera individuella tecken behöver vi veta den omgivande rutan för hela texten. För att ta reda på det kan vi helt enkelt beräkna min- och maxkoordinater:\n" ] }, { @@ -293,7 +293,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "För att göra texten perfekt justerad kan vi utföra en så kallad **perspektivtransformation**. Vi kommer att ta en rektangel definierad av punkterna $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ och justera den med en ny bild med proportionella dimensioner:\n" + "För att göra texten perfekt justerad kan vi behöva utföra en så kallad **perspektivtransformation**. Vi kommer att ta en rektangel definierad av punkterna $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ och justera den till en ny bild med proportionella dimensioner:\n" ] }, { @@ -384,7 +384,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Du har sett att ganska många uppgifter kan utföras med ren bildbehandling, utan någon artificiell intelligens. Om vi kan använda datorseendetekniker för att göra arbetet för ett neuralt nätverk enklare - bör vi definitivt göra det, eftersom det gör det möjligt för oss att lösa problem med ett mindre antal träningsdata.\n" + "Du har sett att ganska många uppgifter kan utföras med ren bildbehandling, utan någon artificiell intelligens. Om vi kan använda datorseendetekniker för att göra arbetet för ett neuralt nätverk enklare - bör vi definitivt göra det, eftersom det kommer att göra det möjligt för oss att lösa problem med ett mindre antal träningsdata.\n" ] }, { @@ -393,9 +393,9 @@ "source": [ "## Rörelsedetektering med hjälp av ramdifferens\n", "\n", - "Att upptäcka rörelse i en videoström är en mycket vanlig uppgift. Till exempel kan det ge oss varningar när något händer på en övervakningskamera. Om vi vill förstå vad som händer på kameran kan vi sedan använda ett neuralt nätverk – men det är mycket billigare att använda ett neuralt nätverk när vi vet att något faktiskt pågår.\n", + "Att detektera rörelse i en videoström är en mycket vanlig uppgift. Till exempel kan det ge oss varningar när något händer på en övervakningskamera. Om vi vill förstå vad som händer på kameran kan vi använda ett neuralt nätverk – men det är mycket billigare att använda ett neuralt nätverk när vi redan vet att något pågår.\n", "\n", - "Huvudidén med rörelsedetektering är enkel. Om kameran är fast, bör ramarna från kameran vara ganska lika varandra. Eftersom ramar representeras som matriser, kan vi genom att subtrahera dessa matriser för två på varandra följande ramar få fram pixeldifferensen, som bör vara låg för statiska ramar och bli högre när det finns betydande rörelse i bilden.\n", + "Huvudidén med rörelsedetektering är enkel. Om kameran är fast, bör ramarna från kameran vara ganska lika varandra. Eftersom ramar representeras som matriser, kan vi genom att subtrahera dessa matriser för två på varandra följande ramar få pixelskillnaden, som bör vara låg för statiska ramar och bli högre när det finns betydande rörelse i bilden.\n", "\n", "Vi börjar med att lära oss hur man öppnar en video och konverterar den till en sekvens av ramar:\n" ] @@ -490,7 +490,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Anta att vi vill skapa en rapport som visar vad som hände framför kameran genom att visa lämplig bild varje gång något händer. För att göra det vill vi förmodligen ta reda på start- och slutbilden för en \"händelse\" och visa mittenbilden. För att ta bort lite brus kommer vi också att jämna ut kurvan ovan med en glidande medelfunktion:\n" + "Anta att vi vill skapa en rapport som visar vad som hände framför kameran genom att visa lämplig bild varje gång något händer. För att göra det vill vi förmodligen ta reda på start- och slutbilden för en \"händelse\" och visa den mittersta bilden. För att ta bort lite brus kommer vi också att jämna ut kurvan ovan med en glidande medelfunktion:\n" ] }, { @@ -535,7 +535,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Nu kan vi hitta ramar som har mängden förändringar över tröskelvärdet genom att använda `np.where`, och extrahera en sekvens av sammanhängande ramar som är längre än 30 ramar:\n" + "Nu kan vi hitta ramar som har mängden förändringar över tröskelvärdet genom att använda `np.where`, och extrahera en sekvens av på varandra följande ramar som är längre än 30 ramar:\n" ] }, { @@ -653,8 +653,8 @@ "\n", "Att bara jämföra två på varandra följande ramar låter oss se mängden förändringar, men det ger ingen information om vad som faktiskt rör sig och var. För att få den informationen finns det en teknik som kallas **[optiskt flöde](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)**:\n", "\n", - "* **Tätt optiskt flöde** beräknar vektorfältet som visar var varje pixel rör sig.\n", - "* **Glest optiskt flöde** baseras på att ta några distinkta egenskaper i bilden (t.ex. kanter) och bygga deras bana från ram till ram.\n", + "* **Tätt optiskt flöde** beräknar vektorfältet som visar för varje pixel vart den rör sig.\n", + "* **Glest optiskt flöde** bygger på att identifiera några distinkta egenskaper i bilden (t.ex. kanter) och spåra deras bana från ram till ram.\n", "\n", "Läs mer om optiskt flöde [i denna utmärkta handledning](https://learnopencv.com/optical-flow-in-opencv/).\n", "\n", @@ -687,9 +687,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Som du kan se, för varje bildruta har flödet samma dimensioner som bildrutan, och 2 kanaler som motsvarar x- och y-komponenterna av den optiska flödesvektorn.\n", + "Som du kan se, för varje bildruta har flödet samma dimensioner som bildrutan, och 2 kanaler som motsvarar x- och y-komponenterna i den optiska flödesvektorn.\n", "\n", - "Att visa optiskt flöde i 2D är lite utmanande, men vi kan använda en smart idé. Om vi konverterar det optiska flödet till polära koordinater, får vi två komponenter för varje pixel: *riktning* och *intensitet*. Vi kan representera intensiteten med pixelns ljusstyrka och riktningen med olika färger. Vi kommer att skapa en bild i [HSV (Hue-Saturation-Value) färgrymd](https://en.wikipedia.org/wiki/HSV_color_space), där nyansen definieras av riktningen, värdet av intensiteten och mättnaden sätts till 255.\n" + "Att visa optiskt flöde i 2D är lite utmanande, men vi kan använda en smart idé. Om vi konverterar det optiska flödet till polära koordinater får vi två komponenter för varje pixel: *riktning* och *intensitet*. Vi kan representera intensiteten med pixelns ljusstyrka och riktningen med olika färger. Vi kommer att skapa en bild i [HSV (Hue-Saturation-Value) färgrymd](https://en.wikipedia.org/wiki/HSV_color_space), där nyansen definieras av riktningen, värdet av intensiteten och mättnaden sätts till 255.\n" ] }, { @@ -747,7 +747,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**Ansvarsfriskrivning**: \nDetta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, bör det noteras att automatiska översättningar kan innehålla fel eller inexaktheter. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som kan uppstå vid användning av denna översättning.\n" + "\n---\n\n**Ansvarsfriskrivning**: \nDetta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, vänligen notera att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning.\n" ] } ], @@ -774,8 +774,8 @@ }, "orig_nbformat": 4, "coopTranslator": { - "original_hash": "ad5bdca62175c7a3d4336ef8c761aef3", - "translation_date": "2025-08-28T16:37:26+00:00", + "original_hash": "339b2129f86b24024393ff92b8bd376f", + "translation_date": "2025-09-07T15:07:57+00:00", "source_file": "lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb", "language_code": "sv" } diff --git a/translations/sw/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb b/translations/sw/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb index 8990f359..4d6f9397 100644 --- a/translations/sw/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb +++ b/translations/sw/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb @@ -4,15 +4,15 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Maono ya Kompyuta na OpenCV\n", + "# Uchanganuzi wa Picha na OpenCV\n", "\n", - "Notebook hii ni sehemu ya [Mtaala wa AI kwa Kompyuta](http://aka.ms/ai-beginners).\n", + "Daftari hili ni sehemu ya [Mtaala wa AI kwa Kompyuta](http://aka.ms/ai-beginners).\n", "\n", - "[OpenCV](https://opencv.org/) inachukuliwa kuwa kiwango cha *de facto* kwa usindikaji wa picha. Ina algorithms nyingi za manufaa, zilizotekelezwa kwa C++. Unaweza pia kutumia OpenCV kutoka Python.\n", + "[OpenCV](https://opencv.org/) inachukuliwa kuwa kiwango cha *de facto* kwa uchakataji wa picha. Inajumuisha algoriti nyingi muhimu, zilizotekelezwa kwa C++. Unaweza pia kutumia OpenCV kupitia Python.\n", "\n", - "Katika notebook hii, tutakupa mifano kadhaa ya jinsi ya kutumia OpenCV. Kwa maelezo zaidi, unaweza kutembelea kozi ya mtandaoni ya [Learn OpenCV](https://learnopencv.com/getting-started-with-opencv/).\n", + "Katika daftari hili, tutakupa mifano kadhaa ya jinsi ya kutumia OpenCV. Kwa maelezo zaidi, unaweza kutembelea kozi ya mtandaoni ya [Jifunze OpenCV](https://learnopencv.com/getting-started-with-opencv/).\n", "\n", - "Kwanza, hebu `import cv2`, pamoja na maktaba nyingine za manufaa:\n" + "Kwanza, hebu `import cv2`, pamoja na maktaba nyingine muhimu:\n" ] }, { @@ -44,7 +44,7 @@ "source": [ "## Kupakia Picha\n", "\n", - "Picha katika Python zinaweza kuwakilishwa kwa urahisi na arrays za NumPy. Kwa mfano, picha ya rangi ya kijivu yenye ukubwa wa pikseli 320x200 ingewekwa katika array ya 200x320, na picha ya rangi ya ukubwa sawa ingekuwa na umbo la 200x320x3 (kwa njia 3 za rangi).\n", + "Picha katika Python zinaweza kuwakilishwa kwa urahisi na arrays za NumPy. Kwa mfano, picha ya rangi ya kijivu yenye ukubwa wa pikseli 320x200 ingewekwa katika array ya 200x320, na picha ya rangi ya ukubwa sawa ingekuwa na umbo la 200x320x3 (kwa ajili ya njia 3 za rangi).\n", "\n", "Hebu tuanze kwa kupakia picha:\n" ] @@ -135,7 +135,7 @@ "source": [ "bw_im = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)\n", "print(bw_im.shape)\n", - "plt.imshow(bw_im)" + "plt.imshow(bw_im, cmap='gray')" ] }, { @@ -144,7 +144,7 @@ "source": [ "## Usindikaji wa Picha za Braille\n", "\n", - "Ikiwa tunataka kutumia uainishaji wa picha kutambua maandishi, tunahitaji kukata alama za kibinafsi ili kuzifanya zifanane na picha za MNIST ambazo tumeona hapo awali. Hili linaweza kufanyika kwa kutumia mbinu ya [utambuzi wa vitu](../11-ObjectDetection/README.md) ambayo tutajadili baadaye, lakini pia tunaweza kujaribu kutumia maono ya kompyuta pekee kwa hilo. Maelezo mazuri ya jinsi maono ya kompyuta yanavyoweza kutumika kwa kutenganisha herufi yanapatikana [katika chapisho hili la blogu](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) - hapa tutazingatia tu baadhi ya mbinu za maono ya kompyuta.\n", + "Ikiwa tunataka kutumia uainishaji wa picha kutambua maandishi, tunahitaji kukata alama za kibinafsi ili kuzifanya zifanane na picha za MNIST ambazo tumeona hapo awali. Hili linaweza kufanyika kwa kutumia mbinu ya [utambuzi wa vitu](../11-ObjectDetection/README.md) ambayo tutajadili baadaye, lakini pia tunaweza kujaribu kutumia maono ya kompyuta pekee kwa hilo. Maelezo mazuri ya jinsi maono ya kompyuta yanaweza kutumika kwa kutenganisha herufi yanapatikana [katika chapisho hili la blogu](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) - hapa tutazingatia tu baadhi ya mbinu za maono ya kompyuta.\n", "\n", "Kwanza, hebu tujaribu kuboresha picha kidogo. Tunaweza kutumia wazo la **thresholding** (limeelezwa vizuri [katika makala hii ya OpenCV](https://docs.opencv.org/4.x/d7/d4d/tutorial_py_thresholding.html)):\n" ] @@ -192,7 +192,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Ili kufanya kazi na picha, tunahitaji \"kuchopoa\" nukta za kibinafsi, yaani kubadilisha picha kuwa seti ya kuratibu za nukta za kibinafsi. Tunaweza kufanya hivyo kwa kutumia mbinu za **uchimbaji wa sifa**, kama vile SIFT, SURF au [ORB](https://docs.opencv.org/4.x/d1/d89/tutorial_py_orb.html):\n" + "Kufanya kazi na picha, tunahitaji \"kuchukua\" nukta za kibinafsi, yaani kubadilisha picha kuwa seti ya kuratibu za nukta za kibinafsi. Tunaweza kufanya hivyo kwa kutumia mbinu za **uchimbaji wa sifa**, kama vile SIFT, SURF au [ORB](https://docs.opencv.org/4.x/d1/d89/tutorial_py_orb.html):\n" ] }, { @@ -252,7 +252,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Ili kutenganisha herufi binafsi, tunahitaji kujua kisanduku cha mipaka cha maandishi yote. Ili kugundua, tunaweza tu kuhesabu kuratibu za chini na za juu:\n" + "Ili kutenganisha herufi moja moja, tunahitaji kujua kisanduku cha mipaka cha maandishi yote. Ili kugundua hilo, tunaweza tu kuhesabu kuratibu za chini na za juu:\n" ] }, { @@ -293,7 +293,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Pia, maandishi haya yanaweza kuzungushwa kwa sehemu, na ili kuyalinganisha kikamilifu tunahitaji kufanya kile kinachoitwa **mabadiliko ya mtazamo**. Tutachukua mstatili uliofafanuliwa na alama $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ na kuulinganisha na picha mpya yenye vipimo vya uwiano:\n" + "Pia, maandishi haya yanaweza kuzungushwa kwa sehemu, na ili kuyalinganisha kikamilifu tunahitaji kufanya kile kinachoitwa **mabadiliko ya mtazamo**. Tutachukua mstatili ulioelezewa na pointi $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ na kuulinganisha na picha mpya yenye vipimo vinavyolingana:\n" ] }, { @@ -340,7 +340,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Baada ya kupata picha hii iliyolingana vizuri, inapaswa kuwa rahisi kuigawanya vipande:\n" + "Baada ya kupata picha hii iliyoambatana vizuri, inapaswa kuwa rahisi kuigawanya vipande:\n" ] }, { @@ -391,11 +391,11 @@ "source": [ "## Kugundua Mwendo kwa Kutumia Tofauti ya Fremu\n", "\n", - "Kugundua mwendo kwenye mkondo wa video ni kazi ya mara kwa mara. Kwa mfano, inatuwezesha kupata tahadhari pale kitu kinapotokea kwenye kamera ya ulinzi. Ikiwa tunataka kuelewa kinachotokea kwenye kamera, tunaweza kutumia mtandao wa neva - lakini ni rahisi zaidi kutumia mtandao wa neva pale tunapojua kwamba kuna kitu kinachoendelea.\n", + "Kugundua mwendo kwenye mkondo wa video ni kazi ya kawaida sana. Kwa mfano, inatuwezesha kupokea arifa pale kitu kinapotokea kwenye kamera ya ulinzi. Ikiwa tunataka kuelewa kinachoendelea kwenye kamera, tunaweza kutumia mtandao wa neva - lakini ni gharama nafuu zaidi kutumia mtandao wa neva pale tu tunapojua kwamba kuna kitu kinachoendelea.\n", "\n", - "Wazo kuu la kugundua mwendo ni rahisi. Ikiwa kamera imewekwa mahali pamoja, basi fremu kutoka kwenye kamera zinapaswa kufanana sana. Kwa kuwa fremu zinawakilishwa kama safu, kwa kutoa tofauti ya safu hizo kwa fremu mbili zinazofuatana, tutapata tofauti ya pikseli, ambayo inapaswa kuwa ndogo kwa fremu zisizobadilika, na kuwa kubwa zaidi pale kuna mwendo mkubwa kwenye picha.\n", + "Wazo kuu la kugundua mwendo ni rahisi. Ikiwa kamera imetulia, basi fremu kutoka kwenye kamera zinapaswa kufanana sana. Kwa kuwa fremu zinawakilishwa kama safu, kwa kutoa tofauti ya safu hizo kwa fremu mbili mfululizo tutapata tofauti ya pikseli, ambayo inapaswa kuwa ndogo kwa fremu zisizobadilika, na kuwa kubwa zaidi pale ambapo kuna mwendo mkubwa kwenye picha.\n", "\n", - "Tutaanza kwa kujifunza jinsi ya kufungua video na kuibadilisha kuwa mfululizo wa fremu:\n" + "Tutaanza kwa kujifunza jinsi ya kufungua video na kuibadilisha kuwa mlolongo wa fremu:\n" ] }, { @@ -443,7 +443,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Kwa kuwa rangi si muhimu sana kwa kugundua mwendo, tutabadilisha fremu zote kuwa za rangi ya kijivu. Kisha, tutahesabu tofauti za fremu, na kuchora kanuni zake ili kuona kwa macho kiwango cha shughuli kinachoendelea:\n" + "Kwa kuwa rangi si muhimu sana kwa kugundua mwendo, tutabadilisha fremu zote kuwa za kijivu. Kisha, tutahesabu tofauti za fremu, na kuchora kanuni zake ili kuona kwa macho kiwango cha shughuli kinachoendelea:\n" ] }, { @@ -488,7 +488,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Tuseme tunataka kuunda ripoti inayoonyesha kile kilichotokea mbele ya kamera kwa kuonyesha picha inayofaa kila wakati kitu kinatokea. Ili kufanya hivyo, huenda tunataka kutafuta fremu ya mwanzo na mwisho ya \"tukio\", na kuonyesha fremu ya katikati. Ili kuondoa kelele fulani, pia tutasawazisha mwinuko hapo juu kwa kutumia kazi ya wastani wa kusonga:\n" + "Tuseme tunataka kuunda ripoti inayoonyesha kile kilichotokea mbele ya kamera kwa kuonyesha picha inayofaa kila wakati kitu kinapotokea. Ili kufanya hivyo, huenda tunataka kugundua fremu ya mwanzo na mwisho ya \"tukio\", na kuonyesha fremu ya katikati. Ili kuondoa kelele fulani, tutasawazisha pia mlinganyo hapo juu kwa kutumia kazi ya wastani wa kusonga:\n" ] }, { @@ -533,7 +533,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Sasa tunaweza kupata fremu ambazo zina kiwango cha mabadiliko kilicho juu ya kizingiti kwa kutumia `np.where`, na kutoa mlolongo wa fremu mfululizo ambao ni mrefu zaidi ya fremu 30:\n" + "Sasa tunaweza kupata fremu ambazo zina kiwango cha mabadiliko juu ya kizingiti kwa kutumia `np.where`, na kutoa mfululizo wa fremu mfululizo ambao ni mrefu zaidi ya fremu 30:\n" ] }, { @@ -606,7 +606,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Unaweza kugundua kuwa mpangilio wa rangi kwenye picha hii hauonekani sawa! Hii ni kwa sababu OpenCV, kwa sababu za kihistoria, hupakia picha katika nafasi ya rangi ya BGR, wakati matplotlib hutumia mpangilio wa rangi wa jadi wa RGB. Mara nyingi, inafaa kubadilisha picha kuwa RGB mara tu baada ya kuzipakia.\n" + "Unaweza kugundua kwamba mpangilio wa rangi kwenye picha hii hauonekani sawa! Hii ni kwa sababu OpenCV kwa sababu za kihistoria hupakia picha katika nafasi ya rangi ya BGR, wakati matplotlib hutumia mpangilio wa rangi wa jadi wa RGB. Mara nyingi, inafaa kubadilisha picha kuwa RGB mara tu baada ya kuzipakia.\n" ] }, { @@ -647,10 +647,10 @@ "source": [ "## Kutambua Mwendo kwa Kutumia Optical Flow\n", "\n", - "Ingawa kulinganisha fremu mbili mfululizo kunaweza kutuonyesha kiwango cha mabadiliko, hakutupi taarifa kuhusu nini hasa kinachohama na wapi. Ili kupata taarifa hiyo, kuna mbinu inayoitwa **[optical flow](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)**:\n", + "Ingawa kulinganisha fremu mbili mfululizo kunaweza kutuonyesha kiwango cha mabadiliko, hakutupi taarifa yoyote kuhusu nini hasa kinachohamia na wapi. Ili kupata taarifa hiyo, kuna mbinu inayoitwa **[optical flow](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)**:\n", "\n", - "* **Dense Optical Flow** huhesabu uwanja wa vekta unaoonyesha kila pikseli inahama wapi.\n", - "* **Sparse Optical Flow** inategemea kuchukua vipengele vya kipekee kwenye picha (mfano, kingo) na kufuatilia mwelekeo wake kutoka fremu moja hadi nyingine.\n", + "* **Dense Optical Flow** huhesabu uwanja wa vekta unaoonyesha kwa kila pikseli inahama wapi.\n", + "* **Sparse Optical Flow** inategemea kuchukua sifa za kipekee kwenye picha (mfano, kingo), na kujenga mwelekeo wake kutoka fremu moja hadi nyingine.\n", "\n", "Soma zaidi kuhusu optical flow [katika mafunzo haya mazuri](https://learnopencv.com/optical-flow-in-opencv/).\n", "\n", @@ -734,9 +734,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Kwa hivyo, katika fremu hizo rangi ya kijani inahusiana na kusonga upande wa kushoto, wakati bluu - kusonga upande wa kulia.\n", + "Kwa hivyo, katika fremu hizo, rangi ya kijani inahusiana na kusonga kushoto, wakati bluu - kusonga kulia.\n", "\n", - "Mtiririko wa macho unaweza kuwa chombo bora cha kutoa hitimisho kuhusu mwelekeo wa jumla wa harakati. Kwa mfano, ikiwa utaona kwamba pikseli zote katika fremu zinahama kwa mwelekeo mmoja zaidi au pungufu - unaweza kuhitimisha kuwa kuna harakati ya kamera, na ujaribu kufidia hilo.\n" + "Mtiririko wa macho unaweza kuwa chombo bora cha kutoa hitimisho kuhusu mwelekeo wa jumla wa harakati. Kwa mfano, ikiwa utaona kwamba pikseli zote katika fremu zinahama kwa mwelekeo mmoja zaidi au pungufu - unaweza kuhitimisha kuwa kuna harakati za kamera, na ujaribu kufidia hilo.\n" ] }, { @@ -770,8 +770,8 @@ }, "orig_nbformat": 4, "coopTranslator": { - "original_hash": "ad5bdca62175c7a3d4336ef8c761aef3", - "translation_date": "2025-08-29T13:58:29+00:00", + "original_hash": "339b2129f86b24024393ff92b8bd376f", + "translation_date": "2025-09-07T15:15:18+00:00", "source_file": "lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb", "language_code": "sw" } diff --git a/translations/th/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb b/translations/th/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb index 8a18d5c2..a5f0af0c 100644 --- a/translations/th/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb +++ b/translations/th/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb @@ -8,11 +8,11 @@ "\n", "สมุดบันทึกนี้เป็นส่วนหนึ่งของ [หลักสูตร AI สำหรับผู้เริ่มต้น](http://aka.ms/ai-beginners)\n", "\n", - "[OpenCV](https://opencv.org/) ถือเป็นมาตรฐาน *de facto* สำหรับการประมวลผลภาพ โดยมีอัลกอริธึมที่มีประโยชน์มากมายซึ่งพัฒนาในภาษา C++ คุณสามารถเรียกใช้งาน OpenCV จาก Python ได้เช่นกัน\n", + "[OpenCV](https://opencv.org/) ถือว่าเป็นมาตรฐาน *de facto* สำหรับการประมวลผลภาพ มีอัลกอริทึมที่มีประโยชน์มากมายซึ่งถูกพัฒนาในภาษา C++ คุณสามารถเรียกใช้งาน OpenCV จาก Python ได้เช่นกัน\n", "\n", - "ในสมุดบันทึกนี้ เราจะยกตัวอย่างการใช้งาน OpenCV ให้คุณดู สำหรับรายละเอียดเพิ่มเติม คุณสามารถเยี่ยมชมคอร์สออนไลน์ [Learn OpenCV](https://learnopencv.com/getting-started-with-opencv/) \n", + "ในสมุดบันทึกนี้ เราจะให้ตัวอย่างบางส่วนสำหรับการใช้งาน OpenCV หากต้องการรายละเอียดเพิ่มเติม คุณสามารถเยี่ยมชมคอร์สออนไลน์ [Learn OpenCV](https://learnopencv.com/getting-started-with-opencv/) \n", "\n", - "ก่อนอื่น มา `import cv2` รวมถึงไลบรารีอื่น ๆ ที่มีประโยชน์กัน:\n" + "เริ่มต้นด้วยการ `import cv2` รวมถึงไลบรารีอื่น ๆ ที่มีประโยชน์:\n" ] }, { @@ -44,7 +44,7 @@ "source": [ "## การโหลดภาพ\n", "\n", - "ภาพใน Python สามารถแสดงผลได้อย่างสะดวกโดยใช้ NumPy arrays ตัวอย่างเช่น ภาพขาวดำที่มีขนาด 320x200 พิกเซล จะถูกเก็บใน array ขนาด 200x320 และภาพสีที่มีขนาดเดียวกันจะมีรูปแบบเป็น 200x320x3 (สำหรับ 3 ช่องสี)\n", + "ภาพใน Python สามารถแสดงผลได้อย่างสะดวกผ่าน NumPy arrays ตัวอย่างเช่น ภาพขาวดำที่มีขนาด 320x200 พิกเซล จะถูกเก็บใน array ขนาด 200x320 และภาพสีที่มีขนาดเดียวกันจะมีรูปทรงเป็น 200x320x3 (สำหรับ 3 ช่องสี)\n", "\n", "มาเริ่มต้นด้วยการโหลดภาพ:\n" ] @@ -94,7 +94,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "ตามที่คุณเห็น นี่คือภาพของข้อความอักษรเบรลล์ เนื่องจากเราไม่ได้สนใจสีจริงมากนัก เราจึงสามารถแปลงมันเป็นสีขาวดำได้:\n" + "ตามที่คุณเห็น นี่คือภาพของข้อความอักษรเบรลล์ เนื่องจากเราไม่ได้สนใจสีจริงมากนัก เราจึงสามารถแปลงมันเป็นขาวดำได้:\n" ] }, { @@ -135,7 +135,7 @@ "source": [ "bw_im = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)\n", "print(bw_im.shape)\n", - "plt.imshow(bw_im)" + "plt.imshow(bw_im, cmap='gray')" ] }, { @@ -144,7 +144,7 @@ "source": [ "## การประมวลผลภาพอักษรเบรลล์\n", "\n", - "หากเราต้องการใช้การจำแนกภาพเพื่อจดจำข้อความ เราจำเป็นต้องตัดสัญลักษณ์แต่ละตัวออกมาเพื่อให้มีลักษณะคล้ายกับภาพ MNIST ที่เราเคยเห็นมาก่อน สิ่งนี้สามารถทำได้โดยใช้เทคนิค [object detection](../11-ObjectDetection/README.md) ซึ่งเราจะพูดถึงในภายหลัง แต่เรายังสามารถลองใช้วิธีการประมวลผลภาพด้วยคอมพิวเตอร์ล้วนๆ สำหรับงานนี้ได้ คำอธิบายที่ดีเกี่ยวกับวิธีการใช้การประมวลผลภาพเพื่อแยกตัวอักษรสามารถพบได้ [ในบล็อกโพสต์นี้](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) - เราจะมุ่งเน้นเฉพาะบางเทคนิคของการประมวลผลภาพในที่นี้\n", + "หากเราต้องการใช้การจำแนกภาพเพื่อจดจำข้อความ เราจำเป็นต้องตัดสัญลักษณ์แต่ละตัวออกมาเพื่อให้มีลักษณะคล้ายกับภาพ MNIST ที่เราเคยเห็นมาก่อน สิ่งนี้สามารถทำได้โดยใช้เทคนิค [object detection](../11-ObjectDetection/README.md) ซึ่งเราจะพูดถึงในภายหลัง แต่เรายังสามารถลองใช้วิธีการประมวลผลภาพด้วยคอมพิวเตอร์ล้วนๆ สำหรับงานนี้ได้ คำอธิบายที่ดีเกี่ยวกับวิธีการใช้การประมวลผลภาพด้วยคอมพิวเตอร์สำหรับการแยกตัวอักษรสามารถพบได้ [ในบล็อกโพสต์นี้](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) - เราจะเน้นเฉพาะบางเทคนิคของการประมวลผลภาพด้วยคอมพิวเตอร์ที่นี่\n", "\n", "ก่อนอื่น ลองปรับปรุงภาพให้ดีขึ้นเล็กน้อย เราสามารถใช้แนวคิดของ **thresholding** (อธิบายไว้อย่างดี [ในบทความ OpenCV นี้](https://docs.opencv.org/4.x/d7/d4d/tutorial_py_thresholding.html)):\n" ] @@ -252,7 +252,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "ในการแยกอักขระแต่ละตัว เราจำเป็นต้องทราบกรอบเขตของข้อความทั้งหมด ในการหากรอบเขต เราสามารถคำนวณพิกัดต่ำสุดและสูงสุดได้\n" + "ในการแยกอักขระแต่ละตัว เราจำเป็นต้องทราบกรอบเขตของข้อความทั้งหมด ในการหากรอบเขต เราสามารถคำนวณพิกัดต่ำสุดและสูงสุดได้:\n" ] }, { @@ -293,7 +293,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "นอกจากนี้ ข้อความนี้สามารถหมุนบางส่วนได้ และเพื่อให้จัดเรียงได้อย่างสมบูรณ์แบบ เราจำเป็นต้องทำสิ่งที่เรียกว่า **การแปลงมุมมอง** เราจะใช้สี่เหลี่ยมผืนผ้าที่กำหนดโดยจุด $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ และจัดเรียงให้ตรงกับภาพใหม่ที่มีสัดส่วนมิติที่เหมาะสม:\n" + "นอกจากนี้ ข้อความนี้สามารถหมุนบางส่วนได้ และเพื่อให้จัดแนวได้อย่างสมบูรณ์แบบ เราจำเป็นต้องทำสิ่งที่เรียกว่า **การแปลงมุมมอง** เราจะใช้สี่เหลี่ยมผืนผ้าที่กำหนดโดยจุด $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ และจัดแนวให้ตรงกับภาพใหม่ที่มีสัดส่วนมิติ:\n" ] }, { @@ -389,11 +389,11 @@ "source": [ "## การตรวจจับการเคลื่อนไหวด้วยความแตกต่างของเฟรม\n", "\n", - "การตรวจจับการเคลื่อนไหวในวิดีโอสตรีมเป็นงานที่พบได้บ่อยมาก ตัวอย่างเช่น มันช่วยให้เราได้รับการแจ้งเตือนเมื่อมีบางสิ่งเกิดขึ้นบนกล้องวงจรปิด หากเราต้องการเข้าใจว่าเกิดอะไรขึ้นบนกล้อง เราสามารถใช้โครงข่ายประสาทเทียม (neural network) ได้ แต่การใช้โครงข่ายประสาทเทียมจะมีค่าใช้จ่ายน้อยลงเมื่อเรารู้ว่ามีบางสิ่งกำลังเกิดขึ้น\n", + "การตรวจจับการเคลื่อนไหวในวิดีโอสตรีมเป็นงานที่พบได้บ่อยมาก ตัวอย่างเช่น มันช่วยให้เรารับการแจ้งเตือนเมื่อมีบางสิ่งเกิดขึ้นบนกล้องวงจรปิด หากเราต้องการเข้าใจว่าเกิดอะไรขึ้นบนกล้อง เราสามารถใช้เครือข่ายประสาทเทียม (neural network) แต่การใช้เครือข่ายประสาทเทียมจะมีต้นทุนที่ถูกลงเมื่อเรารู้ว่ามีบางสิ่งกำลังเกิดขึ้น\n", "\n", - "แนวคิดหลักของการตรวจจับการเคลื่อนไหวค่อนข้างง่าย หากกล้องถูกตั้งอยู่กับที่ เฟรมจากกล้องควรจะมีความคล้ายคลึงกันมาก เนื่องจากเฟรมถูกแสดงผลในรูปแบบอาเรย์ เพียงแค่ลบอาเรย์ของเฟรมสองเฟรมที่ต่อเนื่องกัน เราจะได้ค่าความแตกต่างของพิกเซล ซึ่งควรจะต่ำในกรณีที่เฟรมไม่มีการเคลื่อนไหว และจะสูงขึ้นเมื่อมีการเคลื่อนไหวที่ชัดเจนในภาพ\n", + "แนวคิดหลักของการตรวจจับการเคลื่อนไหวมีความเรียบง่าย หากกล้องถูกตั้งอยู่ในตำแหน่งคงที่ เฟรมจากกล้องควรมีความคล้ายคลึงกันมาก เนื่องจากเฟรมถูกแสดงผลในรูปแบบอาร์เรย์ เพียงแค่ลบอาร์เรย์ของเฟรมสองเฟรมที่ต่อเนื่องกัน เราจะได้ค่าความแตกต่างของพิกเซล ซึ่งควรมีค่าน้อยสำหรับเฟรมที่นิ่ง และมีค่าสูงขึ้นเมื่อมีการเคลื่อนไหวที่สำคัญในภาพ\n", "\n", - "เราจะเริ่มต้นด้วยการเรียนรู้วิธีเปิดวิดีโอและแปลงมันให้เป็นลำดับของเฟรม:\n" + "เราจะเริ่มต้นด้วยการเรียนรู้วิธีเปิดวิดีโอและแปลงมันเป็นลำดับของเฟรม:\n" ] }, { @@ -441,7 +441,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "เนื่องจากสีไม่สำคัญมากนักสำหรับการตรวจจับการเคลื่อนไหว เราจะเปลี่ยนทุกเฟรมเป็นภาพระดับสีเทา จากนั้นเราจะคำนวณความแตกต่างของเฟรม และแสดงค่ามาตรฐานของมันเพื่อดูปริมาณกิจกรรมที่เกิดขึ้น:\n" + "เนื่องจากสีไม่สำคัญมากนักสำหรับการตรวจจับการเคลื่อนไหว เราจะเปลี่ยนทุกเฟรมเป็นสีเทา จากนั้นเราจะคำนวณความแตกต่างของเฟรม และแสดงค่าความนอร์มเพื่อดูปริมาณกิจกรรมที่เกิดขึ้น:\n" ] }, { @@ -486,7 +486,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "สมมติว่าเราต้องการสร้างรายงานที่แสดงสิ่งที่เกิดขึ้นหน้ากล้องโดยแสดงภาพที่เหมาะสมในแต่ละครั้งที่มีบางสิ่งเกิดขึ้น ในการทำเช่นนี้ เราอาจต้องการค้นหากรอบเริ่มต้นและกรอบสิ้นสุดของ \"เหตุการณ์\" และแสดงกรอบตรงกลาง เพื่อกำจัดสัญญาณรบกวนบางส่วน เราจะปรับเส้นโค้งด้านบนให้เรียบขึ้นด้วยฟังก์ชันค่าเฉลี่ยเคลื่อนที่:\n" + "สมมติว่าเราต้องการสร้างรายงานที่แสดงสิ่งที่เกิดขึ้นหน้ากล้องโดยแสดงภาพที่เหมาะสมทุกครั้งที่มีบางสิ่งเกิดขึ้น ในการทำเช่นนี้ เราอาจต้องการค้นหากรอบเริ่มต้นและกรอบสิ้นสุดของ \"เหตุการณ์\" และแสดงกรอบตรงกลาง เพื่อกำจัดสัญญาณรบกวนบางส่วน เราจะปรับเส้นโค้งด้านบนให้เรียบด้วยฟังก์ชันค่าเฉลี่ยเคลื่อนที่:\n" ] }, { @@ -531,7 +531,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "ตอนนี้เราสามารถหากรอบที่มีจำนวนการเปลี่ยนแปลงเกินเกณฑ์ได้โดยใช้ `np.where` และดึงลำดับของกรอบที่ต่อเนื่องกันซึ่งยาวเกิน 30 กรอบ:\n" + "ตอนนี้เราสามารถหากรอบที่มีจำนวนการเปลี่ยนแปลงเกินเกณฑ์โดยใช้ `np.where` และดึงลำดับของกรอบที่ต่อเนื่องกันซึ่งยาวเกิน 30 กรอบ:\n" ] }, { @@ -679,9 +679,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "สำหรับแต่ละเฟรม การไหลของข้อมูลจะมีมิติเท่ากับเฟรม และมี 2 ช่องสัญญาณ ซึ่งสอดคล้องกับองค์ประกอบ x และ y ของเวกเตอร์การไหลเชิงแสง\n", + "สำหรับแต่ละเฟรม การไหลของข้อมูลจะมีมิติเท่ากับเฟรมนั้น และมี 2 ช่องสัญญาณ ซึ่งสอดคล้องกับองค์ประกอบ x และ y ของเวกเตอร์การไหลของแสง\n", "\n", - "การแสดงผลการไหลเชิงแสงในรูปแบบ 2 มิตินั้นค่อนข้างท้าทาย แต่เราสามารถใช้แนวคิดที่ชาญฉลาดได้ หากเราทำการแปลงการไหลเชิงแสงเป็นพิกัดเชิงขั้ว เราจะได้สององค์ประกอบสำหรับแต่ละพิกเซล: *ทิศทาง* และ *ความเข้ม* เราสามารถแสดงความเข้มด้วยความเข้มของพิกเซล และแสดงทิศทางด้วยสีที่แตกต่างกัน เราจะสร้างภาพใน [พื้นที่สี HSV (Hue-Saturation-Value)](https://en.wikipedia.org/wiki/HSV_color_space) โดยที่ hue จะถูกกำหนดโดยทิศทาง value - โดยความเข้ม และ saturation จะมีค่าเป็น 255\n" + "การแสดงผลการไหลของแสงใน 2 มิตินั้นค่อนข้างท้าทาย แต่เราสามารถใช้แนวคิดที่ชาญฉลาดได้ หากเรานำการไหลของแสงมาแปลงเป็นพิกัดเชิงขั้ว เราจะได้สององค์ประกอบสำหรับแต่ละพิกเซล: *ทิศทาง* และ *ความเข้ม* เราสามารถแสดงความเข้มด้วยความเข้มของพิกเซล และแสดงทิศทางด้วยสีที่แตกต่างกัน เราจะสร้างภาพใน [พื้นที่สี HSV (Hue-Saturation-Value)](https://en.wikipedia.org/wiki/HSV_color_space) โดยที่ hue จะถูกกำหนดด้วยทิศทาง value จะถูกกำหนดด้วยความเข้ม และ saturation จะมีค่าเป็น 255\n" ] }, { @@ -730,9 +730,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "ดังนั้น ในเฟรมเหล่านั้น สีเขียวจะหมายถึงการเคลื่อนที่ไปทางซ้าย ในขณะที่สีน้ำเงินจะหมายถึงการเคลื่อนที่ไปทางขวา\n", + "ดังนั้น ในเฟรมเหล่านั้น สีเขียวหมายถึงการเคลื่อนที่ไปทางซ้าย ส่วนสีน้ำเงินหมายถึงการเคลื่อนที่ไปทางขวา\n", "\n", - "Optical flow สามารถเป็นเครื่องมือที่ยอดเยี่ยมในการสรุปทิศทางการเคลื่อนที่โดยรวมได้ ตัวอย่างเช่น หากคุณเห็นว่าพิกเซลทั้งหมดในเฟรมกำลังเคลื่อนที่ไปในทิศทางเดียวกันมากหรือน้อย คุณสามารถสรุปได้ว่ามีการเคลื่อนที่ของกล้อง และพยายามชดเชยการเคลื่อนที่นั้น\n" + "Optical flow เป็นเครื่องมือที่ยอดเยี่ยมในการวิเคราะห์ทิศทางการเคลื่อนที่โดยรวม ตัวอย่างเช่น หากคุณเห็นว่าพิกเซลทั้งหมดในเฟรมเคลื่อนที่ไปในทิศทางเดียวกันมากหรือน้อย คุณสามารถสรุปได้ว่ามีการเคลื่อนที่ของกล้อง และลองปรับแก้เพื่อชดเชยการเคลื่อนที่นั้น\n" ] }, { @@ -766,8 +766,8 @@ }, "orig_nbformat": 4, "coopTranslator": { - "original_hash": "ad5bdca62175c7a3d4336ef8c761aef3", - "translation_date": "2025-08-29T09:59:08+00:00", + "original_hash": "339b2129f86b24024393ff92b8bd376f", + "translation_date": "2025-09-07T15:07:15+00:00", "source_file": "lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb", "language_code": "th" } diff --git a/translations/tl/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb b/translations/tl/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb index 0a4bdd88..c01d1c43 100644 --- a/translations/tl/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb +++ b/translations/tl/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb @@ -8,11 +8,11 @@ "\n", "Ang notebook na ito ay bahagi ng [AI for Beginners Curriculum](http://aka.ms/ai-beginners).\n", "\n", - "Ang [OpenCV](https://opencv.org/) ay itinuturing na *de facto* na pamantayan para sa pagpoproseso ng imahe. Naglalaman ito ng maraming kapaki-pakinabang na mga algorithm na nakasulat sa C++. Maaari mo ring gamitin ang OpenCV sa Python.\n", + "Ang [OpenCV](https://opencv.org/) ay itinuturing na *de facto* standard para sa pagproseso ng imahe. Naglalaman ito ng maraming kapaki-pakinabang na algorithm na nakasulat sa C++. Maaari mo ring tawagin ang OpenCV gamit ang Python.\n", "\n", "Sa notebook na ito, magbibigay kami ng ilang mga halimbawa ng paggamit ng OpenCV. Para sa karagdagang detalye, maaari mong bisitahin ang online na kurso na [Learn OpenCV](https://learnopencv.com/getting-started-with-opencv/).\n", "\n", - "Una, i-`import` natin ang `cv2`, pati na rin ang iba pang mga kapaki-pakinabang na library:\n" + "Una, mag-`import cv2` tayo, pati na rin ang ilang iba pang kapaki-pakinabang na mga library:\n" ] }, { @@ -44,7 +44,7 @@ "source": [ "## Pag-load ng Mga Imahe\n", "\n", - "Ang mga imahe sa Python ay madaling maipakita gamit ang mga NumPy array. Halimbawa, ang grayscale na imahe na may sukat na 320x200 pixels ay maiimbak sa 200x320 na array, at ang color image na may parehong sukat ay magkakaroon ng hugis na 200x320x3 (para sa 3 color channels).\n", + "Ang mga imahe sa Python ay madaling maipakita gamit ang mga NumPy array. Halimbawa, ang grayscale na imahe na may sukat na 320x200 pixels ay maiimbak sa isang 200x320 na array, at ang kulay na imahe na may parehong sukat ay magkakaroon ng hugis na 200x320x3 (para sa 3 color channels).\n", "\n", "Simulan natin sa pag-load ng isang imahe:\n" ] @@ -135,18 +135,18 @@ "source": [ "bw_im = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)\n", "print(bw_im.shape)\n", - "plt.imshow(bw_im)" + "plt.imshow(bw_im, cmap='gray')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Pagpoproseso ng Larawan ng Braille\n", + "## Pagpoproseso ng Imahe ng Braille\n", "\n", - "Kung nais nating magamit ang image classification upang makilala ang teksto, kailangan nating putulin ang bawat simbolo upang maging kahawig ng mga larawang MNIST na nakita na natin dati. Magagawa ito gamit ang [object detection](../11-ObjectDetection/README.md) na tatalakayin natin mamaya, ngunit maaari rin nating subukang gumamit ng purong computer vision para dito. Isang magandang paliwanag kung paano magagamit ang computer vision para sa paghihiwalay ng mga karakter ay matatagpuan [sa blog post na ito](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) - dito ay magtutuon lamang tayo sa ilang mga teknik ng computer vision.\n", + "Kung nais nating mag-apply ng image classification upang makilala ang teksto, kailangan nating ihiwalay ang bawat simbolo upang maging katulad ng mga MNIST images na nakita natin dati. Magagawa ito gamit ang [object detection](../11-ObjectDetection/README.md) na teknolohiya na tatalakayin natin mamaya, ngunit maaari rin nating subukan ang paggamit ng purong computer vision para dito. Isang magandang paliwanag kung paano magagamit ang computer vision para sa paghihiwalay ng mga karakter ay matatagpuan [sa blog post na ito](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) - dito, magpo-focus lamang tayo sa ilang mga teknolohiya ng computer vision.\n", "\n", - "Una, subukan nating pagandahin nang kaunti ang larawan. Maaari nating gamitin ang ideya ng **thresholding** (mahusay na ipinaliwanag [sa artikulong ito ng OpenCV](https://docs.opencv.org/4.x/d7/d4d/tutorial_py_thresholding.html)):\n" + "Una, subukan nating pagandahin ang imahe nang kaunti. Maaari nating gamitin ang ideya ng **thresholding** (mahusay na ipinaliwanag [sa artikulo ng OpenCV na ito](https://docs.opencv.org/4.x/d7/d4d/tutorial_py_thresholding.html)):\n" ] }, { @@ -192,7 +192,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Upang makapagtrabaho sa mga imahe, kailangan nating \"i-extract\" ang mga indibidwal na tuldok, ibig sabihin, i-convert ang mga imahe sa isang set ng mga koordinato ng mga indibidwal na tuldok. Magagawa natin ito gamit ang mga teknik sa **feature extraction**, tulad ng SIFT, SURF o [ORB](https://docs.opencv.org/4.x/d1/d89/tutorial_py_orb.html):\n" + "Upang magtrabaho sa mga imahe, kailangan nating \"i-extract\" ang mga indibidwal na tuldok, ibig sabihin, i-convert ang mga imahe sa isang set ng mga koordinado ng indibidwal na tuldok. Magagawa natin ito gamit ang mga teknik ng **feature extraction**, tulad ng SIFT, SURF o [ORB](https://docs.opencv.org/4.x/d1/d89/tutorial_py_orb.html):\n" ] }, { @@ -293,7 +293,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Gayundin, ang tekstong ito ay maaaring bahagyang i-rotate, at upang ito ay maging perpektong naka-align kailangan nating gawin ang tinatawag na **perspective transformation**. Kukunin natin ang isang rektanggulo na tinukoy ng mga punto $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ at i-aalign ito sa bagong imahe na may proporsyonal na sukat:\n" + "Gayundin, ang tekstong ito ay maaaring bahagyang i-rotate, at upang ito ay maging perpektong naka-align, kailangan nating gawin ang tinatawag na **perspective transformation**. Kukunin natin ang isang rektanggulo na tinukoy ng mga punto $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ at i-aalign ito sa bagong imahe na may proporsyonal na sukat:\n" ] }, { @@ -340,7 +340,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Pagkatapos makuha ang maayos na naka-align na imahe, dapat itong maging medyo madali upang hatiin ito sa mga piraso:\n" + "Pagkatapos nating makuha ang maayos na naka-align na larawan, dapat itong maging medyo madali upang hatiin ito sa mga piraso:\n" ] }, { @@ -389,13 +389,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Pagtukoy ng Galaw gamit ang Pagkakaiba ng Frame\n", + "## Pag-detect ng Galaw gamit ang Pagkakaiba ng Frame\n", "\n", - "Ang pagtukoy ng galaw sa video stream ay isang karaniwang gawain. Halimbawa, nagbibigay-daan ito sa atin na makatanggap ng mga alerto kapag may nangyayari sa isang surveillance camera. Kung nais nating maunawaan kung ano ang nagaganap sa camera, maaari nating gamitin ang isang neural network - ngunit mas mura ang paggamit ng neural network kapag alam nating may nangyayari.\n", + "Ang pag-detect ng galaw sa video stream ay isang karaniwang gawain. Halimbawa, nagbibigay ito ng alerto kapag may nangyari sa isang surveillance camera. Kung nais nating maintindihan kung ano ang nangyayari sa camera, maaari nating gamitin ang neural network - ngunit mas matipid gamitin ang neural network kapag alam nating may nangyayari.\n", "\n", - "Ang pangunahing ideya ng pagtukoy ng galaw ay simple. Kung ang camera ay nakapirmi, ang mga frame mula sa camera ay dapat halos magkapareho. Dahil ang mga frame ay kinakatawan bilang mga array, sa pamamagitan lamang ng pagbabawas ng mga array ng dalawang magkasunod na frame, makukuha natin ang pagkakaiba ng pixel, na dapat mababa para sa mga static na frame, at tataas kapag may makabuluhang galaw sa imahe.\n", + "Ang pangunahing ideya ng pag-detect ng galaw ay simple. Kung ang camera ay nakapirmi, ang mga frame mula sa camera ay dapat halos magkapareho. Dahil ang mga frame ay kinakatawan bilang mga array, sa simpleng pagbabawas ng mga array ng dalawang magkasunod na frame, makukuha natin ang pagkakaiba ng pixel, na dapat mababa para sa mga static na frame, at tataas kapag may malaki nang galaw sa imahe.\n", "\n", - "Magsisimula tayo sa pag-aaral kung paano buksan ang isang video at i-convert ito sa isang sunod-sunod na mga frame:\n" + "Magsisimula tayo sa pag-aaral kung paano buksan ang isang video at gawing sunod-sunod na mga frame:\n" ] }, { @@ -488,7 +488,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Ipagpalagay natin na nais nating gumawa ng ulat na nagpapakita ng nangyari sa harap ng kamera sa pamamagitan ng pagpapakita ng angkop na imahe tuwing may nangyayari. Upang gawin ito, marahil nais nating alamin ang simula at huling frame ng isang \"pangyayari\", at ipakita ang gitnang frame. Upang alisin ang ilang ingay, papakinisin din natin ang kurba sa itaas gamit ang moving average function:\n" + "Ipagpalagay nating nais nating gumawa ng ulat na nagpapakita ng mga nangyari sa harap ng kamera sa pamamagitan ng pagpapakita ng angkop na imahe tuwing may nangyayari. Upang gawin ito, marahil nais nating alamin ang simula at dulo ng isang \"pangyayari\", at ipakita ang gitnang frame. Upang mabawasan ang ilang ingay, papakinisin din natin ang kurba sa itaas gamit ang moving average function:\n" ] }, { @@ -533,7 +533,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Ngayon, maaari nating hanapin ang mga frame na may dami ng pagbabago na lampas sa threshold gamit ang `np.where`, at kunin ang isang sunod-sunod na mga frame na mas mahaba sa 30 frame:\n" + "Ngayon, maaari nating hanapin ang mga frame na may dami ng pagbabago na lampas sa threshold gamit ang `np.where`, at kunin ang isang sunod-sunod na mga magkakasunod na frame na mas mahaba sa 30 frame:\n" ] }, { @@ -606,7 +606,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Maaaring mapansin mo na ang kulay ng scheme sa imaheng ito ay hindi tama! Ito ay dahil ang OpenCV, sa mga kadahilanang historikal, ay naglo-load ng mga imahe sa BGR na color space, habang ang matplotlib ay gumagamit ng mas tradisyunal na RGB na pagkakasunod ng kulay. Kadalasan, mas makatuwiran na i-convert ang mga imahe sa RGB kaagad pagkatapos itong i-load.\n" + "Maaaring mapansin mo na ang kulay sa larawang ito ay hindi mukhang tama! Ito ay dahil ang OpenCV, sa mga historikal na dahilan, ay naglo-load ng mga larawan sa BGR na color space, habang ang matplotlib ay gumagamit ng mas tradisyunal na RGB na pagkakasunod ng kulay. Kadalasan, makatuwiran na i-convert ang mga larawan sa RGB kaagad pagkatapos itong i-load.\n" ] }, { @@ -647,14 +647,14 @@ "source": [ "## Kunin ang Galaw gamit ang Optical Flow\n", "\n", - "Habang ang simpleng paghahambing ng dalawang magkasunod na frame ay nagpapakita ng dami ng pagbabago, hindi nito naipapakita kung ano talaga ang gumagalaw at kung saan. Upang makuha ang impormasyong iyon, may isang teknik na tinatawag na **[optical flow](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)**:\n", + "Habang ang simpleng paghahambing ng dalawang magkasunod na frame ay nagpapakita ng dami ng pagbabago, hindi nito ibinibigay ang impormasyon kung ano ang aktwal na gumagalaw at kung saan. Upang makuha ang impormasyong iyon, mayroong isang teknik na tinatawag na **[optical flow](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)**:\n", "\n", - "* **Dense Optical Flow** ay nagko-compute ng vector field na nagpapakita kung saan gumagalaw ang bawat pixel.\n", - "* **Sparse Optical Flow** ay nakabase sa pagkuha ng ilang natatanging tampok sa imahe (hal. mga gilid), at pagbuo ng kanilang trajectory mula frame hanggang frame.\n", + "* **Dense Optical Flow** ay nagko-compute ng vector field na nagpapakita kung saan gumagalaw ang bawat pixel\n", + "* **Sparse Optical Flow** ay nakabatay sa pagkuha ng ilang natatanging tampok sa imahe (hal. mga gilid), at pagbuo ng kanilang trajectory mula frame hanggang frame.\n", "\n", "Basahin pa ang tungkol sa optical flow [sa mahusay na tutorial na ito](https://learnopencv.com/optical-flow-in-opencv/).\n", "\n", - "Tara't i-compute ang dense optical flow sa pagitan ng ating mga frame:\n" + "Tukuyin natin ang dense optical flow sa pagitan ng ating mga frame:\n" ] }, { @@ -683,9 +683,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Tulad ng makikita mo, para sa bawat frame, ang flow ay may sukat na katumbas ng frame, at may 2 channels na tumutukoy sa x at y na mga bahagi ng optical flow vector.\n", + "Para sa bawat frame, ang daloy ay may sukat ng frame, at 2 channel na tumutugma sa x at y na bahagi ng optical flow vector.\n", "\n", - "Ang pagpapakita ng optical flow sa 2D ay medyo hamon, ngunit maaari tayong gumamit ng isang matalinong ideya. Kung iko-convert natin ang optical flow sa polar coordinates, makakakuha tayo ng dalawang bahagi para sa bawat pixel: *direksyon* at *intensidad*. Maaaring i-representa ang intensidad gamit ang pixel intensity, at ang direksyon naman gamit ang iba't ibang kulay. Lilikha tayo ng isang imahe sa [HSV (Hue-Saturation-Value) na color space](https://en.wikipedia.org/wiki/HSV_color_space), kung saan ang hue ay itatakda batay sa direksyon, ang value - batay sa intensidad, at ang saturation ay magiging 255.\n" + "Ang pagpapakita ng optical flow sa 2D ay medyo hamon, ngunit maaari tayong gumamit ng isang matalinong ideya. Kung iko-convert natin ang optical flow sa polar coordinates, makakakuha tayo ng dalawang bahagi para sa bawat pixel: *direksyon* at *intensidad*. Maaaring ipakita ang intensidad sa pamamagitan ng pixel intensity, at ang direksyon sa pamamagitan ng iba't ibang kulay. Lilikha tayo ng isang imahe sa [HSV (Hue-Saturation-Value) na color space](https://en.wikipedia.org/wiki/HSV_color_space), kung saan ang hue ay itatakda ng direksyon, ang value - ng intensidad, at ang saturation ay magiging 255.\n" ] }, { @@ -736,14 +736,14 @@ "source": [ "Kaya, sa mga frame na iyon, ang berdeng kulay ay tumutukoy sa paggalaw pakaliwa, habang ang asul naman ay sa paggalaw pakanan.\n", "\n", - "Ang optical flow ay maaaring maging mahusay na kasangkapan upang makagawa ng mga konklusyon tungkol sa pangkalahatang direksyon ng paggalaw. Halimbawa, kung makikita mo na ang lahat ng mga pixel sa isang frame ay gumagalaw sa halos iisang direksyon - maaari mong ipagpalagay na may paggalaw ng kamera, at subukang i-kompensate ito.\n" + "Ang optical flow ay maaaring maging mahusay na kasangkapan upang makakuha ng mga konklusyon tungkol sa pangkalahatang direksyon ng galaw. Halimbawa, kung makikita mo na ang lahat ng pixel sa isang frame ay gumagalaw sa halos iisang direksyon - maaari mong ipagpalagay na may galaw ang kamera, at subukang bumawi para dito.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**Paunawa**: \nAng dokumentong ito ay isinalin gamit ang AI translation service na [Co-op Translator](https://github.com/Azure/co-op-translator). Bagama't sinisikap naming maging tumpak, tandaan na ang mga awtomatikong pagsasalin ay maaaring maglaman ng mga pagkakamali o hindi pagkakatugma. Ang orihinal na dokumento sa kanyang katutubong wika ang dapat ituring na opisyal na sanggunian. Para sa mahalagang impormasyon, inirerekomenda ang propesyonal na pagsasalin ng tao. Hindi kami mananagot sa anumang hindi pagkakaunawaan o maling interpretasyon na maaaring magmula sa paggamit ng pagsasaling ito.\n" + "\n---\n\n**Paunawa**: \nAng dokumentong ito ay isinalin gamit ang AI translation service na [Co-op Translator](https://github.com/Azure/co-op-translator). Bagama't sinisikap naming maging tumpak, pakitandaan na ang mga awtomatikong pagsasalin ay maaaring maglaman ng mga pagkakamali o hindi pagkakatugma. Ang orihinal na dokumento sa kanyang orihinal na wika ang dapat ituring na opisyal na sanggunian. Para sa mahalagang impormasyon, inirerekomenda ang propesyonal na pagsasalin ng tao. Hindi kami mananagot sa anumang hindi pagkakaunawaan o maling interpretasyon na maaaring magmula sa paggamit ng pagsasaling ito.\n" ] } ], @@ -770,8 +770,8 @@ }, "orig_nbformat": 4, "coopTranslator": { - "original_hash": "ad5bdca62175c7a3d4336ef8c761aef3", - "translation_date": "2025-08-28T03:19:49+00:00", + "original_hash": "339b2129f86b24024393ff92b8bd376f", + "translation_date": "2025-09-07T15:14:36+00:00", "source_file": "lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb", "language_code": "tl" } diff --git a/translations/tr/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb b/translations/tr/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb index 360b6017..b995a322 100644 --- a/translations/tr/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb +++ b/translations/tr/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb @@ -6,7 +6,7 @@ "source": [ "# Bilgisayarlı Görü ve OpenCV\n", "\n", - "Bu not defteri, [AI for Beginners Müfredatı](http://aka.ms/ai-beginners) kapsamında yer almaktadır.\n", + "Bu not defteri [AI for Beginners Müfredatı](http://aka.ms/ai-beginners) kapsamında yer almaktadır.\n", "\n", "[OpenCV](https://opencv.org/) görüntü işleme için *de facto* standart olarak kabul edilir. C++ ile uygulanmış birçok faydalı algoritma içerir. OpenCV'yi Python üzerinden de çağırabilirsiniz.\n", "\n", @@ -44,7 +44,7 @@ "source": [ "## Görüntüleri Yükleme\n", "\n", - "Python'da görüntüler, NumPy dizileriyle kolayca temsil edilebilir. Örneğin, 320x200 piksel boyutunda bir gri tonlamalı görüntü, 200x320 boyutunda bir dizi olarak saklanır ve aynı boyuttaki bir renkli görüntü, 200x320x3 şeklinde bir boyuta sahip olur (3 renk kanalı için).\n", + "Python'da görüntüler, NumPy dizileriyle kolayca temsil edilebilir. Örneğin, 320x200 piksel boyutunda bir gri tonlamalı görüntü, 200x320 boyutunda bir dizide saklanır ve aynı boyuttaki bir renkli görüntü, 200x320x3 şeklinde bir yapıya sahip olur (3 renk kanalı için).\n", "\n", "Hadi bir görüntü yükleyerek başlayalım:\n" ] @@ -94,7 +94,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Gördüğünüz gibi, bu bir braille metni görüntüsü. Gerçek renklerle çok ilgilenmediğimiz için bunu siyah-beyaza dönüştürebiliriz:\n" + "Gördüğünüz gibi, bu bir braille metni görüntüsü. Gerçek renklerle çok ilgilenmediğimiz için, bunu siyah-beyaza çevirebiliriz:\n" ] }, { @@ -135,7 +135,7 @@ "source": [ "bw_im = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)\n", "print(bw_im.shape)\n", - "plt.imshow(bw_im)" + "plt.imshow(bw_im, cmap='gray')" ] }, { @@ -252,7 +252,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Bireysel karakterleri ayırmak için, tüm metnin sınırlayıcı kutusunu bilmemiz gerekir. Bunu bulmak için, sadece minimum ve maksimum koordinatları hesaplayabiliriz:\n" + "Bireysel karakterleri ayırmak için, tüm metnin sınır kutusunu bilmemiz gerekir. Bunu öğrenmek için, sadece minimum ve maksimum koordinatları hesaplayabiliriz:\n" ] }, { @@ -293,7 +293,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Ayrıca, bu metin kısmen döndürülebilir ve mükemmel şekilde hizalamak için **perspektif dönüşümü** yapmamız gerekir. $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ noktalarıyla tanımlanan bir dikdörtgen alacağız ve bunu orantılı boyutlara sahip yeni bir görüntüyle hizalayacağız:\n" + "Ayrıca, bu metin kısmen döndürülebilir ve mükemmel hizalamayı sağlamak için sözde **perspektif dönüşümü** yapmamız gerekir. $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ noktalarıyla tanımlanan bir dikdörtgen alacağız ve onu orantılı boyutlara sahip yeni bir görüntüyle hizalayacağız:\n" ] }, { @@ -340,7 +340,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Bu iyi hizalanmış görüntüyü elde ettikten sonra, onu parçalara ayırmak nispeten kolay olmalıdır:\n" + "Bu iyi hizalanmış görüntüyü aldıktan sonra, onu parçalara ayırmak nispeten kolay olmalıdır:\n" ] }, { @@ -384,20 +384,20 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Oldukça fazla görevin yapay zeka kullanmadan, yalnızca görüntü işleme ile yapılabileceğini gördünüz. Bir sinir ağının işini basitleştirmek için bilgisayarlı görü tekniklerini kullanabiliyorsak - kesinlikle bunu yapmalıyız, çünkü bu, daha az sayıda eğitim verisiyle problemleri çözmemizi sağlayacaktır.\n" + "Oldukça fazla görevin yapay zeka olmadan, yalnızca saf görüntü işleme kullanılarak yapılabileceğini gördünüz. Bir sinir ağının işini daha basit hale getirmek için bilgisayarlı görü tekniklerini kullanabiliyorsak - kesinlikle bunu yapmalıyız, çünkü bu, daha az sayıda eğitim verisiyle problemleri çözmemizi sağlayacaktır.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Çerçeve Farkı ile Hareket Algılama\n", + "## Kare Farkı Kullanarak Hareket Algılama\n", "\n", - "Video akışında hareket algılama oldukça sık yapılan bir görevdir. Örneğin, bir güvenlik kamerasında bir şey olduğunda uyarı almamızı sağlar. Kamerada neler olduğunu anlamak istiyorsak, bir sinir ağı kullanabiliriz - ancak bir şeylerin olduğunu bildiğimizde sinir ağı kullanmak çok daha ekonomiktir.\n", + "Video akışında hareket algılama oldukça sık yapılan bir görevdir. Örneğin, bir güvenlik kamerasında bir şey olduğunda uyarılar almamızı sağlar. Kamerada neler olduğunu anlamak istiyorsak, bir sinir ağı kullanabiliriz - ancak bir şeylerin olduğunu bildiğimizde sinir ağı kullanmak çok daha ekonomiktir.\n", "\n", - "Hareket algılamanın temel fikri basittir. Eğer kamera sabitse, kameradan gelen çerçeveler birbirine oldukça benzer olmalıdır. Çerçeveler diziler olarak temsil edildiğinden, ardışık iki çerçevenin dizilerini çıkararak piksel farkını elde edebiliriz. Bu fark, statik çerçeveler için düşük olmalı ve görüntüde önemli bir hareket olduğunda artmalıdır.\n", + "Hareket algılamanın temel fikri basittir. Eğer kamera sabitse, kameradan gelen kareler birbirine oldukça benzer olmalıdır. Kareler diziler olarak temsil edildiğinden, ardışık iki karenin dizilerini çıkardığımızda piksel farkını elde ederiz. Bu fark, statik kareler için düşük olur ve görüntüde önemli bir hareket olduğunda artar.\n", "\n", - "Bir videoyu nasıl açacağımızı ve bunu bir dizi çerçeveye nasıl dönüştüreceğimizi öğrenerek başlayacağız:\n" + "Bir videoyu nasıl açacağımızı ve onu bir dizi kareye nasıl dönüştüreceğimizi öğrenerek başlayacağız:\n" ] }, { @@ -445,7 +445,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Renk hareket algılama için çok önemli olmadığından, tüm kareleri gri tonlamaya dönüştüreceğiz. Daha sonra, kare farklarını hesaplayacak ve normlarını çizerek devam eden etkinlik miktarını görsel olarak göreceğiz:\n" + "Renk hareket algılama için çok önemli olmadığından, tüm kareleri gri tonlamaya dönüştüreceğiz. Daha sonra, kare farklarını hesaplayacak ve normlarını çizerek devam eden aktivitenin miktarını görsel olarak göreceğiz:\n" ] }, { @@ -490,7 +490,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Diyelim ki, kameranın önünde ne olduğunu gösteren bir rapor oluşturmak istiyoruz ve her seferinde uygun görüntüyü gösteriyoruz. Bunu yapmak için muhtemelen bir \"olayın\" başlangıç ve bitiş karelerini bulmak ve orta kareyi göstermek isteyeceğiz. Biraz gürültüyü ortadan kaldırmak için, yukarıdaki eğriyi hareketli ortalama fonksiyonu ile de düzleştireceğiz:\n" + "Diyelim ki, kameranın önünde ne olduğunu gösteren bir rapor oluşturmak istiyoruz ve her bir olay gerçekleştiğinde uygun görüntüyü gösteriyoruz. Bunu yapmak için muhtemelen bir \"olayın\" başlangıç ve bitiş karelerini bulmak ve orta kareyi göstermek istiyoruz. Biraz gürültüyü azaltmak için, yukarıdaki eğriyi hareketli ortalama fonksiyonu ile de düzleştireceğiz:\n" ] }, { @@ -610,7 +610,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Bu görüntüdeki renk düzeninin doğru görünmediğini fark edebilirsiniz! Bunun nedeni, OpenCV'nin tarihsel nedenlerle görüntüleri BGR renk uzayında yüklemesi, matplotlib'in ise daha geleneksel olan RGB renk sırasını kullanmasıdır. Çoğu zaman, görüntüleri yükledikten hemen sonra RGB'ye dönüştürmek mantıklıdır.\n" + "Bu görüntüdeki renk şemasının doğru görünmediğini fark edebilirsiniz! Bunun nedeni, OpenCV'nin tarihsel nedenlerle görüntüleri BGR renk uzayında yüklemesi, oysa matplotlib'in daha geleneksel olan RGB renk sırasını kullanmasıdır. Çoğu zaman, görüntüleri yükledikten hemen sonra RGB'ye dönüştürmek mantıklıdır.\n" ] }, { @@ -651,12 +651,12 @@ "source": [ "## Optik Akış Kullanarak Hareketi Çıkarın\n", "\n", - "Sadece iki ardışık kareyi karşılaştırmak, değişim miktarını görmemizi sağlar, ancak aslında neyin hareket ettiğini ve nerede olduğunu bize söylemez. Bu bilgiyi elde etmek için **[optik akış](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)** adı verilen bir teknik vardır:\n", + "Sadece iki ardışık kareyi karşılaştırmak, değişim miktarını görmemizi sağlar, ancak aslında neyin hareket ettiğini ve nerede olduğunu hakkında bilgi vermez. Bu bilgiyi elde etmek için **[optik akış](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)** adı verilen bir teknik vardır:\n", "\n", - "* **Yoğun Optik Akış**, her pikselin nereye hareket ettiğini gösteren vektör alanını hesaplar.\n", + "* **Yoğun Optik Akış**, her bir pikselin nereye hareket ettiğini gösteren vektör alanını hesaplar. \n", "* **Seyrek Optik Akış**, görüntüdeki bazı belirgin özellikleri (örneğin, kenarlar) alır ve bunların kareden kareye olan hareket yolunu oluşturur.\n", "\n", - "Optik akış hakkında daha fazla bilgi için [bu harika eğiticiye](https://learnopencv.com/optical-flow-in-opencv/) göz atın.\n", + "Optik akış hakkında daha fazla bilgi için [bu harika eğiticiye](https://learnopencv.com/optical-flow-in-opencv/) göz atabilirsiniz.\n", "\n", "Şimdi karelerimiz arasında yoğun optik akışı hesaplayalım:\n" ] @@ -687,9 +687,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Her bir kare için, akışın kare boyutunda olduğunu ve optik akış vektörünün x ve y bileşenlerine karşılık gelen 2 kanala sahip olduğunu görebilirsiniz.\n", + "Her bir kare için, akışın, karenin boyutlarına ve optik akış vektörünün x ve y bileşenlerine karşılık gelen 2 kanala sahip olduğunu görebilirsiniz.\n", "\n", - "Optik akışı 2D olarak göstermek biraz zorlu olabilir, ancak akıllıca bir fikir kullanabiliriz. Optik akışı kutupsal koordinatlara dönüştürürsek, her piksel için iki bileşen elde ederiz: *yön* ve *şiddet*. Şiddeti piksel yoğunluğu ile, yönü ise farklı renklerle temsil edebiliriz. [HSV (Ton-Doygunluk-Değer) renk uzayı](https://en.wikipedia.org/wiki/HSV_color_space) içinde bir görüntü oluşturacağız; burada ton yön tarafından, değer şiddet tarafından ve doygunluk 255 olarak tanımlanacak.\n" + "Optik akışı 2D olarak göstermek biraz zordur, ancak akıllıca bir fikir kullanabiliriz. Optik akışı kutupsal koordinatlara çevirirsek, her piksel için iki bileşen elde ederiz: *yön* ve *şiddet*. Şiddeti piksel yoğunluğu ile, yönü ise farklı renklerle temsil edebiliriz. [HSV (Ton-Doygunluk-Değer) renk uzayında](https://en.wikipedia.org/wiki/HSV_color_space) bir görüntü oluşturacağız; burada ton yön tarafından, değer şiddet tarafından ve doygunluk ise 255 olarak tanımlanacak.\n" ] }, { @@ -740,14 +740,14 @@ "source": [ "Bu çerçevelerde yeşilimsi renk sola hareketi, mavi ise sağa hareketi ifade eder.\n", "\n", - "Optik akış, genel hareket yönü hakkında sonuçlar çıkarmak için harika bir araç olabilir. Örneğin, bir çerçevedeki tüm piksellerin aşağı yukarı tek bir yönde hareket ettiğini görürseniz, kamera hareketi olduğunu çıkarabilir ve bunu telafi etmeye çalışabilirsiniz.\n" + "Optik akış, genel hareket yönü hakkında çıkarımlar yapmak için harika bir araç olabilir. Örneğin, bir çerçevedeki tüm piksellerin aşağı yukarı aynı yönde hareket ettiğini görürseniz, kamera hareketi olduğunu çıkarabilir ve bunu telafi etmeye çalışabilirsiniz.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**Feragatname**: \nBu belge, AI çeviri hizmeti [Co-op Translator](https://github.com/Azure/co-op-translator) kullanılarak çevrilmiştir. Doğruluk için çaba göstersek de, otomatik çevirilerin hata veya yanlışlıklar içerebileceğini lütfen unutmayın. Belgenin orijinal dili, yetkili kaynak olarak kabul edilmelidir. Kritik bilgiler için profesyonel insan çevirisi önerilir. Bu çevirinin kullanımından kaynaklanan yanlış anlamalar veya yanlış yorumlamalardan sorumlu değiliz.\n" + "\n---\n\n**Feragatname**: \nBu belge, [Co-op Translator](https://github.com/Azure/co-op-translator) adlı yapay zeka çeviri hizmeti kullanılarak çevrilmiştir. Doğruluk için çaba göstersek de, otomatik çevirilerin hata veya yanlışlıklar içerebileceğini lütfen unutmayın. Belgenin orijinal dili, yetkili kaynak olarak kabul edilmelidir. Kritik bilgiler için profesyonel insan çevirisi önerilir. Bu çevirinin kullanımından kaynaklanan yanlış anlama veya yanlış yorumlamalardan sorumlu değiliz.\n" ] } ], @@ -774,8 +774,8 @@ }, "orig_nbformat": 4, "coopTranslator": { - "original_hash": "ad5bdca62175c7a3d4336ef8c761aef3", - "translation_date": "2025-08-28T13:14:33+00:00", + "original_hash": "339b2129f86b24024393ff92b8bd376f", + "translation_date": "2025-09-07T15:05:40+00:00", "source_file": "lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb", "language_code": "tr" } diff --git a/translations/tw/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb b/translations/tw/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb index ab59f68a..9a407b1c 100644 --- a/translations/tw/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb +++ b/translations/tw/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb @@ -44,7 +44,7 @@ "source": [ "## 加載圖片\n", "\n", - "在 Python 中,圖片可以方便地用 NumPy 陣列來表示。例如,大小為 320x200 像素的灰度圖片會存儲在 200x320 的陣列中,而相同尺寸的彩色圖片則會有 200x320x3 的形狀(代表 3 個色彩通道)。\n", + "在 Python 中,圖片可以方便地用 NumPy 陣列來表示。例如,尺寸為 320x200 像素的灰度圖片會存儲在一個 200x320 的陣列中,而相同尺寸的彩色圖片則會有 200x320x3 的形狀(代表 3 個色彩通道)。\n", "\n", "我們先從加載一張圖片開始:\n" ] @@ -94,7 +94,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "如您所見,這是一張盲文的圖片。由於我們對實際顏色並不太感興趣,因此我們可以將其轉換為黑白:\n" + "正如你所見,這是一張點字的圖片。由於我們對實際顏色不是很感興趣,我們可以將其轉換為黑白:\n" ] }, { @@ -135,7 +135,7 @@ "source": [ "bw_im = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)\n", "print(bw_im.shape)\n", - "plt.imshow(bw_im)" + "plt.imshow(bw_im, cmap='gray')" ] }, { @@ -144,7 +144,7 @@ "source": [ "## 點字影像處理\n", "\n", - "如果我們想要應用影像分類來辨識文字,就需要將每個符號分割出來,使其看起來像我們之前見過的 MNIST 圖像。這可以使用 [物件偵測](../11-ObjectDetection/README.md) 技術來完成,我們稍後會討論這部分,但我們也可以嘗試使用純粹的電腦視覺來達成。關於如何使用電腦視覺進行字符分割的良好描述可以在 [這篇部落格文章](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) 中找到——我們在這裡只會專注於一些電腦視覺技術。\n", + "如果我們想要應用影像分類來辨識文字,我們需要將每個符號分割出來,使其看起來類似於我們之前見過的 MNIST 圖像。這可以使用 [物件偵測](../11-ObjectDetection/README.md) 技術來完成,我們稍後會討論這部分,但我們也可以嘗試使用純粹的電腦視覺來達成。關於如何使用電腦視覺進行字符分割的良好描述可以在 [這篇部落格文章](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) 中找到——我們在這裡只會專注於一些電腦視覺技術。\n", "\n", "首先,讓我們嘗試稍微增強影像。我們可以使用 **閾值處理** 的概念(在 [這篇 OpenCV 文章](https://docs.opencv.org/4.x/d7/d4d/tutorial_py_thresholding.html) 中有詳細描述):\n" ] @@ -252,7 +252,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "要分隔個別字符,我們需要知道整段文字的邊界框。為了找出邊界框,我們只需計算最小和最大座標:\n" + "要分隔單個字符,我們需要知道整段文字的邊界框。為了找出它,我們可以只計算最小和最大座標:\n" ] }, { @@ -340,7 +340,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "在我們獲得這個對齊良好的圖像後,將其切成片應該相對容易:\n" + "在我們獲得這張對齊良好的圖像後,將其切割成多個部分應該相對容易:\n" ] }, { @@ -393,9 +393,9 @@ "source": [ "## 使用幀差進行動作偵測\n", "\n", - "在視頻流中偵測動作是一項非常常見的任務。例如,當監控攝像機上有事情發生時,它可以讓我們收到警報。如果我們想了解攝像機上發生了什麼,可以使用神經網絡進行分析——但當我們知道有事情正在發生時,使用神經網絡的成本會更低。\n", + "在視頻流中偵測動作是一項非常常見的任務。例如,當監控攝像機上有事情發生時,我們可以收到警報。如果我們想了解攝像機上發生了什麼,可以使用神經網絡進行分析——但當我們知道有事情正在發生時,使用神經網絡的成本會更低。\n", "\n", - "動作偵測的主要概念很簡單。如果攝像機是固定的,那麼攝像機捕捉的幀應該彼此非常相似。由於幀是以陣列形式表示的,只需對兩個連續幀的陣列進行相減,就能得到像素差異。對於靜態幀,像素差異應該很低,而當圖像中有明顯的動作時,像素差異就會變高。\n", + "動作偵測的主要概念非常簡單。如果攝像機是固定的,那麼攝像機捕捉的幀應該彼此非常相似。由於幀是以陣列的形式表示的,只需將兩個連續幀的陣列相減,我們就能得到像素差異。對於靜態幀,像素差異應該很低,而當圖像中有明顯的動作時,像素差異會變高。\n", "\n", "我們將從學習如何打開視頻並將其轉換為幀序列開始:\n" ] @@ -445,7 +445,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "由於顏色對於動作檢測並不重要,我們將所有幀轉換為灰階。然後,我們將計算幀差異,並繪製它們的範數以直觀地查看活動量:\n" + "由於顏色對於運動檢測並不是那麼重要,我們將把所有幀轉換為灰階。然後,我們將計算幀差異,並繪製它們的範數,以直觀地查看正在進行的活動量:\n" ] }, { @@ -490,7 +490,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "假設我們想要製作一份報告,通過顯示每次發生事件時的適當圖像來展示鏡頭前發生的事情。為了做到這一點,我們可能需要找出「事件」的開始和結束幀,並顯示中間幀。為了去除一些噪音,我們還將使用移動平均函數來平滑上方的曲線:\n" + "假設我們想要製作一份報告,通過顯示每次事件發生時的適當圖像來展示攝像機前發生的事情。為此,我們可能需要找出一個「事件」的開始和結束幀,並顯示中間幀。為了去除一些噪音,我們還將使用移動平均函數來平滑上方的曲線:\n" ] }, { @@ -535,7 +535,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "現在我們可以使用 `np.where` 找出變化量超過閾值的幀,並提取長度超過30幀的連續幀序列:\n" + "現在我們可以使用 `np.where` 找出變化量超過閾值的幀,並提取長度超過 30 幀的連續幀序列:\n" ] }, { @@ -610,7 +610,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "您可能會注意到這張圖片的色彩方案看起來不正確!這是因為 OpenCV 出於歷史原因以 BGR 色彩空間載入圖片,而 matplotlib 使用更傳統的 RGB 色彩順序。大多數情況下,在載入圖片後立即將其轉換為 RGB 是合理的。\n" + "您可能會注意到這張圖片的色彩方案看起來不正確!這是因為 OpenCV 出於歷史原因以 BGR 色彩空間加載圖片,而 matplotlib 使用更傳統的 RGB 色彩順序。大多數情況下,在加載圖片後立即將其轉換為 RGB 是有意義的。\n" ] }, { @@ -653,10 +653,10 @@ "\n", "僅僅比較兩個連續的影格可以讓我們看到變化的程度,但無法提供實際移動的物體以及其位置的資訊。為了獲得這些資訊,有一種技術叫做 **[光流](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)**:\n", "\n", - "* **密集光流** 計算每個像素的向量場,顯示它的移動方向\n", + "* **密集光流** 計算每個像素的向量場,顯示其移動方向\n", "* **稀疏光流** 則基於圖像中的一些顯著特徵(例如邊緣),並從影格到影格建立它們的軌跡。\n", "\n", - "可以在[這篇精彩的教程](https://learnopencv.com/optical-flow-in-opencv/)中了解更多關於光流的內容。\n", + "可以在這篇[精彩的教程](https://learnopencv.com/optical-flow-in-opencv/)中了解更多關於光流的內容。\n", "\n", "接下來,我們來計算影格之間的密集光流:\n" ] @@ -687,9 +687,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "如你所見,每個框架的光流具有與框架相同的維度,並包含兩個通道,分別對應於光流向量的 x 和 y 分量。\n", + "如你所見,每個框架的光流具有框架的尺寸,並且包含兩個通道,分別對應光流向量的 x 和 y 分量。\n", "\n", - "在 2D 中顯示光流有些挑戰,但我們可以使用一個巧妙的想法。如果我們將光流轉換為極座標,那麼每個像素將會有兩個分量:*方向* 和 *強度*。我們可以用像素的亮度來表示強度,用不同的顏色來表示方向。我們將創建一個 [HSV(色相-飽和度-明度)色彩空間](https://en.wikipedia.org/wiki/HSV_color_space) 的圖像,其中色相由方向定義,明度由強度定義,而飽和度固定為 255。\n" + "在 2D 中顯示光流有些挑戰,但我們可以使用一個巧妙的想法。如果我們將光流轉換為極座標,那麼每個像素就會有兩個分量:*方向* 和 *強度*。我們可以用像素的亮度來表示強度,用不同的顏色來表示方向。我們將創建一個 [HSV(色相-飽和度-亮度)色彩空間](https://en.wikipedia.org/wiki/HSV_color_space) 的圖像,其中色相由方向定義,亮度由強度定義,而飽和度則設為 255。\n" ] }, { @@ -738,16 +738,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "所以,在這些畫面中,綠色代表向左移動,而藍色則代表向右移動。\n", + "在這些畫面中,綠色代表向左移動,而藍色則代表向右移動。\n", "\n", - "光流是一個很棒的工具,可以用來推斷整體的移動方向。例如,如果你看到畫面中的所有像素大致上都朝著一個方向移動,你可以推斷這是因為相機在移動,並嘗試進行補償。\n" + "光流是一個非常有用的工具,可以用來推斷整體的移動方向。例如,如果你看到畫面中的所有像素大致上都朝著同一個方向移動,你可以推斷這是相機的移動,並嘗試進行補償。\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**免責聲明**: \n本文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。儘管我們致力於提供準確的翻譯,請注意自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於關鍵資訊,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或誤釋不承擔責任。\n" + "\n---\n\n**免責聲明**: \n本文件使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。應以原始語言的文件作為權威來源。對於關鍵資訊,建議尋求專業人工翻譯。我們對因使用此翻譯而產生的任何誤解或錯誤解讀概不負責。\n" ] } ], @@ -774,8 +774,8 @@ }, "orig_nbformat": 4, "coopTranslator": { - "original_hash": "ad5bdca62175c7a3d4336ef8c761aef3", - "translation_date": "2025-08-31T09:47:45+00:00", + "original_hash": "339b2129f86b24024393ff92b8bd376f", + "translation_date": "2025-09-07T14:56:49+00:00", "source_file": "lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb", "language_code": "tw" } diff --git a/translations/uk/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb b/translations/uk/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb index 61136c81..404d9277 100644 --- a/translations/uk/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb +++ b/translations/uk/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb @@ -4,15 +4,15 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Комп'ютерний зір та OpenCV\n", + "# Комп'ютерне бачення та OpenCV\n", "\n", - "Цей ноутбук є частиною [Курсу для початківців з ШІ](http://aka.ms/ai-beginners).\n", + "Цей ноутбук є частиною [AI for Beginners Curriculum](http://aka.ms/ai-beginners).\n", "\n", - "[OpenCV](https://opencv.org/) вважається *де-факто* стандартом для обробки зображень. Він містить багато корисних алгоритмів, реалізованих на C++. Ви також можете використовувати OpenCV у Python.\n", + "[OpenCV](https://opencv.org/) вважається стандартом *де-факто* для обробки зображень. Він містить багато корисних алгоритмів, реалізованих на C++. Ви також можете використовувати OpenCV з Python.\n", "\n", - "У цьому ноутбуці ми покажемо кілька прикладів використання OpenCV. Для отримання додаткової інформації ви можете відвідати онлайн-курс [Learn OpenCV](https://learnopencv.com/getting-started-with-opencv/).\n", + "У цьому ноутбуці ми наведемо кілька прикладів використання OpenCV. Для отримання додаткової інформації ви можете відвідати онлайн-курс [Learn OpenCV](https://learnopencv.com/getting-started-with-opencv/).\n", "\n", - "Спочатку давайте `імпортуємо cv2`, а також деякі інші корисні бібліотеки:\n" + "Спочатку давайте `import cv2`, а також деякі інші корисні бібліотеки:\n" ] }, { @@ -44,7 +44,7 @@ "source": [ "## Завантаження зображень\n", "\n", - "Зображення в Python зручно представляти у вигляді масивів NumPy. Наприклад, зображення у відтінках сірого розміром 320x200 пікселів буде зберігатися у масиві розміром 200x320, а кольорове зображення тих самих розмірів матиме форму 200x320x3 (для 3 кольорових каналів).\n", + "Зображення в Python зручно представляти у вигляді масивів NumPy. Наприклад, зображення у відтінках сірого розміром 320x200 пікселів буде зберігатися у вигляді масиву розміром 200x320, а кольорове зображення тих самих розмірів матиме форму 200x320x3 (для трьох кольорових каналів).\n", "\n", "Давайте почнемо із завантаження зображення:\n" ] @@ -135,7 +135,7 @@ "source": [ "bw_im = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)\n", "print(bw_im.shape)\n", - "plt.imshow(bw_im)" + "plt.imshow(bw_im, cmap='gray')" ] }, { @@ -144,9 +144,9 @@ "source": [ "## Обробка зображень шрифту Брайля\n", "\n", - "Якщо ми хочемо застосувати класифікацію зображень для розпізнавання тексту, нам потрібно вирізати окремі символи, щоб зробити їх схожими на зображення MNIST, які ми бачили раніше. Це можна зробити за допомогою техніки [виявлення об'єктів](../11-ObjectDetection/README.md), яку ми обговоримо пізніше, але також можна спробувати використати чисте комп'ютерне бачення для цього. Хороший опис того, як комп'ютерне бачення може бути використане для розділення символів, можна знайти [у цьому блозі](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) - ми зосередимося лише на деяких техніках комп'ютерного бачення тут.\n", + "Якщо ми хочемо застосувати класифікацію зображень для розпізнавання тексту, нам потрібно вирізати окремі символи, щоб зробити їх схожими на зображення MNIST, які ми бачили раніше. Це можна зробити за допомогою техніки [виявлення об'єктів](../11-ObjectDetection/README.md), яку ми обговоримо пізніше, але також можна спробувати використати для цього чисте комп'ютерне бачення. Гарний опис того, як комп'ютерне бачення може бути використане для розділення символів, можна знайти [у цьому блозі](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) - ми зосередимося тут лише на деяких техніках комп'ютерного бачення.\n", "\n", - "Спочатку спробуємо трохи покращити зображення. Ми можемо використати ідею **порогу** (добре описану [у цій статті OpenCV](https://docs.opencv.org/4.x/d7/d4d/tutorial_py_thresholding.html)):\n" + "Спочатку спробуємо трохи покращити зображення. Ми можемо використати ідею **порогової обробки** (добре описану [в цій статті OpenCV](https://docs.opencv.org/4.x/d7/d4d/tutorial_py_thresholding.html)):\n" ] }, { @@ -192,7 +192,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Щоб працювати із зображеннями, нам потрібно \"витягнути\" окремі точки, тобто перетворити зображення на набір координат окремих точок. Ми можемо зробити це за допомогою технік **витягування ознак**, таких як SIFT, SURF або [ORB](https://docs.opencv.org/4.x/d1/d89/tutorial_py_orb.html):\n" + "Щоб працювати із зображеннями, нам потрібно \"витягти\" окремі точки, тобто перетворити зображення на набір координат окремих точок. Ми можемо зробити це за допомогою технік **виділення ознак**, таких як SIFT, SURF або [ORB](https://docs.opencv.org/4.x/d1/d89/tutorial_py_orb.html):\n" ] }, { @@ -252,7 +252,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Щоб відокремити окремі символи, нам потрібно знати межі всього тексту. Щоб їх знайти, ми можемо просто обчислити мінімальні та максимальні координати:\n" + "Щоб відокремити окремі символи, нам потрібно знати обмежувальну рамку всього тексту. Щоб дізнатися її, ми можемо просто обчислити мінімальні та максимальні координати:\n" ] }, { @@ -293,7 +293,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Також цей текст може бути частково повернутий, і для того, щоб зробити його ідеально вирівняним, нам потрібно виконати так зване **перспективне перетворення**. Ми візьмемо прямокутник, визначений точками $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ і вирівняємо його з новим зображенням із пропорційними розмірами:\n" + "Крім того, цей текст може бути частково повернутий, і для того, щоб зробити його ідеально вирівняним, нам потрібно виконати так зване **перспективне перетворення**. Ми візьмемо прямокутник, визначений точками $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ і вирівняємо його з новим зображенням із пропорційними розмірами:\n" ] }, { @@ -340,7 +340,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Після того, як ми отримаємо добре вирівняне зображення, його має бути відносно легко розрізати на частини:\n" + "Після того, як ми отримаємо це добре вирівняне зображення, його має бути відносно легко розрізати на частини:\n" ] }, { @@ -391,11 +391,11 @@ "source": [ "## Виявлення руху за допомогою різниці кадрів\n", "\n", - "Виявлення руху на відеопотоці є дуже поширеним завданням. Наприклад, це дозволяє отримувати сповіщення, коли щось відбувається на камері спостереження. Якщо ми хочемо зрозуміти, що саме відбувається на камері, можна використати нейронну мережу — але це набагато дешевше, якщо використовувати нейронну мережу лише тоді, коли ми знаємо, що щось відбувається.\n", + "Виявлення руху на відеопотоці є дуже поширеним завданням. Наприклад, це дозволяє отримувати сповіщення, коли щось відбувається на камері спостереження. Якщо ми хочемо зрозуміти, що саме відбувається на камері, можна використати нейронну мережу — але це значно дешевше, якщо використовувати нейронну мережу лише тоді, коли ми знаємо, що щось відбувається.\n", "\n", - "Основна ідея виявлення руху проста. Якщо камера зафіксована, то кадри з камери повинні бути досить схожими один на одного. Оскільки кадри представлені у вигляді масивів, просто віднімаючи ці масиви для двох послідовних кадрів, ми отримаємо різницю пікселів, яка повинна бути низькою для статичних кадрів і ставати вищою, коли в зображенні відбувається значний рух.\n", + "Основна ідея виявлення руху проста. Якщо камера зафіксована, то кадри з камери мають бути досить схожими один на одного. Оскільки кадри представлені у вигляді масивів, просто віднімаючи ці масиви для двох послідовних кадрів, ми отримаємо різницю пікселів, яка буде низькою для статичних кадрів і зростатиме, коли на зображенні відбувається значний рух.\n", "\n", - "Ми почнемо з того, як відкрити відео та перетворити його на послідовність кадрів:\n" + "Ми почнемо з того, щоб навчитися відкривати відео та перетворювати його на послідовність кадрів:\n" ] }, { @@ -443,7 +443,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Оскільки колір не є таким важливим для виявлення руху, ми перетворимо всі кадри в градації сірого. Потім ми обчислимо різниці між кадрами і побудуємо їх норми, щоб візуально побачити кількість активності:\n" + "Оскільки колір не є таким важливим для виявлення руху, ми перетворимо всі кадри в відтінки сірого. Потім ми обчислимо різниці між кадрами та побудуємо графік їх норм, щоб візуально побачити кількість активності:\n" ] }, { @@ -488,7 +488,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Припустимо, ми хочемо створити звіт, який показує, що відбувалося перед камерою, демонструючи відповідне зображення кожного разу, коли щось трапляється. Для цього, ймовірно, потрібно визначити початковий і кінцевий кадр \"події\" та показати середній кадр. Щоб прибрати деякий шум, ми також згладимо криву вище за допомогою функції ковзного середнього:\n" + "Припустимо, ми хочемо створити звіт, який показує, що відбувалося перед камерою, відображаючи відповідне зображення кожного разу, коли щось трапляється. Для цього, ймовірно, потрібно визначити початковий і кінцевий кадр \"події\" та відобразити середній кадр. Щоб зменшити шум, ми також згладимо криву вище за допомогою функції ковзного середнього:\n" ] }, { @@ -606,7 +606,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Ви можете помітити, що колірна схема на цьому зображенні виглядає неправильно! Це тому, що OpenCV з історичних причин завантажує зображення в колірному просторі BGR, тоді як matplotlib використовує більш традиційний порядок кольорів RGB. У більшості випадків має сенс конвертувати зображення в RGB одразу після їх завантаження.\n" + "Ви можете помітити, що колірна схема на цьому зображенні виглядає неправильно! Це тому, що OpenCV з історичних причин завантажує зображення в колірному просторі BGR, тоді як matplotlib використовує більш традиційний порядок кольорів RGB. У більшості випадків має сенс конвертувати зображення в RGB одразу після завантаження.\n" ] }, { @@ -650,7 +650,7 @@ "Просте порівняння двох послідовних кадрів дозволяє побачити кількість змін, але не дає інформації про те, що саме рухається і де. Для отримання цієї інформації існує техніка, яка називається **[оптичний потік](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)**:\n", "\n", "* **Щільний оптичний потік** обчислює векторне поле, яке показує, куди рухається кожен піксель.\n", - "* **Рідкісний оптичний потік** базується на виборі деяких характерних особливостей зображення (наприклад, країв) і побудові їх траєкторії від кадру до кадру.\n", + "* **Рідкісний оптичний потік** базується на виборі деяких характерних особливостей зображення (наприклад, країв) і побудові їхньої траєкторії від кадру до кадру.\n", "\n", "Детальніше про оптичний потік можна прочитати [у цьому чудовому підручнику](https://learnopencv.com/optical-flow-in-opencv/).\n", "\n", @@ -683,9 +683,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Як ви можете бачити, для кожного кадру потік має розмірність кадру та 2 канали, які відповідають x та y компонентам вектора оптичного потоку.\n", + "Як ви можете бачити, для кожного кадру потік має розмірність кадру та 2 канали, які відповідають x і y компонентам вектора оптичного потоку.\n", "\n", - "Відображення оптичного потоку у 2D є трохи складним завданням, але ми можемо використати одну цікаву ідею. Якщо ми перетворимо оптичний потік у полярні координати, то отримаємо два компоненти для кожного пікселя: *напрямок* і *інтенсивність*. Ми можемо представити інтенсивність через яскравість пікселя, а напрямок — через різні кольори. Ми створимо зображення у [HSV (Hue-Saturation-Value) кольоровому просторі](https://en.wikipedia.org/wiki/HSV_color_space), де відтінок (hue) буде визначатися напрямком, значення (value) — інтенсивністю, а насиченість (saturation) буде дорівнювати 255.\n" + "Відображення оптичного потоку у 2D є трохи складним завданням, але ми можемо використати одну цікаву ідею. Якщо ми перетворимо оптичний потік у полярні координати, то отримаємо два компоненти для кожного пікселя: *напрямок* і *інтенсивність*. Ми можемо представити інтенсивність через яскравість пікселя, а напрямок — через різні кольори. Ми створимо зображення у [HSV (відтінок-насищеність-значення) кольоровому просторі](https://en.wikipedia.org/wiki/HSV_color_space), де відтінок буде визначатися напрямком, значення — інтенсивністю, а насиченість буде дорівнювати 255.\n" ] }, { @@ -743,7 +743,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**Відмова від відповідальності**: \nЦей документ був перекладений за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, будь ласка, майте на увазі, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ на його рідній мові слід вважати авторитетним джерелом. Для критичної інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникають внаслідок використання цього перекладу.\n" + "\n---\n\n**Відмова від відповідальності**: \nЦей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу.\n" ] } ], @@ -770,8 +770,8 @@ }, "orig_nbformat": 4, "coopTranslator": { - "original_hash": "ad5bdca62175c7a3d4336ef8c761aef3", - "translation_date": "2025-08-30T09:20:32+00:00", + "original_hash": "339b2129f86b24024393ff92b8bd376f", + "translation_date": "2025-09-07T15:23:15+00:00", "source_file": "lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb", "language_code": "uk" } diff --git a/translations/ur/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb b/translations/ur/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb index c8fa72a0..153ceeca 100644 --- a/translations/ur/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb +++ b/translations/ur/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb @@ -12,7 +12,7 @@ "\n", "اس نوٹ بک میں، ہم آپ کو OpenCV استعمال کرنے کے کچھ مثالیں دیں گے۔ مزید تفصیلات کے لیے، آپ [Learn OpenCV](https://learnopencv.com/getting-started-with-opencv/) آن لائن کورس دیکھ سکتے ہیں۔\n", "\n", - "سب سے پہلے، آئیے `cv2` کو امپورٹ کریں، اور ساتھ ہی کچھ دیگر مفید لائبریریاں بھی:\n" + "سب سے پہلے، آئیے `cv2` کو امپورٹ کریں، اور کچھ دیگر مفید لائبریریاں بھی شامل کریں:\n" ] }, { @@ -44,7 +44,7 @@ "source": [ "## تصاویر لوڈ کرنا\n", "\n", - "Python میں تصاویر کو آسانی سے NumPy arrays کے ذریعے ظاہر کیا جا سکتا ہے۔ مثال کے طور پر، 320x200 پکسلز کی سائز والی grayscale تصویر کو 200x320 array میں محفوظ کیا جائے گا، اور اسی سائز کی رنگین تصویر کی شکل 200x320x3 ہوگی (3 رنگ چینلز کے لیے)۔\n", + "Python میں تصاویر کو آسانی سے NumPy arrays کے ذریعے ظاہر کیا جا سکتا ہے۔ مثال کے طور پر، 320x200 پکسلز کی سائز والی grayscale تصویر 200x320 array میں محفوظ کی جائے گی، اور اسی سائز کی رنگین تصویر کا شکل 200x320x3 ہوگا (3 رنگ چینلز کے لیے)۔\n", "\n", "چلیں ایک تصویر لوڈ کرنے سے شروع کرتے ہیں:\n" ] @@ -94,7 +94,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "جیسا کہ آپ دیکھ سکتے ہیں، یہ بریل متن کی تصویر ہے۔ چونکہ ہم اصل رنگ میں زیادہ دلچسپی نہیں رکھتے، ہم اسے سیاہ اور سفید میں تبدیل کر سکتے ہیں۔\n" + "جیسا کہ آپ دیکھ سکتے ہیں، یہ بریل متن کی ایک تصویر ہے۔ چونکہ ہم اصل رنگ میں زیادہ دلچسپی نہیں رکھتے، ہم اسے سیاہ اور سفید میں تبدیل کر سکتے ہیں:\n" ] }, { @@ -135,7 +135,7 @@ "source": [ "bw_im = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)\n", "print(bw_im.shape)\n", - "plt.imshow(bw_im)" + "plt.imshow(bw_im, cmap='gray')" ] }, { @@ -144,9 +144,9 @@ "source": [ "## بریل امیج پروسیسنگ\n", "\n", - "اگر ہم متن کو پہچاننے کے لیے امیج کلاسیفکیشن کا اطلاق کرنا چاہتے ہیں، تو ہمیں انفرادی علامات کو کاٹ کر MNIST تصاویر جیسا بنانا ہوگا جو ہم پہلے دیکھ چکے ہیں۔ یہ کام [آبجیکٹ ڈیٹیکشن](../11-ObjectDetection/README.md) تکنیک کے ذریعے کیا جا سکتا ہے، جس پر ہم بعد میں بات کریں گے، لیکن ہم خالص کمپیوٹر وژن کا استعمال کرنے کی بھی کوشش کر سکتے ہیں۔ کمپیوٹر وژن کو کرداروں کو الگ کرنے کے لیے کیسے استعمال کیا جا سکتا ہے، اس کی ایک اچھی وضاحت [اس بلاگ پوسٹ](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) میں موجود ہے - یہاں ہم صرف کچھ کمپیوٹر وژن تکنیکوں پر توجہ مرکوز کریں گے۔\n", + "اگر ہم تصویر کی درجہ بندی کو متن پہچاننے کے لیے استعمال کرنا چاہتے ہیں، تو ہمیں انفرادی علامات کو کاٹنا ہوگا تاکہ وہ MNIST تصاویر کے مشابہ ہوں جو ہم پہلے دیکھ چکے ہیں۔ یہ [آبجیکٹ ڈیٹیکشن](../11-ObjectDetection/README.md) تکنیک کے ذریعے کیا جا سکتا ہے جس پر ہم بعد میں بات کریں گے، لیکن ہم اس کے لیے خالص کمپیوٹر وژن کا استعمال کرنے کی بھی کوشش کر سکتے ہیں۔ کمپیوٹر وژن کو کرداروں کی علیحدگی کے لیے کیسے استعمال کیا جا سکتا ہے اس کی ایک اچھی وضاحت [اس بلاگ پوسٹ](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) میں مل سکتی ہے - ہم یہاں صرف کچھ کمپیوٹر وژن تکنیکوں پر توجہ مرکوز کریں گے۔\n", "\n", - "سب سے پہلے، آئیے تصویر کو تھوڑا بہتر بنانے کی کوشش کرتے ہیں۔ ہم **تھریشولڈنگ** کے تصور کا استعمال کر سکتے ہیں (جو [اس OpenCV مضمون](https://docs.opencv.org/4.x/d7/d4d/tutorial_py_thresholding.html) میں اچھی طرح بیان کیا گیا ہے):\n" + "سب سے پہلے، آئیے تصویر کو تھوڑا سا بہتر کرنے کی کوشش کرتے ہیں۔ ہم **تھریشولڈنگ** کے خیال کو استعمال کر سکتے ہیں (اچھی طرح سے بیان کیا گیا [اس OpenCV آرٹیکل](https://docs.opencv.org/4.x/d7/d4d/tutorial_py_thresholding.html) میں):\n" ] }, { @@ -192,7 +192,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "تصاویر کے ساتھ کام کرنے کے لیے، ہمیں انفرادی نقطوں کو \"نکالنا\" ہوگا، یعنی تصاویر کو انفرادی نقطوں کے نقاط کے مجموعے میں تبدیل کرنا ہوگا۔ ہم یہ **فیچر ایکسٹریکشن** تکنیکوں جیسے SIFT، SURF یا [ORB](https://docs.opencv.org/4.x/d1/d89/tutorial_py_orb.html) کا استعمال کرتے ہوئے کر سکتے ہیں۔\n" + "تصاویر کے ساتھ کام کرنے کے لیے، ہمیں انفرادی نقطوں کو \"نکالنا\" ہوگا، یعنی تصاویر کو انفرادی نقطوں کے نقاط کے سیٹ میں تبدیل کرنا ہوگا۔ ہم یہ کام **فیچر ایکسٹریکشن** تکنیکوں کا استعمال کرتے ہوئے کر سکتے ہیں، جیسے کہ SIFT، SURF یا [ORB](https://docs.opencv.org/4.x/d1/d89/tutorial_py_orb.html):\n" ] }, { @@ -252,7 +252,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "متفرق حروف کو الگ کرنے کے لیے، ہمیں پورے متن کے باؤنڈنگ باکس کا پتہ ہونا چاہیے۔ اسے معلوم کرنے کے لیے، ہم صرف کم سے کم اور زیادہ سے زیادہ نقاط کا حساب لگا سکتے ہیں۔\n" + "انفرادی حروف کو الگ کرنے کے لیے، ہمیں پورے متن کے باؤنڈنگ باکس کا پتہ ہونا چاہیے۔ اسے معلوم کرنے کے لیے، ہم صرف کم از کم اور زیادہ سے زیادہ کوآرڈینیٹس کا حساب لگا سکتے ہیں:\n" ] }, { @@ -293,7 +293,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "ہمیں اس متن کو مکمل طور پر سیدھا کرنے کے لیے **پرسپیکٹو ٹرانسفارمیشن** کرنا ہوگی۔ ہم ایک مستطیل لیں گے جو نقاط $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ سے متعین ہو اور اسے نئی تصویر کے ساتھ متناسب ابعاد کے ساتھ سیدھ کریں گے۔\n" + "اس کے علاوہ، یہ متن جزوی طور پر گھمایا جا سکتا ہے، اور اسے مکمل طور پر سیدھا کرنے کے لیے ہمیں نام نہاد **پرسپیکٹو ٹرانسفارمیشن** کرنی ہوگی۔ ہم ایک مستطیل لیں گے جو نقاط $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ سے متعین ہو اور اسے نئے تصویر کے ساتھ ہم آہنگ کریں گے جس کے تناسبی ابعاد ہوں:\n" ] }, { @@ -340,7 +340,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "اس تصویر کو اچھی طرح ترتیب دینے کے بعد، اسے ٹکڑوں میں تقسیم کرنا نسبتاً آسان ہونا چاہیے:\n" + "اس تصویر کو اچھی طرح سیدھا کرنے کے بعد، اسے ٹکڑوں میں کاٹنا نسبتاً آسان ہونا چاہیے:\n" ] }, { @@ -393,9 +393,9 @@ "source": [ "## فریم فرق کے ذریعے حرکت کا پتہ لگانا\n", "\n", - "ویڈیو اسٹریم پر حرکت کا پتہ لگانا ایک بہت عام کام ہے۔ مثال کے طور پر، یہ ہمیں اس وقت الرٹس حاصل کرنے کی اجازت دیتا ہے جب نگرانی کیمرے پر کچھ ہوتا ہے۔ اگر ہم یہ سمجھنا چاہتے ہیں کہ کیمرے پر کیا ہو رہا ہے، تو ہم نیورل نیٹ ورک استعمال کر سکتے ہیں - لیکن نیورل نیٹ ورک استعمال کرنا اس وقت زیادہ سستا ہوتا ہے جب ہمیں معلوم ہو کہ کچھ ہو رہا ہے۔\n", + "ویڈیو اسٹریم پر حرکت کا پتہ لگانا ایک بہت عام کام ہے۔ مثال کے طور پر، یہ ہمیں اس وقت الرٹ حاصل کرنے کی اجازت دیتا ہے جب نگرانی کیمرے پر کچھ ہوتا ہے۔ اگر ہم یہ سمجھنا چاہتے ہیں کہ کیمرے پر کیا ہو رہا ہے، تو ہم نیورل نیٹ ورک استعمال کر سکتے ہیں - لیکن نیورل نیٹ ورک استعمال کرنا اس وقت زیادہ سستا ہوتا ہے جب ہمیں معلوم ہو کہ کچھ ہو رہا ہے۔\n", "\n", - "حرکت کا پتہ لگانے کا بنیادی خیال بہت سادہ ہے۔ اگر کیمرہ ایک جگہ پر مقرر ہے، تو کیمرے سے آنے والے فریمز ایک دوسرے سے کافی حد تک مشابہ ہوں گے۔ چونکہ فریمز کو arrays کے طور پر ظاہر کیا جاتا ہے، تو دو مسلسل فریمز کے arrays کو منفی کرنے سے ہمیں پکسل فرق ملے گا، جو جامد فریمز کے لیے کم ہونا چاہیے، اور تصویر میں نمایاں حرکت ہونے پر زیادہ ہو جائے گا۔\n", + "حرکت کا پتہ لگانے کا بنیادی خیال بہت آسان ہے۔ اگر کیمرہ ایک جگہ پر مقرر ہے، تو کیمرے سے آنے والے فریمز ایک دوسرے سے کافی حد تک مشابہت رکھتے ہیں۔ چونکہ فریمز کو arrays کے طور پر ظاہر کیا جاتا ہے، تو دو مسلسل فریمز کے arrays کو منفی کرنے سے ہمیں پکسل فرق ملے گا، جو جامد فریمز کے لیے کم ہونا چاہیے، اور تصویر میں نمایاں حرکت ہونے پر زیادہ ہو جائے گا۔\n", "\n", "ہم ویڈیو کو کھولنے اور اسے فریمز کی ترتیب میں تبدیل کرنے کا طریقہ سیکھنے سے شروع کریں گے:\n" ] @@ -445,7 +445,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "چونکہ حرکت کا پتہ لگانے کے لیے رنگ اتنا اہم نہیں ہے، ہم تمام فریمز کو گرے اسکیل میں تبدیل کریں گے۔ پھر، ہم فریم کے فرق کا حساب لگائیں گے، اور ان کے نارمز کو پلاٹ کریں گے تاکہ بصری طور پر دیکھ سکیں کہ کتنی سرگرمی ہو رہی ہے۔\n" + "چونکہ حرکت کا پتہ لگانے کے لیے رنگ اتنا اہم نہیں ہے، ہم تمام فریمز کو گرے اسکیل میں تبدیل کریں گے۔ پھر، ہم فریم کے فرق کا حساب لگائیں گے، اور ان کے معیارات کو پلاٹ کریں گے تاکہ بصری طور پر یہ دیکھ سکیں کہ کتنی سرگرمی ہو رہی ہے:\n" ] }, { @@ -490,7 +490,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "فرض کریں کہ ہم ایک رپورٹ بنانا چاہتے ہیں جو کیمرے کے سامنے ہونے والے واقعات کو دکھائے، ہر بار جب کچھ ہوتا ہے تو مناسب تصویر دکھا کر۔ ایسا کرنے کے لیے، ہم شاید \"واقعہ\" کے آغاز اور اختتامی فریم کا پتہ لگانا چاہتے ہیں، اور درمیانی فریم کو ظاہر کرنا چاہتے ہیں۔ کچھ شور کو ختم کرنے کے لیے، ہم اوپر دی گئی منحنی کو موونگ ایوریج فنکشن کے ساتھ ہموار بھی کریں گے۔\n" + "فرض کریں کہ ہم ایک رپورٹ بنانا چاہتے ہیں جو یہ دکھائے کہ کیمرے کے سامنے کیا ہوا، ہر بار کچھ ہونے پر مناسب تصویر دکھا کر۔ ایسا کرنے کے لیے، ہم شاید کسی \"واقعہ\" کے آغاز اور اختتامی فریم کا پتہ لگانا چاہیں گے، اور درمیانی فریم کو ظاہر کریں گے۔ کچھ شور کو ختم کرنے کے لیے، ہم اوپر دی گئی منحنی لکیر کو متحرک اوسط فنکشن کے ساتھ ہموار بھی کریں گے:\n" ] }, { @@ -610,7 +610,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "آپ دیکھ سکتے ہیں کہ اس تصویر کا رنگ سکیم درست نہیں لگ رہا! اس کی وجہ یہ ہے کہ تاریخی وجوہات کی بنا پر OpenCV تصاویر کو BGR رنگ اسپیس میں لوڈ کرتا ہے، جبکہ matplotlib زیادہ روایتی RGB رنگ ترتیب استعمال کرتا ہے۔ زیادہ تر وقت، یہ سمجھ میں آتا ہے کہ تصاویر کو لوڈ کرنے کے فوراً بعد RGB میں تبدیل کر دیا جائے۔\n" + "آپ دیکھ سکتے ہیں کہ اس تصویر میں رنگوں کی ترتیب درست نظر نہیں آ رہی! اس کی وجہ یہ ہے کہ تاریخی وجوہات کی بنا پر OpenCV تصاویر کو BGR رنگ کی جگہ میں لوڈ کرتا ہے، جبکہ matplotlib زیادہ روایتی RGB رنگ ترتیب استعمال کرتا ہے۔ زیادہ تر اوقات، یہ سمجھداری ہوتی ہے کہ تصاویر کو لوڈ کرنے کے فوراً بعد RGB میں تبدیل کر لیا جائے۔\n" ] }, { @@ -649,14 +649,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## آپٹیکل فلو کے ذریعے حرکت کا اخراج\n", + "## حرکت نکالیں آپٹیکل فلو کے ذریعے\n", "\n", - "اگرچہ دو مسلسل فریمز کا موازنہ کرنے سے ہمیں تبدیلیوں کی مقدار کا اندازہ ہو سکتا ہے، لیکن یہ ہمیں یہ معلومات فراہم نہیں کرتا کہ اصل میں کیا حرکت کر رہا ہے اور کہاں۔ اس معلومات کو حاصل کرنے کے لیے ایک تکنیک موجود ہے جسے **[آپٹیکل فلو](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)** کہا جاتا ہے:\n", + "جب ہم صرف دو مسلسل فریمز کا موازنہ کرتے ہیں تو یہ ہمیں تبدیلیوں کی مقدار دکھاتا ہے، لیکن یہ معلومات فراہم نہیں کرتا کہ اصل میں کیا حرکت کر رہا ہے اور کہاں۔ اس معلومات کو حاصل کرنے کے لیے ایک تکنیک موجود ہے جسے **[آپٹیکل فلو](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)** کہا جاتا ہے:\n", "\n", - "* **ڈینس آپٹیکل فلو** ویکٹر فیلڈ کا حساب لگاتا ہے جو ہر پکسل کے لیے یہ ظاہر کرتا ہے کہ وہ کہاں حرکت کر رہا ہے۔\n", - "* **اسپارس آپٹیکل فلو** تصویر میں کچھ نمایاں خصوصیات (مثلاً کنارے) لیتا ہے اور ان کی حرکت کو فریم سے فریم تک ٹریک کرتا ہے۔\n", + "* **ڈینس آپٹیکل فلو** ہر پکسل کے لیے ایک ویکٹر فیلڈ کا حساب لگاتا ہے جو دکھاتا ہے کہ وہ کہاں حرکت کر رہا ہے۔\n", + "* **اسپارس آپٹیکل فلو** تصویر میں کچھ نمایاں خصوصیات (جیسے کنارے) لیتا ہے اور ان کی حرکت کو فریم سے فریم تک ٹریک کرتا ہے۔\n", "\n", - "آپٹیکل فلو کے بارے میں مزید جاننے کے لیے [اس شاندار ٹیوٹوریل](https://learnopencv.com/optical-flow-in-opencv/) کو پڑھیں۔\n", + "آپٹیکل فلو کے بارے میں مزید پڑھیں [اس بہترین ٹیوٹوریل میں](https://learnopencv.com/optical-flow-in-opencv/)۔\n", "\n", "آئیے اپنے فریمز کے درمیان ڈینس آپٹیکل فلو کا حساب لگاتے ہیں:\n" ] @@ -738,16 +738,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "تو، ان فریمز میں سبز رنگ بائیں طرف حرکت کو ظاہر کرتا ہے، جبکہ نیلا رنگ دائیں طرف حرکت کو ظاہر کرتا ہے۔\n", + "تو، ان فریمز میں سبز رنگ بائیں جانب حرکت کو ظاہر کرتا ہے، جبکہ نیلا رنگ دائیں جانب حرکت کو ظاہر کرتا ہے۔\n", "\n", - "آپٹیکل فلو عمومی حرکت کی سمت کے بارے میں نتائج اخذ کرنے کے لیے ایک بہترین ٹول ہو سکتا ہے۔ مثال کے طور پر، اگر آپ دیکھیں کہ کسی فریم کے تمام پکسلز زیادہ یا کم ایک ہی سمت میں حرکت کر رہے ہیں - تو آپ نتیجہ نکال سکتے ہیں کہ کیمرے کی حرکت ہو رہی ہے، اور اس کی تلافی کرنے کی کوشش کر سکتے ہیں۔\n" + "آپٹیکل فلو عمومی حرکت کی سمت کے بارے میں نتائج اخذ کرنے کے لیے ایک بہترین ذریعہ ہو سکتا ہے۔ مثال کے طور پر، اگر آپ دیکھیں کہ کسی فریم کے تمام پکسلز زیادہ یا کم ایک ہی سمت میں حرکت کر رہے ہیں - تو آپ نتیجہ نکال سکتے ہیں کہ کیمرے کی حرکت ہو رہی ہے، اور اس کی تلافی کرنے کی کوشش کر سکتے ہیں۔\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**ڈسکلیمر**: \nیہ دستاویز AI ترجمہ سروس [Co-op Translator](https://github.com/Azure/co-op-translator) کا استعمال کرتے ہوئے ترجمہ کی گئی ہے۔ ہم درستگی کے لیے کوشش کرتے ہیں، لیکن براہ کرم آگاہ رہیں کہ خودکار ترجمے میں غلطیاں یا غیر درستیاں ہو سکتی ہیں۔ اصل دستاویز کو اس کی اصل زبان میں مستند ذریعہ سمجھا جانا چاہیے۔ اہم معلومات کے لیے، پیشہ ور انسانی ترجمہ کی سفارش کی جاتی ہے۔ ہم اس ترجمے کے استعمال سے پیدا ہونے والی کسی بھی غلط فہمی یا غلط تشریح کے ذمہ دار نہیں ہیں۔\n" + "\n---\n\n**ڈسکلیمر**: \nیہ دستاویز AI ترجمہ سروس [Co-op Translator](https://github.com/Azure/co-op-translator) کا استعمال کرتے ہوئے ترجمہ کی گئی ہے۔ ہم درستگی کے لیے کوشش کرتے ہیں، لیکن براہ کرم آگاہ رہیں کہ خودکار ترجمے میں غلطیاں یا عدم درستگی ہو سکتی ہیں۔ اصل دستاویز کو اس کی اصل زبان میں مستند ذریعہ سمجھا جانا چاہیے۔ اہم معلومات کے لیے، پیشہ ور انسانی ترجمہ کی سفارش کی جاتی ہے۔ اس ترجمے کے استعمال سے پیدا ہونے والی کسی بھی غلط فہمی یا غلط تشریح کے لیے ہم ذمہ دار نہیں ہیں۔\n" ] } ], @@ -774,8 +774,8 @@ }, "orig_nbformat": 4, "coopTranslator": { - "original_hash": "ad5bdca62175c7a3d4336ef8c761aef3", - "translation_date": "2025-08-28T03:18:56+00:00", + "original_hash": "339b2129f86b24024393ff92b8bd376f", + "translation_date": "2025-09-07T14:54:00+00:00", "source_file": "lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb", "language_code": "ur" } diff --git a/translations/vi/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb b/translations/vi/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb index f043f351..548df7a1 100644 --- a/translations/vi/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb +++ b/translations/vi/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb @@ -6,7 +6,7 @@ "source": [ "# Thị giác máy tính và OpenCV\n", "\n", - "Notebook này là một phần của [Chương trình học AI dành cho người mới bắt đầu](http://aka.ms/ai-beginners).\n", + "Notebook này là một phần của [Chương trình học AI cho người mới bắt đầu](http://aka.ms/ai-beginners).\n", "\n", "[OpenCV](https://opencv.org/) được coi là tiêu chuẩn *de facto* cho xử lý hình ảnh. Nó chứa rất nhiều thuật toán hữu ích, được triển khai bằng C++. Bạn cũng có thể sử dụng OpenCV từ Python.\n", "\n", @@ -44,7 +44,7 @@ "source": [ "## Tải hình ảnh\n", "\n", - "Hình ảnh trong Python có thể được biểu diễn một cách tiện lợi bằng các mảng NumPy. Ví dụ, một hình ảnh xám với kích thước 320x200 pixel sẽ được lưu trữ trong một mảng 200x320, và một hình ảnh màu có cùng kích thước sẽ có dạng 200x320x3 (cho 3 kênh màu).\n", + "Hình ảnh trong Python có thể được biểu diễn một cách thuận tiện bằng các mảng NumPy. Ví dụ, hình ảnh grayscale với kích thước 320x200 pixel sẽ được lưu trong mảng 200x320, và hình ảnh màu với cùng kích thước sẽ có dạng 200x320x3 (cho 3 kênh màu).\n", "\n", "Hãy bắt đầu bằng cách tải một hình ảnh:\n" ] @@ -135,7 +135,7 @@ "source": [ "bw_im = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)\n", "print(bw_im.shape)\n", - "plt.imshow(bw_im)" + "plt.imshow(bw_im, cmap='gray')" ] }, { @@ -144,7 +144,7 @@ "source": [ "## Xử lý hình ảnh Braille\n", "\n", - "Nếu chúng ta muốn áp dụng phân loại hình ảnh để nhận diện văn bản, chúng ta cần cắt ra các ký hiệu riêng lẻ để làm cho chúng giống với các hình ảnh MNIST mà chúng ta đã thấy trước đây. Điều này có thể thực hiện bằng kỹ thuật [phát hiện đối tượng](../11-ObjectDetection/README.md) mà chúng ta sẽ thảo luận sau, nhưng cũng có thể thử sử dụng thị giác máy tính thuần túy để làm điều đó. Một mô tả hay về cách thị giác máy tính có thể được sử dụng để tách ký tự có thể được tìm thấy [trong bài viết blog này](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) - ở đây chúng ta sẽ chỉ tập trung vào một số kỹ thuật thị giác máy tính.\n", + "Nếu chúng ta muốn áp dụng phân loại hình ảnh để nhận diện văn bản, chúng ta cần cắt ra các ký hiệu riêng lẻ để làm cho chúng giống với các hình ảnh MNIST mà chúng ta đã thấy trước đây. Điều này có thể thực hiện bằng kỹ thuật [phát hiện đối tượng](../11-ObjectDetection/README.md) mà chúng ta sẽ thảo luận sau, nhưng cũng có thể thử sử dụng thuần túy thị giác máy tính để làm điều đó. Một mô tả tốt về cách thị giác máy tính có thể được sử dụng để tách ký tự có thể được tìm thấy [trong bài viết blog này](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) - ở đây chúng ta sẽ chỉ tập trung vào một số kỹ thuật thị giác máy tính.\n", "\n", "Đầu tiên, hãy thử cải thiện hình ảnh một chút. Chúng ta có thể sử dụng ý tưởng về **ngưỡng hóa** (được mô tả rõ [trong bài viết OpenCV này](https://docs.opencv.org/4.x/d7/d4d/tutorial_py_thresholding.html)):\n" ] @@ -293,7 +293,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Ngoài ra, văn bản này có thể được xoay một phần, và để làm cho nó căn chỉnh hoàn hảo, chúng ta cần thực hiện cái gọi là **biến đổi phối cảnh**. Chúng ta sẽ lấy một hình chữ nhật được xác định bởi các điểm $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ và căn chỉnh nó với hình ảnh mới có kích thước tỷ lệ:\n" + "Ngoài ra, văn bản này có thể bị xoay một phần, và để làm cho nó căn chỉnh hoàn hảo, chúng ta cần thực hiện cái gọi là **biến đổi phối cảnh**. Chúng ta sẽ lấy một hình chữ nhật được xác định bởi các điểm $(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$ và căn chỉnh nó với hình ảnh mới có kích thước tỷ lệ:\n" ] }, { @@ -445,7 +445,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Vì màu sắc không quá quan trọng đối với việc phát hiện chuyển động, chúng ta sẽ chuyển tất cả các khung hình sang thang độ xám. Sau đó, chúng ta sẽ tính toán sự khác biệt giữa các khung hình và vẽ đồ thị chuẩn của chúng để trực quan hóa mức độ hoạt động đang diễn ra:\n" + "Vì màu sắc không quá quan trọng đối với việc phát hiện chuyển động, chúng ta sẽ chuyển đổi tất cả các khung hình sang thang độ xám. Sau đó, chúng ta sẽ tính toán sự khác biệt giữa các khung hình và vẽ đồ thị chuẩn của chúng để trực quan hóa mức độ hoạt động đang diễn ra:\n" ] }, { @@ -490,7 +490,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Giả sử chúng ta muốn tạo một báo cáo hiển thị những gì đã xảy ra trước camera bằng cách hiển thị hình ảnh phù hợp mỗi khi có sự kiện xảy ra. Để làm điều này, chúng ta có thể muốn tìm khung hình bắt đầu và kết thúc của một \"sự kiện\", và hiển thị khung hình ở giữa. Để loại bỏ một số nhiễu, chúng ta cũng sẽ làm mượt đường cong phía trên bằng hàm trung bình động:\n" + "Giả sử chúng ta muốn tạo một báo cáo hiển thị những gì đã xảy ra trước camera bằng cách hiển thị hình ảnh phù hợp mỗi khi có sự kiện xảy ra. Để làm điều này, chúng ta có thể muốn tìm khung hình bắt đầu và kết thúc của một \"sự kiện\", và hiển thị khung hình ở giữa. Để loại bỏ một số nhiễu, chúng ta cũng sẽ làm mượt đường cong trên bằng hàm trung bình động:\n" ] }, { @@ -685,9 +685,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Như bạn có thể thấy, đối với mỗi khung hình, luồng quang học có kích thước của khung hình và 2 kênh, tương ứng với các thành phần x và y của vector luồng quang học.\n", + "Như bạn thấy, đối với mỗi khung hình, dòng chảy có kích thước của khung hình và 2 kênh, tương ứng với các thành phần x và y của vector dòng chảy quang học.\n", "\n", - "Hiển thị luồng quang học trong không gian 2D có phần thách thức, nhưng chúng ta có thể sử dụng một ý tưởng thông minh. Nếu chúng ta chuyển đổi luồng quang học sang tọa độ cực, thì mỗi pixel sẽ có hai thành phần: *hướng* và *cường độ*. Chúng ta có thể biểu diễn cường độ bằng cường độ của pixel và hướng bằng các màu sắc khác nhau. Chúng ta sẽ tạo một hình ảnh trong [không gian màu HSV (Hue-Saturation-Value)](https://en.wikipedia.org/wiki/HSV_color_space), trong đó hue sẽ được xác định bởi hướng, value - bởi cường độ, và saturation sẽ là 255.\n" + "Hiển thị dòng chảy quang học trong 2D khá thách thức, nhưng chúng ta có thể sử dụng một ý tưởng thông minh. Nếu chúng ta chuyển đổi dòng chảy quang học sang tọa độ cực, thì chúng ta sẽ có hai thành phần cho mỗi pixel: *hướng* và *cường độ*. Chúng ta có thể biểu diễn cường độ bằng độ sáng của pixel, và hướng bằng các màu sắc khác nhau. Chúng ta sẽ tạo một hình ảnh trong [không gian màu HSV (Hue-Saturation-Value)](https://en.wikipedia.org/wiki/HSV_color_space), trong đó hue sẽ được xác định bởi hướng, value - bởi cường độ, và saturation sẽ là 255.\n" ] }, { @@ -738,14 +738,14 @@ "source": [ "Vì vậy, trong những khung hình đó, màu xanh lá cây tương ứng với chuyển động sang trái, trong khi màu xanh dương - chuyển động sang phải.\n", "\n", - "Dòng chảy quang học có thể là một công cụ tuyệt vời để rút ra kết luận về hướng chuyển động tổng thể. Ví dụ, nếu bạn thấy rằng tất cả các điểm ảnh trong một khung hình đang di chuyển theo một hướng nhất định - bạn có thể kết luận rằng có sự chuyển động của máy quay và cố gắng bù đắp cho điều đó.\n" + "Dòng chảy quang học có thể là một công cụ tuyệt vời để rút ra kết luận về hướng chuyển động tổng thể. Ví dụ, nếu bạn thấy rằng tất cả các pixel trong một khung hình đang di chuyển theo một hướng nhất định - bạn có thể kết luận rằng có sự chuyển động của máy quay và cố gắng bù đắp cho điều đó.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**Tuyên bố miễn trừ trách nhiệm**: \nTài liệu này đã được dịch bằng dịch vụ dịch thuật AI [Co-op Translator](https://github.com/Azure/co-op-translator). Mặc dù chúng tôi cố gắng đảm bảo độ chính xác, xin lưu ý rằng các bản dịch tự động có thể chứa lỗi hoặc không chính xác. Tài liệu gốc bằng ngôn ngữ bản địa nên được coi là nguồn tham khảo chính thức. Đối với các thông tin quan trọng, chúng tôi khuyến nghị sử dụng dịch vụ dịch thuật chuyên nghiệp từ con người. Chúng tôi không chịu trách nhiệm cho bất kỳ sự hiểu lầm hoặc diễn giải sai nào phát sinh từ việc sử dụng bản dịch này.\n" + "\n---\n\n**Tuyên bố miễn trừ trách nhiệm**: \nTài liệu này đã được dịch bằng dịch vụ dịch thuật AI [Co-op Translator](https://github.com/Azure/co-op-translator). Mặc dù chúng tôi cố gắng đảm bảo độ chính xác, xin lưu ý rằng các bản dịch tự động có thể chứa lỗi hoặc không chính xác. Tài liệu gốc bằng ngôn ngữ bản địa nên được coi là nguồn tham khảo chính thức. Đối với các thông tin quan trọng, nên sử dụng dịch vụ dịch thuật chuyên nghiệp từ con người. Chúng tôi không chịu trách nhiệm cho bất kỳ sự hiểu lầm hoặc diễn giải sai nào phát sinh từ việc sử dụng bản dịch này.\n" ] } ], @@ -772,8 +772,8 @@ }, "orig_nbformat": 4, "coopTranslator": { - "original_hash": "ad5bdca62175c7a3d4336ef8c761aef3", - "translation_date": "2025-08-29T13:56:04+00:00", + "original_hash": "339b2129f86b24024393ff92b8bd376f", + "translation_date": "2025-09-07T15:12:25+00:00", "source_file": "lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb", "language_code": "vi" } diff --git a/translations/zh/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb b/translations/zh/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb index 08f369fd..7a5c94b0 100644 --- a/translations/zh/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb +++ b/translations/zh/lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb @@ -44,9 +44,9 @@ "source": [ "## 加载图像\n", "\n", - "在 Python 中,图像可以方便地用 NumPy 数组表示。例如,大小为 320x200 像素的灰度图像会存储在一个 200x320 的数组中,而相同尺寸的彩色图像则会有一个形状为 200x320x3 的数组(对应 3 个颜色通道)。\n", + "在 Python 中,图像可以方便地用 NumPy 数组表示。例如,一个大小为 320x200 像素的灰度图像会存储在一个 200x320 的数组中,而相同尺寸的彩色图像则会有一个形状为 200x320x3 的数组(对应 3 个颜色通道)。\n", "\n", - "我们先从加载一张图像开始:\n" + "让我们从加载一张图像开始:\n" ] }, { @@ -94,7 +94,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "正如你所看到的,这是盲文文本的图像。由于我们对实际颜色不是很感兴趣,我们可以将其转换为黑白:\n" + "正如你所看到的,这是一张盲文的图像。由于我们对实际颜色不是很感兴趣,我们可以将其转换为黑白:\n" ] }, { @@ -135,7 +135,7 @@ "source": [ "bw_im = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)\n", "print(bw_im.shape)\n", - "plt.imshow(bw_im)" + "plt.imshow(bw_im, cmap='gray')" ] }, { @@ -144,9 +144,9 @@ "source": [ "## 盲文图像处理\n", "\n", - "如果我们想应用图像分类来识别文本,就需要将单个符号剪切出来,使其类似于我们之前见过的 MNIST 图像。这可以通过[目标检测](../11-ObjectDetection/README.md)技术来实现,我们稍后会讨论这一点,但我们也可以尝试仅使用纯计算机视觉来完成。关于如何使用计算机视觉进行字符分离的一个很好的描述可以在[这篇博客文章](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/)中找到——这里我们只专注于一些计算机视觉技术。\n", + "如果我们想应用图像分类来识别文本,就需要将单个符号剪切出来,使其类似于我们之前看到的 MNIST 图像。这可以通过 [目标检测](../11-ObjectDetection/README.md) 技术来实现,我们稍后会讨论这一点,但我们也可以尝试使用纯计算机视觉来完成这一任务。关于如何使用计算机视觉进行字符分离的一个很好的描述可以在 [这篇博客文章](https://learnopencv.com/image-alignment-feature-based-using-opencv-c-python/) 中找到——这里我们将仅关注一些计算机视觉技术。\n", "\n", - "首先,让我们尝试稍微增强一下图像。我们可以使用**阈值处理**的概念([这篇 OpenCV 文章](https://docs.opencv.org/4.x/d7/d4d/tutorial_py_thresholding.html)中有详细描述):\n" + "首先,让我们尝试稍微增强一下图像。我们可以使用 **阈值处理** 的方法(在 [这篇 OpenCV 文章](https://docs.opencv.org/4.x/d7/d4d/tutorial_py_thresholding.html) 中有详细描述):\n" ] }, { @@ -252,7 +252,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "要分隔单个字符,我们需要知道整个文本的边界框。为了找到它,我们只需计算最小和最大坐标:\n" + "要分隔单个字符,我们需要知道整个文本的边界框。要找到它,我们只需计算最小和最大坐标:\n" ] }, { @@ -293,7 +293,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "此外,此文本可以部分旋转,为了使其完美对齐,我们需要进行所谓的**透视变换**。我们将采用由点$(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$定义的矩形,并将其与具有比例尺寸的新图像对齐:\n" + "此外,此文本可能会部分旋转,为了使其完美对齐,我们需要进行所谓的**透视变换**。我们将采用由点$(x_{min},y_{min}), (x_{min},y_{max}), (x_{max},y_{min}), (x_{max},y_{max})$定义的矩形,并将其与具有相同比例尺寸的新图像对齐:\n" ] }, { @@ -340,7 +340,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "在我们得到这个对齐良好的图像后,将其切成几块应该相对容易:\n" + "在我们得到这张对齐良好的图像后,将其切成几块应该相对容易:\n" ] }, { @@ -384,7 +384,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "您已经看到,使用纯图像处理技术可以完成相当多的任务,而无需任何人工智能。如果我们可以使用计算机视觉技术来简化神经网络的工作——我们绝对应该这样做,因为这将使我们能够用更少的训练数据解决问题。\n" + "您已经看到,许多任务可以仅通过纯图像处理完成,而无需任何人工智能。如果我们可以使用计算机视觉技术来简化神经网络的工作,我们绝对应该这样做,因为这将使我们能够用更少的训练数据解决问题。\n" ] }, { @@ -393,9 +393,9 @@ "source": [ "## 使用帧差进行运动检测\n", "\n", - "在视频流中检测运动是一项非常常见的任务。例如,当监控摄像头捕捉到某些活动时,我们可以收到警报。如果我们想了解摄像头中发生了什么,可以使用神经网络进行分析——但在知道有活动发生的情况下,使用神经网络的成本会更低。\n", + "在视频流中检测运动是一项非常常见的任务。例如,当监控摄像头捕捉到某些事件时,它可以向我们发送警报。如果我们想了解摄像头中发生了什么,可以使用神经网络进行分析——但在知道有事件发生的情况下,使用神经网络的成本会更低。\n", "\n", - "运动检测的核心思想很简单。如果摄像头是固定的,那么摄像头捕获的帧应该彼此非常相似。由于帧是以数组形式表示的,只需对连续两帧的数组进行相减,就可以得到像素差异。对于静态帧,这种差异应该很小,而当图像中有明显运动时,差异会显著增大。\n", + "运动检测的核心思想非常简单。如果摄像头是固定的,那么摄像头捕获的帧应该彼此非常相似。由于帧是以数组形式表示的,只需对两个连续帧的数组进行相减,就可以得到像素差异。对于静态帧,这种差异应该很小,而当图像中出现显著运动时,差异会变大。\n", "\n", "我们将从学习如何打开视频并将其转换为帧序列开始:\n" ] @@ -445,7 +445,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "由于颜色对运动检测并不是那么重要,我们将把所有帧转换为灰度图。然后,我们将计算帧差异,并绘制它们的范数,以直观地观察活动量:\n" + "由于颜色对运动检测并不是那么重要,我们将把所有帧转换为灰度图像。然后,我们将计算帧差异,并绘制它们的范数,以直观地查看活动的数量:\n" ] }, { @@ -490,7 +490,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "假设我们想创建一个报告,通过每次发生事件时显示合适的图像来展示摄像机前发生的事情。为此,我们可能需要找出“事件”的开始帧和结束帧,并显示中间帧。为了去除一些噪声,我们还将使用移动平均函数来平滑上面的曲线:\n" + "假设我们想创建一个报告,通过每次发生事件时显示合适的图像来展示摄像机前发生的事情。为此,我们可能需要找出“事件”的开始帧和结束帧,并显示中间帧。为了去除一些噪声,我们还将使用移动平均函数来平滑上方的曲线:\n" ] }, { @@ -535,7 +535,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "现在我们可以使用 `np.where` 找出变化量超过阈值的帧,并提取长度超过30帧的连续帧序列:\n" + "现在我们可以使用 `np.where` 找出变化量高于阈值的帧,并提取长度超过30帧的连续帧序列:\n" ] }, { @@ -571,7 +571,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "最后我们可以显示图像:\n" + "最后,我们可以显示图像:\n" ] }, { @@ -610,7 +610,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "您可能会注意到这张图片的配色方案看起来不对!这是因为OpenCV由于历史原因以BGR颜色空间加载图像,而matplotlib使用更传统的RGB颜色顺序。大多数情况下,在加载图像后立即将其转换为RGB是有意义的。\n" + "您可能会注意到这张图片的配色方案看起来不对!这是因为出于历史原因,OpenCV加载图像时使用的是BGR颜色空间,而matplotlib使用的是更传统的RGB颜色顺序。大多数情况下,在加载图像后立即将其转换为RGB是有意义的。\n" ] }, { @@ -651,14 +651,14 @@ "source": [ "## 使用光流提取运动\n", "\n", - "仅仅比较两帧连续的图像可以让我们看到变化的程度,但无法提供关于什么在移动以及移动位置的信息。为了获取这些信息,有一种技术叫做 **[光流](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)**:\n", + "仅仅比较两个连续帧可以让我们看到变化的程度,但无法提供关于实际移动的内容以及位置的信息。为了获取这些信息,有一种技术叫做 **[光流](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html)**:\n", "\n", - "* **稠密光流** 计算每个像素的运动向量场,显示它们的移动方向和距离。\n", + "* **稠密光流** 计算每个像素的运动矢量场,显示它的移动方向\n", "* **稀疏光流** 基于图像中的一些显著特征(例如边缘),并从帧到帧构建它们的轨迹。\n", "\n", - "可以在[这篇优秀的教程](https://learnopencv.com/optical-flow-in-opencv/)中了解更多关于光流的内容。\n", + "可以在 [这个优秀的教程](https://learnopencv.com/optical-flow-in-opencv/) 中了解更多关于光流的内容。\n", "\n", - "现在让我们计算两帧之间的稠密光流:\n" + "让我们计算帧之间的稠密光流:\n" ] }, { @@ -687,9 +687,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "对于每一帧,光流具有与帧相同的维度,并包含两个通道,分别对应光流向量的 x 和 y 分量。\n", + "如你所见,对于每一帧,光流具有与帧相同的维度,并且包含两个通道,分别对应光流向量的 x 和 y 分量。\n", "\n", - "在二维空间中显示光流有些困难,但我们可以使用一个巧妙的想法。如果将光流转换为极坐标,那么每个像素将会有两个分量:*方向* 和 *强度*。我们可以用像素的亮度来表示强度,用不同的颜色来表示方向。我们将创建一个 [HSV(色相-饱和度-明度)颜色空间](https://en.wikipedia.org/wiki/HSV_color_space) 的图像,其中色相由方向定义,明度由强度定义,而饱和度固定为 255。\n" + "在二维中显示光流有些困难,但我们可以使用一个巧妙的想法。如果将光流转换为极坐标,那么每个像素将会有两个分量:*方向* 和 *强度*。我们可以用像素的亮度来表示强度,用不同的颜色来表示方向。我们将创建一个 [HSV(色调-饱和度-明度)颜色空间](https://en.wikipedia.org/wiki/HSV_color_space) 的图像,其中色调由方向定义,明度由强度定义,而饱和度固定为 255。\n" ] }, { @@ -740,14 +740,14 @@ "source": [ "所以,在这些帧中,绿色对应向左移动,而蓝色对应向右移动。\n", "\n", - "光流可以是一个很好的工具,用于推断整体的运动方向。例如,如果你看到一帧中的所有像素都或多或少地朝一个方向移动——你可以得出结论这是相机在移动,并尝试对此进行补偿。\n" + "光流可以成为一个很好的工具,用于推断总体运动方向。例如,如果你看到一个帧中的所有像素都在大致一个方向上移动——你可以得出结论这是相机的移动,并尝试对此进行补偿。\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**免责声明**: \n本文档使用AI翻译服务[Co-op Translator](https://github.com/Azure/co-op-translator)进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。原始语言的文档应被视为权威来源。对于关键信息,建议使用专业人工翻译。我们不对因使用此翻译而产生的任何误解或误读承担责任。\n" + "\n---\n\n**免责声明**: \n本文档使用AI翻译服务[Co-op Translator](https://github.com/Azure/co-op-translator)进行翻译。尽管我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应以原始语言的文档作为权威来源。对于关键信息,建议使用专业人工翻译。因使用本翻译而导致的任何误解或误读,我们概不负责。\n" ] } ], @@ -774,8 +774,8 @@ }, "orig_nbformat": 4, "coopTranslator": { - "original_hash": "ad5bdca62175c7a3d4336ef8c761aef3", - "translation_date": "2025-08-31T09:48:26+00:00", + "original_hash": "339b2129f86b24024393ff92b8bd376f", + "translation_date": "2025-09-07T14:54:40+00:00", "source_file": "lessons/4-ComputerVision/06-IntroCV/OpenCV.ipynb", "language_code": "zh" }