Để đọc biển số xe được chính xác thì xe cần phải tắt đèn khi chụp ảnh. Bài toán đặt ra là phát hiện đèn xe đang bật để thông báo tắt đèn. Cụ thể là phát hiện đèn xe như trong ảnh.
Dựa vào đặc trưng của đèn xe thông thường là: màu trắng, tạo thành 1 vùng sáng lớn. Dựa vào đó giải quyết bài toán đặt ra bằng hệ màu HLS (HSL). Đọc thêm tại Không gian màu – color space
Lý thuyết
Bên dưới là hệ màu HLS, trong đó phần Lightness có 1 tỉ lệ quan trọng. Do đó sử dụng hệ màu HLS để phát hiện vùng sáng là hợp lý nhất.
Để tìm giá trị phù hợp nhất mình sử dụng tool Lọc màu ảnh – filter color. Tất nhiên có chỉnh sửa đôi chút, trong bài là chuyển từ BGR sang HSV, mình sửa lại từ BGR sang HLS. Sau khi tinh chỉnh các thông số thì giá trị tìm được là:
H = [0; 179]
L = [230; 255]
S = [0; 0]
Thử nghiệm
Qua thử nghiệm với bộ hình ảnh lấy từ bãi xe thì hầu hết thuật toán xử lý đúng
Tuy nhiên có một số trường hợp bị sai do vô tình phù hợp với thuật toán. Các trường hợp xảy ra là do ánh sáng mặt trời, ánh sáng phản chiếu,… Tùy theo vị trí lắp đặt mà có thể chỉnh thông số min size và max size của đèn để chính xác hơn.
Hoặc đèn không đủ sáng như giá trị đã set ở trên, trường hợp này không ảnh hưởng kết quả nhận dạng nên vẫn OK.
Download
Bộ hình ảnh lẫn lộn xe bật và tắt đèn: Google Drive
Source code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
void main(int argc, char** argv) { cv::Mat mat = cv::imread("image.jpg"); cv::blur(mat, mat, cv::Size(19, 19)); cv::Mat matHls; cv::cvtColor(mat, matHls, CV_BGR2HLS); cv::Mat mask; cv::Scalar lower = cv::Scalar(0, 230, 0); cv::Scalar upper = cv::Scalar(179, 255, 0); cv::inRange(matHls, lower, upper, mask); cv::imshow("mask", mask); cv::waitKey(0); } |