Cách phát hiện và nhận dạng biển số xe ô tô bằng Python
Công nghệ phát hiện và nhận dạng biển số xe có nhiều ứng dụng. Nó có thể được sử dụng trong các hệ thống đường bộ, bãi đậu xe không bán vé, khu dân cư kiểm soát ra vào phương tiện, v.v. Công nghệ này kết hợp tầm nhìn máy tính và Trí tuệ nhân tạo.
Bạn sẽ sử dụng Python để tạo chương trình phát hiện và nhận dạng biển số xe. Chương trình sẽ lấy hình ảnh đầu vào, xử lý nó để phát hiện và nhận dạng biển số xe, cuối cùng hiển thị các ký tự của biển số làm đầu ra.
Mục Lục
Thiết lập môi trường Python
Để thoải mái làm theo hướng dẫn này, bạn cần phải làm quen với những điều cơ bản về Python. Điều này bắt đầu với việc thiết lập môi trường của chương trình.
Trước khi bắt đầu viết mã, bạn cần cài đặt một số thư viện trong môi trường của mình. Mở bất kỳ IDE Python nào và tạo một tệp Python. Chạy từng lệnh trên thiết bị đầu cuối để cài đặt thư viện tương ứng. Bạn nên cài đặt trước Python PIP trên máy tính của mình.
Tesseract OCR là gì và cách cài đặt nó trên máy tính của bạn
Tesseract OCR là một công cụ có thể nhận dạng các ký tự của ngôn ngữ. Bạn nên cài đặt nó trên máy tính trước khi sử dụng thư viện pytesseract. Làm như vậy:
- Mở bất kỳ trình duyệt dựa trên Chrome nào
- Tải xuống thiết lập Tesseract OCR
- Chạy thiết lập và cài đặt nó như bất kỳ chương trình nào khác
Sau khi chuẩn bị xong môi trường và cài đặt tesseract OCR, bạn đã sẵn sàng viết mã cho chương trình.
1. Nhập thư viện
Bắt đầu bằng cách nhập các thư viện bạn đã cài đặt trong môi trường. Nhập các thư viện cho phép bạn gọi và sử dụng các chức năng của chúng trong dự án.
import cv2
import imutils
import pytesseract
Bạn cần nhập khẩu OpenCV-Python thư viện như cv2. Nhập các thư viện khác bằng cùng tên mà bạn đã sử dụng để cài đặt chúng.
2. Lấy thông tin đầu vào
Sau đó trỏ pytesseract đến vị trí cài đặt công cụ Tesseract. Lấy hình ảnh ô tô làm đầu vào bằng cách sử dụng cv2.imread hàm số. Thay thế tên hình ảnh bằng tên của hình ảnh bạn đang sử dụng. Lưu trữ hình ảnh trong cùng thư mục với dự án của bạn để giữ mọi thứ dễ dàng.
pytesseract.pytesseract.tesseract_cmd = 'C:\Program Files\Tesseract-OCR\tesseract.exe'
original_image = cv2.imread('image3.jpeg')
Bạn có thể thay thế hình ảnh đầu vào sau bằng hình ảnh bạn muốn sử dụng.
3. Tiền xử lý đầu vào
Thay đổi kích thước chiều rộng hình ảnh thành 500 pixel. Sau đó chuyển đổi hình ảnh sang thang độ xám như chức năng phát hiện cạnh canny chỉ hoạt động với hình ảnh thang độ xám. Cuối cùng, hãy gọi cho song phươngFilter có chức năng giảm nhiễu trong ảnh.
original_image = imutils.resize(original_image, width=500 )
gray_image = cv2.cvtColor(original_image, cv2.COLOR_BGR2GRAY)
gray_image = cv2.bilateralFilter(gray_image, 11, 17, 17)
4. Phát hiện Biển số xe trên Đầu vào
Dò biển số là quá trình xác định bộ phận trên xe có ký tự của biển số.
Thực hiện phát hiện cạnh
Bắt đầu bằng cách gọi cv2.Canny chức năng sẽ tự động phát hiện các cạnh trên hình ảnh được xử lý trước.
edged_image = cv2.Canny(gray_image, 30, 200)
Chính từ các cạnh này, chúng ta sẽ tìm thấy các đường viền.
Tìm đường viền
Gọi cv2.findContours chức năng và chuyển một bản sao của hình ảnh có viền. Chức năng này sẽ phát hiện các đường viền. Vẽ xung quanh các đường viền được phát hiện trên ảnh gốc bằng cách sử dụng cv2.drawContours hàm số. Cuối cùng, xuất hình ảnh gốc với tất cả các đường viền có thể nhìn thấy được vẽ.
contours, new = cv2.findContours(edged_image.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
img1 = original_image.copy()
cv2.drawContours(img1, contours, -1, (0, 255, 0), 3)
cv2.imshow("img1", img1)
Chương trình vẽ tất cả các đường viền mà nó tìm thấy trên hình ảnh ô tô một cách rõ ràng.
Sau khi tìm thấy các đường viền, bạn cần sắp xếp chúng để xác định các ứng cử viên tốt nhất.
Sắp xếp các đường viền
Sắp xếp các đường viền dựa trên diện tích tối thiểu 30. Bỏ qua những cái bên dưới vì chúng ít có khả năng là đường viền biển số xe. Tạo một bản sao của hình gốc và vẽ top 30 đường nét trên ảnh. Cuối cùng, hiển thị hình ảnh.
contours = sorted(contours, key = cv2.contourArea, reverse = True)[:30]
screenCnt = None
img2 = original_image.copy()
cv2.drawContours(img2, contours, -1, (0, 255, 0), 3)
cv2.imshow("img2", img2)
Bây giờ có ít đường viền hơn so với lúc đầu. Các đường viền duy nhất được vẽ là những đường gần đúng chứa biển số xe.
Cuối cùng, bạn cần lặp lại các đường viền đã sắp xếp và xác định xem đâu là biển số.
Vòng qua 30 đường viền hàng đầu
Tạo một vòng lặp for để lặp qua các đường viền. Tìm đường bao có bốn góc, xác định chu vi và tọa độ của nó. Lưu trữ hình ảnh đường bao chứa biển số xe. Cuối cùng, vẽ đường viền biển số xe trên ảnh gốc và hiển thị nó.
count = 0
idx = 7for c in contours:
contour_perimeter = cv2.arcLength(c, True)
approx = cv2.approxPolyDP(c, 0.018 * contour_perimeter, True)
if len(approx) == 4:
screenCnt = approx
x, y, w, h = cv2.boundingRect(c)
new_img = original_image [ y: y + h, x: x + w]
cv2.imwrite('./'+str(idx)+'.png',new_img)
idx += 1
break
cv2.drawContours(original_image , [screenCnt], -1, (0, 255, 0), 3)
cv2.imshow("detected license plate", original_image )
Sau khi lặp, chương trình của bạn đã xác định được đường bao chứa biển số xe. Nó chỉ vẽ trên đường viền biển số xe.
5. Nhận biết biển số xe được phát hiện
Nhận dạng biển số tức là đọc các ký tự trên ảnh cắt của biển số. Tải hình ảnh biển số xe mà bạn đã lưu trữ trước đó và hiển thị nó. Sau đó, gọi cho pytesseract.image_to_string chức năng và chuyển hình ảnh biển số xe đã cắt. Hàm này chuyển đổi các ký tự trong hình ảnh thành một chuỗi.
cropped_License_Plate = './7.png'
cv2.imshow("cropped license plate", cv2.imread(cropped_License_Plate))
text = pytesseract.image_to_string(cropped_License_Plate, lang='eng')
Biển số xe bị cắt được hiển thị bên dưới. Các ký tự trên đó sẽ là đầu ra sau này bạn sẽ in trên màn hình.
Sau khi phát hiện và nhận dạng biển số xe, bạn đã sẵn sàng để hiển thị đầu ra.
6. Hiển thị đầu ra
Đây là bước cuối cùng. Bạn in văn bản được trích xuất ra màn hình. Dòng chữ này chứa các ký tự của biển số xe.
print("License plate is:", text)
cv2.waitKey(0)
cv2.destroyAllWindows()
Đầu ra dự kiến của chương trình sẽ tương tự như hình dưới đây:
Văn bản biển số xe có thể được nhìn thấy trên thiết bị đầu cuối.
Nâng cao kỹ năng Python của bạn
Phát hiện và nhận dạng biển số ô tô bằng Python là một dự án thú vị để thực hiện. Đây là một thử thách, vì vậy nó sẽ giúp bạn tìm hiểu thêm về Python.
Khi nói đến lập trình, thực hành là cốt lõi để thành thạo một ngôn ngữ. Để thực hành các kỹ năng của mình, bạn cần phải làm việc trong các dự án thú vị.