اذهب إلى المحتوى

السؤال

Recommended Posts

  • 0
نشر
بتاريخ الآن قال Mustafa Suleiman:

تقصد توضيح لكود تريد فهم آلية عمله؟ نعم يمكن ذلك.

ايوه ,  تمام الكود اهو

import face_recognition
import cv2
import numpy as np



video_capture = cv2.VideoCapture(0)


obama_image = face_recognition.load_image_file("obama.jpg")
obama_face_encoding = face_recognition.face_encodings(obama_image)[0]


biden_image = face_recognition.load_image_file("biden.jpg")
biden_face_encoding = face_recognition.face_encodings(biden_image)[0]


known_face_encodings = [
    obama_face_encoding,
    biden_face_encoding
]
known_face_names = [
    "Barack Obama",
    "Joe Biden"
]


face_locations = []
face_encodings = []
face_names = []
process_this_frame = True

while True:
    
    ret, frame = video_capture.read()

    
    if process_this_frame:
      
        small_frame = cv2.resize(frame, (0, 0), fx=0.25, fy=0.25)

        
        rgb_small_frame = small_frame[:, :, ::-1]
        
        
        face_locations = face_recognition.face_locations(rgb_small_frame)
        face_encodings = face_recognition.face_encodings(rgb_small_frame, face_locations)

        face_names = []
        for face_encoding in face_encodings:
           
            matches = face_recognition.compare_faces(known_face_encodings, face_encoding)
            name = "Unknown"

            
            face_distances = face_recognition.face_distance(known_face_encodings, face_encoding)
            best_match_index = np.argmin(face_distances)
            if matches[best_match_index]:
                name = known_face_names[best_match_index]

            face_names.append(name)

    process_this_frame = not process_this_frame


    
    for (top, right, bottom, left), name in zip(face_locations, face_names):
       
        top *= 4
        right *= 4
        bottom *= 4
        left *= 4

        
        cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2)

        
        cv2.rectangle(frame, (left, bottom - 35), (right, bottom), (0, 0, 255), cv2.FILLED)
        font = cv2.FONT_HERSHEY_DUPLEX
        cv2.putText(frame, name, (left + 6, bottom - 6), font, 1.0, (255, 255, 255), 1)

    
    cv2.imshow('Video', frame)

   
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break


video_capture.release()
cv2.destroyAllWindows()

 

  • 0
نشر

أولاً يتم استيراد المكتبات:

  • face_recognition: مكتبة للتعرف على الوجوه.
  • cv2 (OpenCV): مكتبة برمجية مفتوحة المصدر للرؤية الحاسوبية.

ثم تهيئة كائن لتقاط الفيديو من الكاميرا الافتراضية (فهرس الكاميرا 0).

video_capture = cv2.VideoCapture(0)

ثم:

  • تحميل صور لوجوه معروفة ( وهي باراك أوباما وجو بايدن).
  • تُحسب تشفيرات الوجوه باستخدام face_recognition.face_encodings.

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

known_face_encodings = [obama_face_encoding, biden_face_encoding]
known_face_names = ["Barack Obama", "Joe Biden"]

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

while True:
  1. تغيير حجم الإطارات لتسريع عملية المعالجة.
  2. استخراج مواقع وتشفيرات الوجوه من الإطار المُصغر.
  3. ثم مقارنة تشفير كل وجه مكتشف مع تشفيرات الوجوه المعروفة.
  4. وتحديد أفضل تطابق وتسند اسم للوجه (أو "غير معروف" إذا لم يتم العثور على تطابق).
  5. رسم مستطيلات حول الوجوه المكتشفة.

  6. إضافة نص يحمل اسم الشخص المعترف به.

بعد ذلك الإطار المعالج يعرض في نافذة تحمل اسم 'Video'.

cv2.imshow('Video', frame)

ويمكن إنهاء البرنامج عن طريق الضغط على مفتاح 'q'.

if cv2.waitKey(1) & 0xFF == ord('q'):
    break

بحيث يتم تحرير كائن التقاط الفيديو، وتغلق نوافذ OpenCV.

  • 0
نشر

ربما تحتاج تغيير السطر التالي وزيادة القيمة 1 إلى قيمة أكبر 10 أو 20 لأنها تعبر عن الوقت المنتظر بالمللي ثانية = 1/1000 ثانية، وبالتالي لا يعطي الفرصة الكافية لمعالجة إطارات الصور والفيديو

# if cv2.waitKey(1) & 0xFF == ord('q'):
if cv2.waitKey(10) & 0xFF == ord('q'):

أرجو التجربة

  • 0
نشر
بتاريخ 3 ساعة قال El Sayed El Tohamy:

ربما تحتاج تغيير السطر التالي وزيادة القيمة 1 إلى قيمة أكبر 10 أو 20 لأنها تعبر عن الوقت المنتظر بالمللي ثانية = 1/1000 ثانية، وبالتالي لا يعطي الفرصة الكافية لمعالجة إطارات الصور والفيديو

# if cv2.waitKey(1) & 0xFF == ord('q'):
if cv2.waitKey(10) & 0xFF == ord('q'):

أرجو التجربة

هو حضرتك الكامير بتشتغل وبتقفل او ما تشوف وجه لكن غير كده بتفضل شغل

 

بتاريخ 21 ساعة قال Ail Ahmed:
        rgb_small_frame = small_frame[:, :, ::-1]

حل المشكله الحمد الله المشكله هنا فيه دي المفروض 1 مش -1 بس ممكن اعرف ليا لوسمحت

  • 0
نشر (معدل)

استخدام القيم السالبة في القائمة list في البايثون تعني بداية الترقيم من النهاية،

على سبيل المثال

allNames = ['Ahmed', 'Mohamed', 'Ali']
allNames2 = allNames[::-1] # ['Ali', 'Mohamed', 'Ahmed']

لاحظ استخدام -1 كقيمة للخطوة معناها نسخ القائمة من النهاية كما هو موضح الاسم الأخير أصبح الأول بالقائمة الجديدة.

عند التعامل مع مكتبات رؤية الحاسوب، فإنها تتعامل بنظام الألوان BGR أزرق/أخضر/أحمر، لذلك وجب عكس هذا الترتيب ليصبح RGB أحمر/أخضر/أزرق، وهذا هو السبب في استخدام (-1)، هذا الأسلوب قد يسبب انطلاق خطأ إذا كان المتغير الأصلي None، لذلك في أغلب الأحيان نستخدم الشيفرات بالطريقة التالية

ret, frame = video_capture.read()
if ret:
    small_frame = cv2.resize(frame, (128, 128))
    rgb_small_frame = small_frame[:, :, ::-1]
    # the rest of your code
else:
    print("Failed to read frame from camera")

فإذا ظهرت الرسالة "Failed to read frame from camera" هذا معناه أنه لم يتمكن من التقاط الصورة من الكاميرا، فيجب معرفة الخطأ وتصحيحه، وليس استبدال القيمة السالبة (-1) بالقيمة (1) لأنه قد يسبب مشاكل في ألوان الصورة.

 

تم التعديل في بواسطة El Sayed El Tohamy
  • 0
نشر
بتاريخ منذ ساعة مضت قال El Sayed El Tohamy:

استخدام القيم السالبة في القائمة list في البايثون تعني بداية الترقيم من النهاية،

على سبيل المثال

allNames = ['Ahmed', 'Mohamed', 'Ali']
allNames2 = allNames[::-1] # ['Ali', 'Mohamed', 'Ahmed']

لاحظ استخدام -1 كقيمة للخطوة معناها نسخ القائمة من النهاية كما هو موضح الاسم الأخير أصبح الأول بالقائمة الجديدة.

عند التعامل مع مكتبات رؤية الحاسوب، فإنها تتعامل بنظام الألوان BGR أزرق/أخضر/أحمر، لذلك وجب عكس هذا الترتيب ليصبح RGB أحمر/أخضر/أزرق، وهذا هو السبب في استخدام (-1)، هذا الأسلوب قد يسبب انطلاق خطأ إذا كان المتغير الأصلي None، لذلك في أغلب الأحيان نستخدم الشيفرات بالطريقة التالية

ret, frame = video_capture.read()
if ret:
    small_frame = cv2.resize(frame, (128, 128))
    rgb_small_frame = small_frame[:, :, ::-1]
    # the rest of your code
else:
    print("Failed to read frame from camera")

فإذا ظهرت الرسالة "Failed to read frame from camera" هذا معناه أنه لم يتمكن من التقاط الصورة من الكاميرا، فيجب معرفة الخطأ وتصحيحه، وليس استبدال القيمة السالبة (-1) بالقيمة (1) لأنه قد يسبب مشاكل في ألوان الصورة.

 

ايو انا عملت زي حضرتك كده وظهرات الرساله فا الخطاء من اي كده

  • 0
نشر
بتاريخ 9 دقائق مضت قال El Sayed El Tohamy:

تقصد رسالة "Failed to read frame from camera"

هل غيرت هذا السطر

if cv2.waitKey(10) & 0xFF == ord('q'):

 

ايوه ,  وبرد اول ما بيشوف وجه الكامير بتقفل علي طوال

  • 0
نشر
بتاريخ 2 دقائق مضت قال El Sayed El Tohamy:

حاول استخدام أدوات اكتشاف الأخطاء،

مثل نقطة التوقف Break point

أو طباعة عبارات معينة بعد كل أمر تشك في تسببه بالخطأ، وترى إذا لم يتم طباعة العبارة فهذا معناه أن المشكلة بهذا السطر.

حاضر , شكراا جدا لتعب حضرتك معه والله

  • 0
نشر
بتاريخ On 13‏/1‏/2024 at 21:10 قال Ail Ahmed:
    ret, frame = video_capture.read()

هو ليه هنا فيه 2 متغيرن

بتاريخ On 13‏/1‏/2024 at 21:10 قال Ail Ahmed:
        small_frame = cv2.resize(frame, (0, 0), fx=0.25, fy=0.25)

وكمان لوسمحت كانت عاوز افهم الية الكود ده 

وكمان انا عاوز الفديو يعالجه التعرف علي الوجه بشكل اسرع يعني 1/4 مش سرع عندي عاوز اسرع من كده

  • 0
نشر
بتاريخ On 13‏/1‏/2024 at 21:10 قال Ail Ahmed:
        face_encodings = face_recognition.face_encodings(rgb_small_frame, face_locations)

اه المشكله فيه السطر ده يا أ.سيد

بتاريخ On 13‏/1‏/2024 at 21:10 قال Ail Ahmed:
        rgb_small_frame = small_frame[:, :, ::-1]

وكمان يا أ.سيد المشكله له علاق ب السطر ده عشان انا ام بغير من -1 الي 1 الكامير بتعالجه الصور عادي 

ولكن ام بتكون -1 بيحصل مشكله والكامير مش بتعالجه اول ما تشوف صور

  • 0
نشر (معدل)
بتاريخ 20 ساعة قال Ail Ahmed:

هو ليه هنا فيه 2 متغيرن

وكمان لوسمحت كانت عاوز افهم الية الكود ده 

وكمان انا عاوز الفديو يعالجه التعرف علي الوجه بشكل اسرع يعني 1/4 مش سرع عندي عاوز اسرع من كده

سبب وجود متغيرين هو أن الوظيفة تعود بقيمتين،

لاحظ أن البايثون يستطيع تعريف أكثر من متغير في نفس السطر، عن طريق سرد عدد من المتغيرات مفصولة بفاصلة، ثم علامة = ثم سرد عدد من القيم يناظر المتغيرات مثل المثال التالي:

# تعريف ثلاث متغيرات في ثلاث أسطر
firstName = 'Ahmed'
lastName = 'Mohammed'
age =  25

# تعريف نفس الثلاث متغيرات ولكن بسطر واحد
firstName, lastName, age = 'Ahmed', 'Mohammed', 25

# طريقة أخرى لتعريف ثلاث متغيرات في نفس السطر
firstName, lastName, age = ['Ahmed', 'Mohammed', 25]

كذلك يمكنك تعريف ثلاث متغيرات في سطر  واحد عن طريق وظيفة تعود بقائمة

def GetData():
    return ['Ahmed', 'Mohammed', 25]

firstName, lastName, age = GetData()

 

ما الخطأ الذي يظهر عند تنفيذ هذا السطر

face_encodings = face_recognition.face_encodings(rgb_small_frame, face_locations)

 

تم التعديل في بواسطة El Sayed El Tohamy
  • 0
نشر
بتاريخ 37 دقائق مضت قال El Sayed El Tohamy:

لاحظ أن البايثون يستطيع تعريف أكثر من متغير في نفس السطر، عن طريق سرد عدد من المتغيرات مفصولة بفاصلة، ثم علامة = ثم سرد عدد من القيم يناظر المتغيرات مثل المثال التالي:

 

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

