Chuyển đến nội dung chính

Phát hiện khuôn mặt với Python bằng OpenCV

Tìm hiểu về phát hiện đối tượng trong Python bằng thư viện OpenCV và cách áp dụng vào các tác vụ như phát hiện khuôn mặt.
Đã cập nhật 5 thg 10, 2026  · 8 phút đọc

Khám phá cùng AI

ChatGPTClaudePerplexity

OpenCV là một thư viện thị giác máy tính hỗ trợ các ngôn ngữ lập trình như Python, C++ và Java. Gói này ban đầu được Intel tạo ra vào năm 1999, sau đó được mở mã nguồn và phát hành công khai.

OpenCV cho phép nhà phát triển và cả những người không chuyên toán xây dựng ứng dụng thị giác máy tính một cách dễ dàng mà không cần viết từ đầu. Thư viện có hơn 2.500 thuật toán, cho phép thực hiện các tác vụ như nhận diện khuôn mặt và phát hiện đối tượng.

Các nhà phát triển và chuyên gia dữ liệu tại những tổ chức lớn như Google, Microsoft, IBM và Intel sử dụng rộng rãi thư viện OpenCV, vốn hiện miễn phí cho mục đích thương mại.

Trong bài viết này, chúng ta sẽ dùng OpenCV để thực hiện phát hiện khuôn mặt bằng Python.

Đến cuối hướng dẫn, bạn sẽ biết cách:

  • Phát hiện khuôn mặt người trong ảnh với OpenCV bằng Python
  • Thực hiện phát hiện khuôn mặt theo thời gian thực trên luồng video từ webcam

Phát hiện khuôn mặt là gì?

Phát hiện khuôn mặt là quá trình xác định khuôn mặt của một người trong ảnh hoặc video. Việc này được thực hiện bằng cách phân tích đầu vào trực quan để xem các đặc trưng khuôn mặt có xuất hiện hay không.

Vì khuôn mặt con người rất đa dạng, các mô hình phát hiện khuôn mặt thường cần được huấn luyện trên lượng dữ liệu đầu vào lớn để đạt độ chính xác. Bộ dữ liệu huấn luyện phải đại diện đủ cho những người đến từ các nền tảng, giới tính và văn hóa khác nhau.

Các thuật toán này cũng cần được cung cấp nhiều mẫu huấn luyện với điều kiện ánh sáng, góc chụp và hướng khác nhau để có thể dự đoán đúng trong các tình huống thực tế.

Những sắc thái này khiến phát hiện khuôn mặt trở thành một nhiệm vụ không hề đơn giản và tốn thời gian, đòi hỏi hàng giờ huấn luyện mô hình và hàng triệu mẫu dữ liệu.

May mắn là gói OpenCV đi kèm các mô hình đã được huấn luyện sẵn cho phát hiện khuôn mặt, nghĩa là chúng ta không phải huấn luyện thuật toán từ đầu. Cụ thể hơn, thư viện sử dụng một phương pháp học máy gọi là Haar cascade để nhận diện đối tượng trong dữ liệu hình ảnh.

Hướng dẫn dùng OpenCV để phát hiện khuôn mặt

Trong phần này, chúng ta sẽ áp dụng một phương pháp phổ biến có tên Haar Cascade để phát hiện khuôn mặt bằng OpenCV và Python.

Chạy và chỉnh sửa mã từ hướng dẫn trực tuyến này

Chạy mã

Giới thiệu về bộ phân loại Haar Cascade

Phương pháp này lần đầu được giới thiệu trong bài báo Rapid Object Detection Using a Boosted Cascade of Simple Features của Paul Viola và Michael Jones.

Ý tưởng đằng sau kỹ thuật này là sử dụng một chuỗi (cascade) các bộ phân loại để phát hiện các đặc trưng khác nhau trong ảnh. Các bộ phân loại này sau đó được kết hợp thành một bộ phân loại mạnh có thể phân biệt chính xác giữa mẫu có chứa khuôn mặt người và mẫu không có.

