# Counters for male and female
male_count = 0
female_count = 0
# A copy of the original image for drawing results
output_img = img.copy()
# Loop through each person's bounding box
for (x1, y1, x2, y2) in person_boxes:
# Crop the person from the image
person_crop = img[y1:y2, x1:x2]
label = "Unknown"
try:
# Apply gender detection on the person crop
# padding is used to better detect faces at the edge of the crop
face, confidence = cv.detect_face(person_crop, threshold=0.5)
# We process only if one face is detected to avoid ambiguity
if len(face) > 0:
# Get the first face detected
(startX, startY, endX, endY) = face[0]
face_crop = np.copy(person_crop[startY:endY, startX:endX])
# Predict gender of the detected face
(gender_label, gender_confidence) = cv.detect_gender(face_crop)
if gender_confidence > 0.6: # Confidence threshold
label = gender_label
if label == 'male':
male_count += 1
elif label == 'female':
female_count += 1
except Exception as e:
# Sometimes cvlib can fail on small or unclear crops
label = "Error"
# Draw bounding box and label on the output image
color = (0, 255, 0) if label in ["male", "female"] else (0, 0, 255)
cv2.rectangle(output_img, (x1, y1), (x2, y2), color, 2)
cv2.putText(output_img, label, (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2)
print(f"Males detected: {male_count}")
print(f"Females detected: {female_count}")
---
Step 5: Displaying Final Results
Finally, we calculate the percentages and display the annotated image along with a summary of our findings.
#Results #Visualization
# Calculate percentages
known_gender_count = male_count + female_count
if known_gender_count > 0:
male_percentage = (male_count / known_gender_count) * 100
female_percentage = (female_count / known_gender_count) * 100
else:
male_percentage = 0
female_percentage = 0
# Prepare the summary text
summary_text1 = f"Total People: {total_people}"
summary_text2 = f"Men: {male_count} ({male_percentage:.1f}%)"
summary_text3 = f"Women: {female_count} ({female_percentage:.1f}%)"
# Add summary text to the image
cv2.putText(output_img, summary_text1, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (255,255,255), 3)
cv2.putText(output_img, summary_text2, (10, 60), cv2.FONT_HERSHEY_SIMPLEX, 1, (255,255,255), 3)
cv2.putText(output_img, summary_text3, (10, 90), cv2.FONT_HERSHEY_SIMPLEX, 1, (255,255,255), 3)
# Save or display the final image
cv2.imwrite('crowd_analysis_result.jpg', output_img)
print("\n--- Analysis Complete ---")
print(summary_text1)
print(summary_text2)
print(summary_text3)
print("Result image saved as 'crowd_analysis_result.jpg'")
---
Step 6: Discussion of Results and Limitations
#Discussion #Ethics #AI