بتاريخ 38 دقائق مضت قال El Sayed El Tohamy:

ما الخطأ الذي يظهر عند تنفيذ هذا السطر

 

حاضر هاصور لحضرتك الخطاء

 

الخطاء البيظهر اهو

WhatsApp Image 2024-01-18 at 18.02.01_99ade3d6.jpg

WhatsApp Image 2024-01-18 at 18.02.01_b61a1086.jpg

WhatsApp Image 2024-01-18 at 18.02.01_ea44796a.jpg

فا اول ما اغير القيمه من -1 الي 1 الخطاء ده مش بيظهر والكامير بتعالجه عادي

بتاريخ 58 دقائق مضت قال El Sayed El Tohamy:

سبب وجود متغيرين هو أن الوظيفة تعود بقيمتين،

 

ايوه صح واحد بترجع True والتاني بترجع عبار عن list ارقم

  • 0
نشر

السبب في الخطأ أن الوظيفة face_encodings تنتظر منك إعطاءها صورة ثلاثية القنوات أي ملونة ولكنك تعطيها صورة أحادية اللون لذلك جرب تغير السطر

small_frame = cv2.resize(frame, (0, 0), fx=0.25, fy=0.25)
# بهذا السطر
small_frame = cv2.cvtColor(cv2.resize(frame, (0, 0), fx=0.25, fy=0.25), cv2.COLOR_GRAY2RGB)

 

  • 0
نشر
بتاريخ 18 دقائق مضت قال El Sayed El Tohamy:

السبب في الخطأ أن الوظيفة face_encodings تنتظر منك إعطاءها صورة ثلاثية القنوات أي ملونة ولكنك تعطيها صورة أحادية اللون لذلك جرب تغير السطر

small_frame = cv2.resize(frame, (0, 0), fx=0.25, fy=0.25)
# بهذا السطر
small_frame = cv2.cvtColor(cv2.resize(frame, (0, 0), fx=0.25, fy=0.25), cv2.COLOR_GRAY2RGB)

 

بيظهر الخطاء ده

WhatsApp Image 2024-01-18 at 19.46.10_0c090ed5.jpg

  • 0
نشر

هذه شيفرات كاملة

import face_recognition
import cv2

obama_image = face_recognition.load_image_file("obama.jpg")
biden_image = face_recognition.load_image_file("biden.jpg")

obama_encoding = face_recognition.face_encodings(obama_image)[0]
biden_encoding = face_recognition.face_encodings(biden_image)[0]

known_face_encodings = [obama_encoding, biden_encoding]
known_face_names = ["obama", "biden"]

video_capture = cv2.VideoCapture(0)

# حلقة تكرارية مستمرة لحين المستخدم يضغط على حرف 
# q
while True:
    # قراءة إطار واحد من الكاميرا
    ret, frame = video_capture.read()

    # التحويل إلى نظام
	# RGB
    rgb_frame = frame[:, :, ::-1]
 
    face_locations = face_recognition.face_locations(rgb_frame)
    face_encodings = face_recognition.face_encodings(rgb_frame, face_locations)

    # حلقة تكرارية على كل الأوجه الموجودة بالإطار
    for (top, right, bottom, left), face_encoding in zip(face_locations, face_encodings):
        
        matches = face_recognition.compare_faces(known_face_encodings, face_encoding)

        # وضع قيمة مبدئية
        name = "Unknown"

        # في حالة وجود مطابقة واحدة على الأقل، نستخدم أو واحدة
        if True in matches:
            first_match_index = matches.index(True)
            name = known_face_names[first_match_index]

        # رسم إطار والاسم حول الوجه
        cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2)
        cv2.putText(frame, name, (left + 6, bottom - 6), cv2.FONT_HERSHEY_DUPLEX, 1.0, (255, 255, 255), 1)

    # إظهار الصورة
    cv2.imshow("Face Recognition", frame)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

video_capture.release()
cv2.destroyAllWindows()

لاحظ التحويل من نظام BGR إلى نظام RGB في السطر التالي باستخدام القيمة السالبة (-1)، وذلك لأن مكتبة cv2 تلتقط الصورة بتنسيق GBR بينما مكتبة face_recognition تتعامل بنظام RGB

rgb_frame = frame[:, :, ::-1]

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...