العثور على كتل الألوان
فيديو تعليمي 4 - التعرف على الألوان: https://singtown.com/learn/49993/
دالة find_blobs
يعد تتبع الكرة الوظيفة الأكثر استخدامًا في OpenMV. في بدء سريع لمدة 10 دقائق\ يمكن استخدام دالة find_blobs للعثور على الكتل. دعنا نناقش تفاصيل find_blobs.
image.find_blobs(thresholds, roi=Auto, x_stride=2, y_stride=1, invert=False, area_threshold=10, pixels_threshold=10, merge=False, margin=0, threshold_cb=None, merge_cb=None)
هناك العديد من المعلمات هنا.
- thresholdsهي عتبة اللون. ملاحظة: هذه المعلمة عبارة عن قائمة ويمكن أن تحتوي على ألوان متعددة. إذا كنت تحتاج إلى لون واحد فقط، فيجب أن تكون هناك قيمة لون واحدة فقط في هذه القائمة. إذا كنت تريد عتبات ألوان متعددة، فيجب أن تكون هناك عتبات ألوان متعددة في هذه القائمة. ملاحظة: في كائن كتلة اللون المُرجعيمكن أن يسمى Blobcodeطريقة تحديد لون كتلة اللون.
red = (xxx,xxx,xxx,xxx,xxx,xxx)
blue = (xxx,xxx,xxx,xxx,xxx,xxx)
yellow = (xxx,xxx,xxx,xxx,xxx,xxx)
img=csi0.snapshot()
red_blobs = img.find_blobs([red])
color_blobs = img.find_blobs([red,blue, yellow])
roi هي "منطقة الاهتمام". تم تقديم ذلك في إحصائيات الاستخدام.
left_roi = [0,0,160,240]\ blobs = img.find_blobs([red],roi=left_roi)
x_stride هو الحد الأدنى لعرض كتلة اللون في اتجاه x. القيمة الافتراضية هي 2. إذا كنت تريد فقط العثور على كتل ألوان بعرض يزيد عن 10 بكسل، فاضبط هذه المعلمة على 10:
blobs = img.find_blobs([red],x_stride=10)
y_stride هو الحد الأدنى لعرض كتلة اللون في اتجاه y. القيمة الافتراضية هي 1. إذا كنت تريد فقط العثور على كتل ألوان بعرض يزيد عن 5 بكسل، فاضبط هذه المعلمة على 5:
blobs = img.find_blobs([red],y_stride=5)
invertعكس العتبة واستخدام اللون خارج العتبة كعتبة للبحث
area_threshold عتبة المساحة. إذا كانت مساحة كتلة اللون أصغر من هذه القيمة، فسيتم تصفيتها
pixels_threshold عتبة عدد البكسل. إذا كان عدد البكسل في كتلة اللون أقل من هذه القيمة، فسيتم تصفيتها
mergeدمج، إذا تم ضبطه على True، يدمج كل الكتل المتداخلة في كتلة واحدة.\ ملحوظة: سيؤدي هذا إلى دمج جميع الكتل، بغض النظر عن اللون. إذا كنت تريد مزج كتل من ألوان متعددة، فما عليك سوى استدعاء find_blobs مع عتبات ألوان مختلفة بشكل منفصل.
all_blobs = img.find_blobs([red,blue,yellow],merge=True)
red_blobs = img.find_blobs([red],merge=True)
blue_blobs = img.find_blobs([blue],merge=True)
yellow_blobs = img.find_blobs([yellow],merge=True)
- margin الحدود، إذا تم ضبطها على 1، فإن الاثنينblobsإذا كانت المسافة 1 بكسل، فسيتم دمجها أيضًا.
عتبة
إن بنية عتبة اللون هي كما يلي:
red = (minL, maxL, minA, maxA, minB, maxB)
القيم الموجودة في المجموعة هي الحد الأقصى والحد الأدنى لقيم L A B على التوالي.
إذا كنت تريد الحصول على هذه العتبة في صورة IDE، راجع: بدء سريع لمدة 10 دقائق
في الإصدار الجديد من IDE، هناك أداة اختيار عتبة أكثر ملاءمة، انظر أدناه.
أداة تحديد عتبة اللون
تمت إضافة أداة اختيار العتبة إلى OpenMV IDE، مما يسهل إلى حد كبير تصحيح أخطاء عتبات الألوان.
أولاً، قم بتشغيل hello world.py لجعل الإطار المؤقت في IDE يعرض النمط.\
\
ثم افتح الأداة→ Mechine Vision → Threshold Editor\

