Professional Documents
Culture Documents
Cascade Classifiers
Quá trình nhận dạng đối tượng (trong trường hợp của chúng ta,
khuôn mặt) thường hiệu quả nếu dựa trên các tính năng tiếp
quản bao gồm thông tin bổ sung về lớp đối tượng sẽ được tiếp
quản. Trong hướng dẫn này, chúng ta sẽ sử dụng các tính năng
giống Haar và Mô hình nhị phân cục bộ (LBP) để mã hóa các
tương phản được làm nổi bật bởi khuôn mặt người và các mối
quan hệ không gian của nó với các đối tượng khác có trong
hình. Thông thường các tính năng này được trích xuất bằng
Trình phân loại Cascade phải được đào tạo để nhận biết với các
đối tượng khác nhau chính xác: phân loại của khuôn mặt sẽ
khác nhiều so với phân loại của xe hơi.
Bắt đầu
Hãy tạo một dự án JavaFX mới. Trong Trình tạo cảnh, đặt phần
tử cửa sổ để chúng ta có Đường viền với:
trên TOP một VBox một HBox và một dấu phân cách. Trong
HBox, chúng tôi đang cần phải có hai hộp kiểm, cái đầu tiên
là chọn Bộ phân loại Haar và cái thứ hai là chọn Bộ phân loại
LBP.
trên TOP một VBox một HBox và một dấu phân cách. Trong
HBox, chúng tôi đang cần phải có hai hộp kiểm, cái đầu
tiên là chọn Bộ phân loại Haar và cái thứ hai là chọn Bộ
phân loại LBP.
<CheckBox fx: id = "haarClassifier" onAction =
"#haarSelected" text = "Haar Classifier" />
<CheckBox fx: id = "lbpClassifier" onAction =
"#lbpSelected" text = "LBP Classifier" />
trong TRUNG TÂM, chúng tôi sẽ đặt ImageView cho luồng
web cam.
<ImageView fx: id = "originalFrame" />
trên BOTTOM, chúng ta có thể thêm nút thông thường để
bắt đầu / dừng luồng
<Nút fx: id = "cameraButton" căn chỉnh = "centre" text
= "Camera khởi động" onAction = "#startCamera" vô
hiệu hóa = "đúng" />
Gui sẽ trông giống như thế này:
Tải Classifiers
Trước hết chúng ta cần thêm một thư mục resource vào dự án
của chúng tôi và đặt các phân loại vào đó. Để sử dụng các trình
phân loại, chúng ta cần tải chúng từ thư mục tài nguyên, vì vậy
mỗi lần chúng ta kiểm tra một trong hai hộp kiểm, chúng ta sẽ
tải đúng trình phân loại. Để làm như vậy, hãy thực hiện
các OnAction phương thức mà chúng ta đã khai báo trước đó:
haarSelected
bên trong phương thức này, chúng ta sẽ tải Trình phân loại
Haar bị mất (ví dụ haarcascade_frontalface.xml ) như sau:
này . checkboxSelection ( "tài nguyên / lbpcascades /
lbpcascade_frontalface_alt.xml" );
...
tin trống checkboxSelection ( Chuỗi ... classifierPath )
{
// nạp phân loại (s)
cho ( Chuỗi xmlClassifier : classifierPath )
{
này . mặtCascade . tải ( xmlClassifier );
}
Ma trận hình ảnh loại CV_8U chứa hình ảnh nơi phát hiện
đối tượng.
đối tượng Vector hình chữ nhật trong đó mỗi hình chữ
nhật chứa đối tượng được phát hiện.
minSize Kích thước đối tượng tối thiểu có thể. Các đối
tượng nhỏ hơn đó được bỏ qua.
maxSize Kích thước đối tượng tối đa có thể. Các đối tượng
lớn hơn đó được bỏ qua.
Vì vậy, kết quả của việc phát hiện sẽ nằm trong tham số đối
tượng hoặc trong trường hợp của chúng ta faces .
Chúng ta hãy đặt kết quả này vào một mảng Rects và vẽ chúng
lên khung, bằng cách làm như vậy chúng ta có thể hiển thị
khuôn mặt được phát hiện là:
FaceDetection.java
FD_Controll.java <https://github.com/java-opencv/Polito-
Java-OpenCV-Tutorials-Source-Code/blob/master/Face
%20Detection/src/application/FD_Controll.java>
/ **
* Khởi tạo các biến điều khiển
*/
được bảo vệ void init ()
{
this . chụp = VideoCapture mới (); này . faceCascade
= new CascadeClassifier (); này . perfectFaceSize = 0 ; }
/ **
* Hành động kích hoạt bằng cách đẩy nút trên GUI
*/
@FXML
bảo vệ khoảng trống startCamera ()
{
nếu (! Này . CameraActive )
{
// vô hiệu hóa thiết lập hộp kiểm
này . Máy đo độ phân giải . setDisable ( đúng );
này . Máy phân tích lbp . setDisable ( đúng );
}
});
}
};
này . hẹn giờ = Timer mới (); này . hẹn giờ .
lịch trình ( frameGrabber , 0 , 33 );
// cập nhật nội dung nút
này . cameraButton . setText ( "Dừng camera"
);
}
other
{
// đăng nhập
hệ thống lỗi . err . println ( "Không thể mở kết
nối camera ..." );
}
}
khác
{
// máy ảnh không hoạt động tại thời điểm
này . cameraActive = false ;
// cập nhật lại nội dung nút
này . cameraButton . setText ( "Camera khởi động"
);
// cho phép thiết lập các hộp kiểm
này . Máy đo độ phân giải . setDisable ( sai );
này . Máy phân tích lbp . setDisable ( sai );
/ **
* Nhận khung từ luồng video đã mở (nếu có)
*
* @return {@link Image} để hiển thị
*/
private Image GrabFrame ()
{
// init mọi thứ
Image imageToShow = null ;
Khung Mat = Mat mới ();
}
Catch ( Exception e )
{
// đăng nhập
hệ thống lỗi (đầy đủ) . err . in ( "LRI" );
e . printStackTrace ();
}
}
/ **
* Thực hiện phát hiện khuôn mặt và hiển thị hình chữ nhật
xung quanh khuôn mặt được phát hiện.
*
* @param frame
*
khung hiện tại */
private void DetAndDisplay ( Khung Mat ) { // init
MatOfRect face = new MatOfRect (); Mat GrayFrame = new Mat
();
// tính toán kích thước mặt tối thiểu (20% chiều cao
khung)
nếu ( này . AbsoluteFaceSize == 0 )
{
int height = grayFrame . hàng ();
if ( Math . round ( height * 0.2f ) > 0 )
{
this . perfectFaceSize = Toán . vòng ( chiều
cao * 0,2f );
}
}
/ **
* Khi hộp kiểm Haar được chọn, bỏ chọn cái khác và tải
* trình phân loại XML thích hợp
*
*/
@FXML
được bảo vệ void haarSelected ()
{
// kiểm tra xem hộp kiểm lpb có được chọn không và bỏ
chọn
nếu ( này . LppClassifier . được chọn ())
này . Máy phân tích lbp . setSelected ( false );
/ **
*
Khi hộp kiểm LBP được chọn, bỏ chọn cái khác và tải
* trình phân loại XML thích hợp
*/
@FXML
được bảo vệ void lbpSelected ()
{
// kiểm tra xem hộp kiểm haar có được chọn không và
bỏ chọn
nếu ( này . HaarClassifier . được chọn ())
này . Máy đo độ phân giải . setSelected ( false );
/ **
* Hoạt động chung cho cả hai lựa chọn hộp kiểm
*
* @param classifierPath
* đường dẫn tuyệt đối trong đó tệp XML đại diện cho một
khóa đào tạo
* được đặt cho một trình phân loại hiện diện
*/
private void boxSelection ( String ... classifierPath )
{
// tải (các) bộ phân loại
cho ( Chuỗi xmlClassifier : classifierPath )
{
this . mặtCascade . tải ( xmlClassifier );
}
/ **
* Chuyển đổi một đối tượng Mat (OpenCV) trong Hình ảnh
tương ứng cho JavaFX
*
* @param khung
* {@link Mat} đại diện cho khung hiện tại
* @return {@link Image} để hiển thị
*/
private Image mat2Image ( mat khung )
{
// tạo một tạm thời đệm
MatOfByte đệm = mới MatOfByte ();
// mã hóa khung hình trong bộ đệm, theo định dạng
PNG
Highgui . imencode ( ".png" , khung , bộ đệm );
// xây dựng và gửi lại một hình ảnh được tạo ra từ các
hình ảnh được mã hóa trong
// đệm
trở lại mới hình ảnh ( mới ByteArrayInputStream ( đệm
. ToArray ()));
}
}
FD_FX.fxml