Bộ phân loại Haar Cascade tích hợp trong OpenCV đã được huấn luyện trên một tập dữ liệu lớn về khuôn mặt người, nên không cần huấn luyện thêm. Chúng ta chỉ cần nạp bộ phân loại từ thư viện và dùng nó để phát hiện khuôn mặt trên ảnh đầu vào.

Cài đặt OpenCV cho Python

Để cài thư viện OpenCV, chỉ cần mở Command Prompt hoặc Terminal và chạy lệnh sau:

pip install opencv-python

Lệnh này chỉ hoạt động nếu bạn đã cài đặt pip trên thiết bị. Nếu muốn tìm hiểu thêm về trình quản lý gói pip, bạn có thể đọc PIP Python Tutorial của chúng tôi.

Dùng OpenCV để phát hiện khuôn mặt trong ảnh

Chúng ta sẽ xây dựng một bộ dò để nhận diện khuôn mặt người trong một bức ảnh từ Unsplash. Hãy lưu ảnh vào thư mục làm việc của bạn và đổi tên thành input_image trước khi thực hành.

Bước 1: Import gói OpenCV

Bây giờ, hãy import OpenCV và nhập đường dẫn ảnh đầu vào với các dòng mã sau:

import cv2

imagePath = 'input_image.jpg'

Bước 2: Đọc ảnh

Tiếp theo, chúng ta cần đọc ảnh bằng hàm imread() của OpenCV:

img = cv2.imread(imagePath)

Điều này sẽ nạp ảnh từ đường dẫn tệp chỉ định và trả về dưới dạng một mảng Numpy. 

Hãy in kích thước của mảng này:

img.shape
(4000, 2667, 3)

Lưu ý đây là một mảng 3 chiều. Các giá trị của mảng lần lượt biểu thị chiều cao, chiều rộng và số kênh của ảnh. Vì đây là ảnh màu nên có ba kênh để biểu diễn - xanh lam, xanh lục và đỏ (BGR). 

Lưu ý rằng trong khi thứ tự thông dụng để biểu diễn ảnh là RGB (Red, Green, Blue), thư viện OpenCV lại dùng bố cục ngược lại (Blue, Green, Red).

Bước 3: Chuyển ảnh sang thang xám

Để tăng hiệu quả tính toán, trước tiên chúng ta cần chuyển ảnh này sang thang xám trước khi phát hiện khuôn mặt:

gray_image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

Giờ hãy xem kích thước của ảnh xám này:

gray_image.shape
(4000, 2667)

Lưu ý mảng này chỉ còn hai giá trị vì ảnh là thang xám và không còn kênh màu thứ ba.

Bước 4: Nạp bộ phân loại

Hãy nạp bộ phân loại Haar Cascade đã được huấn luyện sẵn tích hợp trong OpenCV:

face_classifier = cv2.CascadeClassifier(
    cv2.data.haarcascades + "haarcascade_frontalface_default.xml"
)

Lưu ý chúng ta đang dùng tệp haarcascade_frontalface_default.xml. Bộ phân loại này được thiết kế riêng để phát hiện các khuôn mặt nhìn thẳng trong dữ liệu hình ảnh. 

OpenCV cũng cung cấp những mô hình huấn luyện sẵn khác để phát hiện các đối tượng khác trong ảnh - như mắt, nụ cười, phần thân trên của người, thậm chí cả biển số xe. Bạn có thể tìm hiểu thêm về các bộ phân loại tích hợp trong OpenCV bằng cách xem kho GitHub của thư viện.

Bước 5: Thực hiện phát hiện khuôn mặt

Bây giờ chúng ta có thể phát hiện khuôn mặt trên ảnh xám bằng bộ phân loại vừa nạp:

face = face_classifier.detectMultiScale(
    gray_image, scaleFactor=1.1, minNeighbors=5, minSize=(40, 40)
)

Hãy phân tích các phương thức và tham số trong đoạn mã trên:

  1. detectMultiScale():

Phương thức detectMultiScale() được dùng để nhận diện các khuôn mặt với kích thước khác nhau trong ảnh đầu vào.

  1. grey_image:

Tham số đầu tiên trong phương thức này là grey_image, chính là ảnh thang xám chúng ta đã tạo trước đó.

  1. scaleFactor:

Tham số này dùng để giảm tỉ lệ kích thước của ảnh đầu vào, giúp thuật toán dễ phát hiện các khuôn mặt lớn hơn. Ở đây chúng ta đặt hệ số tỉ lệ là 1.1, tức giảm kích thước ảnh đi 10%.

  1. minNeighbors:

Bộ phân loại theo cascade áp dụng cửa sổ trượt qua ảnh để phát hiện khuôn mặt. Bạn có thể hình dung các cửa sổ này là các hình chữ nhật. 

Ban đầu, bộ phân loại sẽ thu được rất nhiều dương tính giả. Chúng được loại bỏ bằng tham số minNeighbors, quy định số lượng hình chữ nhật lân cận cần được phát hiện để một đối tượng được coi là phát hiện hợp lệ.

Tóm lại, đặt giá trị nhỏ như 0 hoặc 1 cho tham số này sẽ dẫn đến nhiều dương tính giả, còn giá trị quá lớn có thể khiến bỏ lỡ nhiều dương tính thật.

Mẹo là tìm điểm cân bằng giúp loại bỏ dương tính giả mà vẫn nhận diện chính xác các dương tính thật.

  1. minSize:

Cuối cùng, tham số minSize đặt kích thước tối thiểu của đối tượng cần phát hiện. Mô hình sẽ bỏ qua các khuôn mặt nhỏ hơn kích thước tối thiểu này.

Bước 6: Vẽ hộp giới hạn

Giờ khi mô hình đã phát hiện các khuôn mặt trong ảnh, hãy chạy những dòng mã sau để tạo hộp giới hạn quanh các khuôn mặt đó:

for (x, y, w, h) in face:
    cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 4)

Biến face là một mảng gồm bốn giá trị: tọa độ trục x và y nơi phát hiện khuôn mặt, cùng với chiều rộng và chiều cao. Đoạn mã trên lặp qua các khuôn mặt đã nhận diện và tạo một hộp giới hạn bao quanh theo các kích thước này.

Tham số 0,255,0 biểu thị màu của hộp giới hạn là xanh lục, và 4 là độ dày của đường viền.

Bước 7: Hiển thị ảnh

Để hiển thị ảnh với các khuôn mặt đã phát hiện, trước hết chúng ta cần chuyển ảnh từ định dạng BGR sang RGB:

img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

Bây giờ, hãy dùng thư viện Matplotlib để hiển thị ảnh:

import matplotlib.pyplot as plt



plt.figure(figsize=(20,10))
plt.imshow(img_rgb)
plt.axis('off')

Đoạn mã trên sẽ tạo ra kết quả như sau: 

kết quả phát hiện khuôn mặt

Tuyệt vời!

Mô hình đã phát hiện thành công khuôn mặt người trong ảnh này và tạo hộp giới hạn quanh nó. 

Phát hiện khuôn mặt theo thời gian thực với OpenCV

Sau khi đã phát hiện khuôn mặt trên ảnh tĩnh bằng OpenCV, hãy xem cách thực hiện điều tương tự trên luồng video trực tiếp. 

Bước 1: Điều kiện tiên quyết

Đầu tiên, hãy import thư viện OpenCV và nạp mô hình Haar Cascade giống như ở phần trước. Bạn có thể bỏ qua khối mã này nếu đã chạy từ trước:

import cv2

face_classifier = cv2.CascadeClassifier(
    cv2.data.haarcascades + "haarcascade_frontalface_default.xml"
)

Bước 2: Truy cập webcam

Giờ chúng ta cần truy cập camera của thiết bị để đọc luồng video trực tiếp. Có thể làm điều này bằng đoạn mã sau:

video_capture = cv2.VideoCapture(0)

Lưu ý chúng ta đã truyền tham số 0 cho hàm VideoCapture(). Điều này bảo OpenCV sử dụng camera mặc định trên thiết bị. Nếu bạn gắn nhiều camera, có thể thay đổi giá trị tham số này cho phù hợp.

Bước 3: Nhận diện khuôn mặt trong luồng video

Bây giờ, hãy tạo một hàm để phát hiện khuôn mặt trong luồng video và vẽ hộp giới hạn quanh chúng:

def detect_bounding_box(vid):
    gray_image = cv2.cvtColor(vid, cv2.COLOR_BGR2GRAY)
    faces = face_classifier.detectMultiScale(gray_image, 1.1, 5, minSize=(40, 40))
    for (x, y, w, h) in faces:
        cv2.rectangle(vid, (x, y), (x + w, y + h), (0, 255, 0), 4)
    return faces

Hàm detect_bounding_box nhận khung hình video làm đầu vào.

Trong hàm này, chúng ta dùng cùng các đoạn mã như trước để chuyển khung hình sang thang xám trước khi phát hiện khuôn mặt.

Sau đó, chúng ta cũng phát hiện khuôn mặt trong ảnh này với các giá trị tham số scaleFactor, minNeighbors và minSize giống như trước đó.

Cuối cùng, chúng ta vẽ một hộp giới hạn màu xanh lục với độ dày 4 quanh khung hình.

Bước 4: Tạo vòng lặp để phát hiện theo thời gian thực

Giờ chúng ta cần tạo một vòng lặp while vô hạn để lấy khung hình video từ webcam và áp dụng hàm phát hiện khuôn mặt cho nó:

while True:

    result, video_frame = video_capture.read()  # read frames from the video
    if result is False:
        break  # terminate the loop if the frame is not read successfully

    faces = detect_bounding_box(
        video_frame
    )  # apply the function we created to the video frame

    cv2.imshow(
        "My Face Detection Project", video_frame
    )  # display the processed frame in a window named "My Face Detection Project"

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

video_capture.release()
cv2.destroyAllWindows()

Sau khi chạy đoạn mã trên, bạn sẽ thấy một cửa sổ tên là My Face Detection Project xuất hiện trên màn hình:

kết quả phát hiện khuôn mặt

Thuật toán sẽ bám theo khuôn mặt của bạn và tạo một hộp giới hạn màu xanh lục xung quanh bất kể bạn di chuyển ở đâu trong khung hình.

Trong khung hình trên, mô hình nhận diện khuôn mặt của tôi và cả bức ảnh trên bằng lái mà tôi đang giơ lên.

Bạn cũng có thể kiểm tra hiệu quả của mô hình bằng cách giơ nhiều bức ảnh khác nhau hoặc nhờ nhiều người đứng ở các góc khác nhau phía sau camera. Mô hình sẽ có thể nhận diện tất cả khuôn mặt người trong các bối cảnh hoặc điều kiện ánh sáng khác nhau.

Nếu muốn thoát chương trình, bạn có thể nhấn phím “q” trên bàn phím để thoát vòng lặp.

Kết luận

Tóm lại, OpenCV là một thư viện mạnh mẽ và linh hoạt để xây dựng các ứng dụng thị giác máy tính, cung cấp nhiều mô hình và công cụ được huấn luyện sẵn giúp đơn giản hóa những tác vụ phức tạp như phát hiện khuôn mặt.

Dù bạn xử lý ảnh tĩnh hay luồng video trực tiếp, OpenCV mang đến một điểm khởi đầu dễ tiếp cận để tạo ra các giải pháp hiệu quả và có khả năng mở rộng.

Bằng cách nắm vững các kỹ thuật trong hướng dẫn này, bạn sẽ sẵn sàng khám phá những ứng dụng nâng cao hơn của thị giác máy tính trong các dự án của mình.


Natassha Selvaraj's photo
Author
Natassha Selvaraj
LinkedIn
Twitter

Natassha là một chuyên viên tư vấn dữ liệu làm việc tại giao điểm giữa khoa học dữ liệu và tiếp thị. Cô tin rằng dữ liệu, khi được sử dụng khôn ngoan, có thể truyền cảm hứng cho sự phát triển vượt bậc của cá nhân và tổ chức. Là một chuyên gia dữ liệu tự học, Natassha thích viết các bài báo giúp những người theo đuổi khoa học dữ liệu bước chân vào ngành. Các bài viết trên blog cá nhân cũng như trên các ấn phẩm bên ngoài của cô thu hút trung bình 200 nghìn lượt xem mỗi tháng.

Câu hỏi thường gặp

OpenCV có thể dùng để phát hiện các đối tượng khác ngoài khuôn mặt không?

Có. OpenCV hỗ trợ phát hiện đối tượng cho nhiều hạng mục như mắt, nụ cười, phương tiện và thậm chí cả biển số xe bằng các bộ phân loại Haar Cascade đã huấn luyện sẵn. Ngoài ra, OpenCV có thể kết hợp với các mô hình phát hiện đối tượng hiện đại như YOLO hoặc SSD để phát hiện đa đối tượng mạnh mẽ và chính xác hơn.

Làm thế nào để xử lý nhiều khuôn mặt trong một ảnh bằng OpenCV?

Phương thức detectMultiScale() của OpenCV tự động phát hiện tất cả khuôn mặt trong một ảnh bằng cách tạo hộp giới hạn cho từng khuôn mặt. Bạn có thể lặp qua các hộp giới hạn trả về để xử lý hoặc gắn nhãn từng khuôn mặt riêng lẻ. Ví dụ:

for (x, y, w, h) in faces:
    cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 4)  # Draw boxes for all detected faces

OpenCV có thể hoạt động với các mô hình học sâu để phát hiện khuôn mặt không?

Có. OpenCV hỗ trợ các mô hình học sâu cho phát hiện khuôn mặt, chẳng hạn sử dụng các mô hình DNN huấn luyện sẵn như Caffe hoặc TensorFlow. Mô-đun cv2.dnn của OpenCV cho phép tích hợp các mô hình này để phát hiện khuôn mặt nâng cao và chính xác hơn so với Haar cascade. Ví dụ, bạn có thể dùng mô hình MobileNet-SSD để phát hiện khuôn mặt theo thời gian thực:

net = cv2.dnn.readNetFromCaffe('deploy.prototxt', 'res10_300x300_ssd_iter_140000.caffemodel')
Chủ đề
Python
Trí tuệ Nhân tạo

Học AI với các khóa học này!

Khóa học

Các khái niệm về Generative AI

2 giờ
121.2K
Tìm hiểu cách ứng dụng AI tạo sinh có trách nhiệm. Tìm hiểu cách phát triển các mô hình AI tạo sinh và tác động của chúng đến xã hội trong tương lai.
Xem chi tiếtRight Arrow
Bắt Đầu Khóa Học
Xem thêmRight Arrow
Liên quan

blog

Claude Opus 4.6: Tính năng, Điểm chuẩn, Bài kiểm tra thực hành và hơn thế nữa

Mô hình mới nhất của Anthropic dẫn đầu ở mã hóa tác tử và lập luận phức tạp. Thêm vào đó, nó có cửa sổ ngữ cảnh 1M.
Matt Crabtree's photo

Matt Crabtree

10 phút

Xem ThêmXem Thêm