انقر فوق Frame Buffer للحصول على الصورة في IDE، ويسمح لك Image File بتحديد ملف الصورة بنفسك.

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

Blobs هي قائمة
يعيد كائن find_blobs قيمًا متعددةblob. (لاحظ الفرقblobsوblob، وهو مجرد اسم للتمييز بين الكتل المتعددة والكتلة الواحدة).\ القائمة تشبه المصفوفة في لغة C. تحتوي قائمة الكائنات على العديد من كائنات الكائنات. كائنات الكائنات عبارة عن كتل ملونة، وكل كائن من كائنات الكائنات يحتوي على معلومات كتلة اللون.
blobs = img.find_blobs([red])
blobsمجرد مجموعة كبيرة من الكتل الملونة.
بإمكانك استخدام حلقة for للبحث عن جميع كتل الألوان.
for blob in blobs:
print(blob.cx)
لاستخدام حلقات for، راجع pythonالخلفية المعرفية
blobكائن كتلة اللون
تحتوي Blob على طرق متعددة:
يقوم blob.rect() بإرجاع الإطار الخارجي لهذه الكتلة - مستطيل (x, y, w, h)، والذي يمكن استخدامه مباشرة في image.draw_rectangle.
تقوم blob.x() بإرجاع إحداثيات x لصندوق الحدود الخارجي للكائن (int)، والذي يمكن الحصول عليه أيضًا عبر blob[0].
تعيد blob.y() إحداثيات y لصندوق الحدود الخارجي للكائن (int)، والذي يمكن الحصول عليه أيضًا عبر blob[1].
تقوم blob.w() بإرجاع عرض w (int) لحدود الكائن، والذي يمكن الحصول عليه أيضًا عبر blob[2].
يعيد blob.h() الارتفاع h (int) للإطار الخارجي للكائن، والذي يمكن الحصول عليه أيضًا من خلال blob[3].
تقوم blob.pixels() بإرجاع عدد البكسلات الموجودة في الكائن (int)، والذي يمكن الحصول عليه أيضًا عبر blob[4].
يعيد blob.cx() إحداثيات مركز x لصندوق محيط الكائن (int)، والذي يمكن الحصول عليه أيضًا عبر blob[5].
تعيد blob.cy() إحداثيات y المركزية لصندوق محيط الكائن (int)، والتي يمكن الحصول عليها أيضًا من خلال blob[6].
blob.rotation() يقوم بإرجاع زاوية دوران الكائن بالراديان (الوحدة هي الراديان)(float). إذا كانت كتلة اللون تشبه قلم الرصاص، فإن هذه القيمة تكون 0~180°. إذا كانت الكتلة عبارة عن دائرة، فهذه القيمة عديمة الفائدة. إذا لم يكن لكتلة اللون أي تناسق على الإطلاق، فستحصل على 0~360 درجة، والتي يمكن الحصول عليها أيضًا من خلال blob[7].
يقوم blob.code() بإرجاع رقم مكون من 16 بت، حيث يتوافق كل بت مع كل عتبة. على سبيل المثال:
blobs = img.find_blobs([red, blue, yellow], merge=True)
إذا كان لون الكتلة أحمر، فإن كودها هو 0001، وإذا كان لونها أزرق، فإن كودها هو
ملاحظة: يمكن دمج الكتلة، إذا كانت كتلة حمراء وزرقاء، فإن الكتلة هي 0011. يمكن استخدام هذه الوظيفة للبحث عن أكواد الألوان. يمكن الحصول عليه أيضًا من خلال blob[8].
blob.count() إذا كان merge=True، فسيتم دمج العديد من الكتل في كتلة واحدة، وتعيد هذه الوظيفة عدد الكتل. إذا كان merge=False، فإن قيمة الإرجاع تكون دائمًا
- يمكن الحصول عليه أيضًا من خلال blob[9].
تقوم blob.area() بإرجاع مساحة الصندوق المحيط بالكائن.يجب أن يكون مساويًا لـ (w * h)
blob.density() يقوم بإرجاع كثافة الكائن. وهذا يساوي عدد وحدات البكسل في الكتلة مقسومًا على المساحة خارج الإطار. إذا كانت الكثافة منخفضة، فهذا يعني أن الهدف غير مقفل بشكل جيد.\ على سبيل المثال، لتحديد دائرة حمراء، فإن blob.pixels() المُرجع هو عدد وحدات البكسل في الدائرة المستهدفة، وblob.area() هي مساحة المربع المحيط بالدائرة.