• 0
anas_aloklah

مساعدة يا جماعة الخير (تحديد كرة زرقاء في الصورة) .

سؤال

مساعدة من فضلكم أنا عندي مشروع وهوا أن تقوم الكاميرة بتحديد كرة زرقاء وتصبح تتحرك الكاميرة بحركة الكرة قرأت خورزمية تحديد الوجوه هذه

http://www.codeproject.com/Articles/39060/Face-Detection-in-C

وفهمتها جيداً و استفدت من بعض الأفكار بها لكن ما أريده خورزمية أسرعة

الي استفدت منه هو أن حولت من RGB إلى cb وبهذا الشكل أصبح اللون الزرق بارز بالأبيض

أريد مساعدة في تحديد الجسم الأزرق بغض النظر عن حجمه صغير ولا كبير بحيث يكون التحديد على حسب الحجم

ومشكور لمن يساعدني

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

2 إجابة على هذا السؤال .

  • 0

السلام عليكم ...

  1. أخي anas يرجى اختيار عنوان مناسب للموضوع ,(تم التعديل) .
  2. عندي هذا الكود (cpp) استخدمته لإيجاد طول و عرض (و بالتالي مستطيل) لحرف (عربي أو إنكليزي) مكتوب بخط أسود ضمن صورة بيضاء .
  3. الفكرة بسيطة تعتمد على مسح كل البكسلات في الصورة و إيجاد البكسل الأسود في أقصي اليمين و أقصى اليسار و في الأعلى و الأسفل .
  4. void CalcHeightWidth()
    {
    // طريقة الحساب تعمتمد على أيجاد البكسل الأسود أقصى اليمين و أقصى اليسار و في الأعلى و الأسفل
    // ثم نوجد الفرق بين هذه البكسلات لإيدا الطول و العرض

    //القيم البدائية للمتحولات

    int minX = img.width ; // نفرض أن أصغر بكسل هو البكسل أقصى اليمين
    int maxX = -1;// نفرض أن أكبر بكسل علة المحور إكس هو في الموقع ناقص واحد
    int minY = img.height ; // نفرض أن أصغر بكسل شاقولي هو البكسل الموجود في الأسفل
    int maxY = -1 ;// نفرض ان أكبر بكسل على المحور العمودي هو في الموقع ناقص واحد
    for (int i=0;i< img.width;i++) // حلقة تكرارية على الأسطر و الاعمدة لتمسح ك البكسلات في مصفوفة البكسلات
    for (int j=0;j<img.height;j++)
    {
    if (ArrayOfPixels[i][j].color == 0) // إذا كان البكسل أسود
    {

    if(i < minX) // هل البكسل أصغر من أصغر بكسل لدينا على المحور إكس
    minX = i ;// إذا يصبح هو أصغر بكسل

    if(i > maxX)// هل البكسل أكبر من أكبر بكسل على المحور إكس
    maxX = i;// إذا يصبح هو أكبر بكسل على المحور غكس

    if(j < minY) // هل البكسل أصغر من أصغر بكسل على المحور العمودي
    minY = j ;// إذا يصبه هو أصغر بكسل

    if(j > maxY)// هل البكسل أكبر من أكبر بكسل على المحور العمودي
    maxY = j;// إذا يصبح هو أكبر من أكبر بكسل على المحور الشاقولي

    }
    }
    if( minX == img.width || maxX == -1 || minY == img.height || maxY == -1) // نفحص هل تغييرات القيم البدائية للمتحولات
    {
    nWidthLetter = 0; // إذا تكون الصورة لا تحوي أي حرف
    nHeightLetter = 0;
    }
    else
    {
    nWidthLetter = maxX - minX + 1; // عرض الحرف هو الفرق بين البكسل في أقصى اليمين و أقصى اليسار على المحور إكس
    nHeightLetter = maxY - minY + 1;//طول الحرف هو الفرق بين البكسل الأعلى الأسود و البكسل الأدنى الأسود على المحور الشاقولي
    }
    HeightWidthRatio = (float)nHeightLetter / (float)nWidthLetter ; // نحسب نسبة ارتفاع الحرف إلى عرضه التس سنستخدمها في معادلة المسافة
    }

  5. اتمنى أن يكون مفيدا .

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم ...

  1. أخي anas يرجى اختيار عنوان مناسب للموضوع ,(تم التعديل) .
  2. عندي هذا الكود (cpp) استخدمته لإيجاد طول و عرض (و بالتالي مستطيل) لحرف (عربي أو إنكليزي) مكتوب بخط أسود ضمن صورة بيضاء .
  3. الفكرة بسيطة تعتمد على مسح كل البكسلات في الصورة و إيجاد البكسل الأسود في أقصي اليمين و أقصى اليسار و في الأعلى و الأسفل .
  4. void CalcHeightWidth()
    {
    // طريقة الحساب تعمتمد على أيجاد البكسل الأسود أقصى اليمين و أقصى اليسار و في الأعلى و الأسفل
    // ثم نوجد الفرق بين هذه البكسلات لإيدا الطول و العرض

    //القيم البدائية للمتحولات

    int minX = img.width ; // نفرض أن أصغر بكسل هو البكسل أقصى اليمين
    int maxX = -1;// نفرض أن أكبر بكسل علة المحور إكس هو في الموقع ناقص واحد
    int minY = img.height ; // نفرض أن أصغر بكسل شاقولي هو البكسل الموجود في الأسفل
    int maxY = -1 ;// نفرض ان أكبر بكسل على المحور العمودي هو في الموقع ناقص واحد
    for (int i=0;i< img.width;i++) // حلقة تكرارية على الأسطر و الاعمدة لتمسح ك البكسلات في مصفوفة البكسلات
    for (int j=0;j<img.height;j++)
    {
    if (ArrayOfPixels[i][j].color == 0) // إذا كان البكسل أسود
    {

    if(i < minX) // هل البكسل أصغر من أصغر بكسل لدينا على المحور إكس
    minX = i ;// إذا يصبح هو أصغر بكسل

    if(i > maxX)// هل البكسل أكبر من أكبر بكسل على المحور إكس
    maxX = i;// إذا يصبح هو أكبر بكسل على المحور غكس

    if(j < minY) // هل البكسل أصغر من أصغر بكسل على المحور العمودي
    minY = j ;// إذا يصبه هو أصغر بكسل

    if(j > maxY)// هل البكسل أكبر من أكبر بكسل على المحور العمودي
    maxY = j;// إذا يصبح هو أكبر من أكبر بكسل على المحور الشاقولي

    }
    }
    if( minX == img.width || maxX == -1 || minY == img.height || maxY == -1) // نفحص هل تغييرات القيم البدائية للمتحولات
    {
    nWidthLetter = 0; // إذا تكون الصورة لا تحوي أي حرف
    nHeightLetter = 0;
    }
    else
    {
    nWidthLetter = maxX - minX + 1; // عرض الحرف هو الفرق بين البكسل في أقصى اليمين و أقصى اليسار على المحور إكس
    nHeightLetter = maxY - minY + 1;//طول الحرف هو الفرق بين البكسل الأعلى الأسود و البكسل الأدنى الأسود على المحور الشاقولي
    }
    HeightWidthRatio = (float)nHeightLetter / (float)nWidthLetter ; // نحسب نسبة ارتفاع الحرف إلى عرضه التس سنستخدمها في معادلة المسافة
    }

  5. اتمنى أن يكون مفيدا .

شكراً أخي خورزميتك فكرت بها لكنها لا تنفع معي بسبب وجود نقط مبعثرة قد تظهر

ولكن الحل كان بسيط باستخدام المتوسط الحسابي

لكني ما زلت محتاج لبعض معالجة الحالات الخاصة

لكن النائج كانت لا بأس بها إلى الآن

وشكراً مرة أخرى

تم تعديل بواسطه anas_aloklah
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .