2013-05-06 28 views
7

Tôi đang cố gắng tìm ba góc của khuôn mặt của một người, dựa trên hình ảnh 2D 2D image.Ước tính liều lượng đầu với OpenCV, C++ và hình ảnh 2D - Phương pháp hình học - Cuộn, Yaw và Pitch

Tôi đang sử dụng OpenCV với HaarCascade để tìm khuôn mặt, mắt, mũi và miệng. Nhưng tôi không tìm thấy bất kỳ phương pháp hình học nào có thể giúp tôi tìm các góc X, Y và Z (Roll, Pitch và Yaw).

Ai đó có thể giúp tôi hiển thị một số phương pháp trong C++ hoặc java hoạt động không?

+0

Đây không phải là C++ câu hỏi vì vậy tôi lấy thẻ đó. –

Trả lời

5

Cho một hình ảnh đơn và không có thông tin nào khác, không có giải pháp duy nhất cho các góc. Hãy xem xét trường hợp của Yaw. Chiếu lên mặt phẳng 2d, điều này có thể nhìn thấy như một sự thay đổi nhỏ trong khoảng cách chiếu giữa mắt và vị trí của mắt đối với mũi/miệng. Khoảng cách này không phải là một hằng số từ người này sang người khác.

Một cách điển hình xung quanh việc này là yêu cầu người dùng 'hiệu chỉnh' khuôn mặt của họ bằng cách nhìn thẳng vào máy ảnh với góc danh nghĩa '0'. Tại thời điểm này, bây giờ bạn có độ dài tham chiếu mà bạn có thể so sánh các hình ảnh tiếp theo.

Độ dài vẫn không đủ thông tin, tuy nhiên, là số tiền mà khoảng cách dự kiến ​​rõ ràng thay đổi phụ thuộc vào quang học và khoảng cách khuôn mặt từ máy ảnh. Quang học bạn thường cấu hình bằng tay; khoảng cách bạn có thể ước tính bằng cách giả định kích thước khuôn mặt 'trung bình' và giả sử hình ảnh 'danh nghĩa' phù hợp với các kích thước đó một cách hoàn hảo. Bạn có thể thực hiện điều chỉnh này nếu bạn thấy rằng nó quá mức hoặc thấp hơn ước tính các phép quay cho một khuôn mặt cụ thể.

Khi bạn đã có tất cả các giả định này, đó là hình học khá đơn giản. Bạn có thể ước tính cuộn từ dòng từ mắt qua mũi vào miệng. Bạn có thể đo khoảng cách giữa hai mắt để ước tính yaw. Cuối cùng, bạn có thể ước tính độ cao bằng cách sử dụng khoảng cách giữa mắt/miệng hoặc mắt/mũi. Lưu ý, những giả định này hoạt động tốt nhất khi khuôn mặt vẫn còn khá gần với danh nghĩa.

+0

Nhưng tôi muốn biết một số phương pháp trong C + + để làm điều này. –

0

Vì vậy, bạn muốn tìm hướng (theo góc RPY) của khuôn mặt dựa trên vị trí của mũi, mắt và miệng. Giả sử rằng tất cả ba (bốn - hai mắt) có thể nhìn thấy được, tôi sẽ sử dụng các tính năng đối xứng của khuôn mặt để xác định hướng của đầu, chẳng hạn như:

Một dòng giữa mắt có thể được sử dụng làm tài liệu tham khảo cho một trong trục (ví dụ: Pitch). Sau đó, chúng ta có thể giả định rằng trục cuộn chỉ theo hướng mũi - có thể đo được thông qua chuyển vị trí của mũi đến giữa điểm giữa hai mắt. Và cuối cùng, Yaw có thể được đo qua mối quan hệ khoảng cách giữa điểm giữa giữa mắt, vị trí của mũi và vị trí của miệng.

Tôi không biết mối quan hệ khoảng cách giữa bốn điểm quan tâm và chúng có thể khác nhau về giới tính, tuổi tác và nguồn gốc. Tuy nhiên, nếu bạn có thể tìm thấy một mối quan hệ như vậy, đạo hàm của các góc nên toán học khá thẳng về phía trước.

Ứng dụng thú vị bằng cách này!

0

Nếu bạn sử dụng trình phân loại tầng để phát hiện mắt phải, mắt trái và mũi, hãy tính trọng tâm của mỗi đối tượng địa lý (tính năng x/2, tính năng y/2) điều này sẽ cho bạn ba điểm x-y trên hình ảnh của bạn.

Bạn có thể phát hiện cuộn bằng cách xem giá trị Y của mỗi mắt, nếu giá trị cao hơn giá trị kia, có nghĩa là đầu nghiêng theo hướng giá trị Y thấp nhất (khi một mắt di chuyển lên giá trị Y khác)

Bạn có thể phát hiện ngáp bằng cách nhìn vào giá trị X của mũi, nếu người dùng nhìn sang trái, giá trị X của mũi của họ sẽ gần với giá trị X của mắt trái hơn, và giống như nhìn sang bên phải ở bên phải giá trị X của mắt.

Bạn có thể phát hiện quảng cáo chiêu hàng bằng cách xem giá trị Y của mũi, nếu người dùng nhìn lên, giá trị Y sẽ gần hơn với cả giá trị Y của mắt và nếu họ nhìn xuống, giá trị Y sẽ xa hơn giá trị mắt.

Bây giờ tất nhiên là không chính xác và sẽ không cung cấp cho bạn góc chính xác, tuy nhiên bạn có thể sử dụng thông tin này để thử và phân loại từng giá trị trong một số nhóm nhất định (nhìn về phía trước, nhìn bên trái, tìm thực sự bên trái)

Điều duy nhất tôi có thể thấy ảnh hưởng đến việc bạn tính cả ba trong một hình ảnh có thể là nếu cuộn tính toán khá mạnh, có thể phiền phức vì trục X không còn phẳng nữa.

Bạn có thể giải quyết vấn đề này bằng cách sửa hình ảnh thông qua xoay vòng 2D. Bạn sẽ cần phải tìm bao nhiêu hình ảnh cần phải được luân chuyển với

Value = (right eye Y/2) - (left eye Y/2) 

Với thông tin này, bạn có thể sửa hình ảnh và tiếp tục với chế biến (để xoay hình ảnh nhìn lên tạo ra một ma trận xoay 2D và sử dụng warp affine)

Xin lỗi nếu điều này là một chút của một hoại nhưng tôi thấy các phương pháp trên là khá thành công và tôi hy vọng nó giúp một ai đó

Các vấn đề liên quan