BOUNDING BOX HÌNH CHỮ NHẬT

Một phần của tài liệu Nhóm_10 (Trang 29)

Cái tên nói lên tất cả, bounding box hình chữ nhật sẽ chỉ có một định dạng là hình chữ nhật và tọa độ của nó được xác định thông qua tọa độ của một đỉnh và chiều width, height. Ngoài ra đối với một số hình chữ nhật nằm nghiêng còn có thêm góc xoay. Có 2 dạng bounding box hình chữ nhật cho một object đó là Bounding box hình chữ nhật đứng (các cạnh song song với các trục tung và trục hoành) và hình chữ nhật xoay (các cạnh không vuông góc với trục tung và trục hoành). Bounding box hình chữ nhật đứng phù hợp với các vật thể có tư thế thẳng hoặc ngang. Các trường hợp vật thể nằm chéo sẽ phù hợp với hình chữ nhật xoay.

Hàm cv2.boundingRect() giúp tìm ra Bounding box hình chữ nhật đứng. Hàm cv2.minAreaRect() tìm ra Bounding box diện tích nhỏ nhất bao quanh

Từ contour, ta sẽ xác định tọa độ góc trên bên trái và độ dài cạnh width, height của contour thông qua hàm cv2.boundingRect(). Từ đó vẽ bounding box hình chữ nhật đứng lên hình ảnh gốc.

Hình 2.19: Bounding box để xác định biển số a, Ảnh gốc b, Ảnh xác định biển số

KẾT LUẬN

Ở chương này, ta đã nghiên cứu một số phương pháp sử lý hình ảnh, các cơ sở lý thuyết, các công thức toán học của các phương pháp để áp dụng cho đề tài nghiên cứu.

CHƯƠNG 3: THỰC NGHIỆM 3.1 Áp dụng lý thuyết chương 2 để hình thành một bài code

import cv2 #khai báo thư viện opencv

import pytesseract #khai báo thư viện tesseract

pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files (x86)\Tesseract- OCR\tesseract.exe' # doc anh image = cv2.imread('m1.jpg')

# chuyen anh sang thang do xam

gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) cv2.imshow('anh xam',gray_image) cv2.waitKey(0)

# Loại bỏ nhieu với bộ lọc hai bên lặp đi lặp lại

gray_image = cv2.bilateralFilter(gray_image,5, 25, 25) cv2.imshow("loc nhieu", gray_image) cv2.waitKey(0)

#phat hien canh

canny_edge = cv2.Canny(gray_image, 100, 200) cv2.imshow('phat hien canh',canny_edge) cv2.waitKey(0)

# Tìm đường viền dựa trên Cạnh

contours, new = cv2.findContours(canny_edge.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)

contours=sorted(contours, key = cv2.contourArea, reverse = True)[:30] # vẽ 30 contourts lớn nhất

img2 = image.copy() cv2.drawContours(img2, contours, -1, (0,255,0), 3) cv2.imshow(" top 30 contours", img2) cv2.waitKey(0)

# Khởi tạo đường viền biển số xe và tọa độ x,y

contour_with_license_plate = None license_plate = None x = None y = None w = None h = None

# Tìm Chu vi đường viền và nó phải là một đường viền kín perimeter = cv2.arcLength(contour, True)

approx = cv2.approxPolyDP(contour, 0.02 * perimeter, True) if len(approx) == 4: #see whether it is a Rect

contour_with_license_plate = approx x, y, w, h = cv2.boundingRect(contour)

license_plate = gray_image[y:y + h, x:x + w]break #Vẽ đường viền đã chọn trên hình ảnh gốc

cv2.drawContours(image, [approx], -1, (0,255,0), 3) cv2.imshow("xac dinh bien so tren anh goc", image) cv2.waitKey(0)

#nhận diện biển số

text = pytesseract.image_to_string(license_plate) print("Thong tin nhan dien :", text) cv2.imshow("bien so",license_plate) cv2.waitKey(0)

3.2 Kết quả thực hiện

Quá trình thực hiện sẽ được chia ra làm các giai đoạn như sau: ➢ Giai đoạn 1: chuyển ảnh sang thang đo đọ xám

import cv2 import pytesseract

pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files

(x86)\TesseractOCR\tesseract.exe' image = cv2.imread('m1.jpg') gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) cv2.imshow('anhxam',gray_image) cv2.waitKey(0)

Hình 3.20: Đưa ảnh về thang độ xám a, biển chữ nhật b, biển vuông

➢ Giai đoạn 2: xử lý nhiễu

gray_image = cv2.bilateralFilter(gray_image, 5, 25, 25) cv2.imshow("loc nhieu", gray_image) cv2.waitKey(0)

Kết quả thu được sẽ là:

Hình 3.21: Loại bỏ nhiễu của ảnh a, biển chữ nhật b, biển vuông

➢ Giai đoạn 3: chạy hàm để dò biên của ảnh. canny_edge =

cv2.Canny(gray_image, 100, 200) cv2.imshow('phat hien canh',canny_edge) cv2.waitKey(0)

Hình 3.22: Tìm đường viền của ảnh a, biển chữ nhật b, biển vuông

➢ Giai đoạn 4: Từ các biên trên ta đi tìm các đường viền lớn nhất để giảm thiểu

thời gian sử lý cho các giai đoạn sau:

contours, new = cv2.findContours(canny_edge.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)

contours=sorted(contours, key = cv2.contourArea, reverse = True)[:30] img2 = image.copy() cv2.drawContours(img2, contours, -1, (0,255,0), 3) cv2.imshow(" top 30 contours", img2) cv2.waitKey(0)

Kết quả thu được như sau:

Hình 3.23: Tìm các contours

a, biển chữ nhật b, biển vuông

➢ Giai đoạn 5: Tìm vị trí của biển số từ những đường viền vừa tìm được ở

trên.

contour_with_license_plate = None license_plate = None x = None y = None w = None h = None for contour in contours:

perimeter = cv2.arcLength(contour, True)

approx = cv2.approxPolyDP(contour, 0.02 * perimeter, True) if len(approx) == 4:

contour_with_license_plate = approx x, y, w, h = cv2.boundingRect(contour)

license_plate = gray_image[y:y + h, x:x + w] break

Kết quả sẽ thu được tọa độ của biển số biểu diễn bởi 4 tham sô x,y,w,h từ đó ta xẽ xác định được vị trí của biển số vào khoanh vùng nó bằng lệnh sau: cv2.drawContours(image, [approx], -1, (0,255,0), 3)

cv2.imshow("xac dinh bien so tren anh goc", image) cv2.waitKey(0)

Kết quả sẽ được như sau:

Hình 3.24: Xác định vị trí của biển số a, biển chữ nhật b, biển vuông

➢ Giai đoạn 6: Cắt biển số và nhận diện biển số.

license_plate = gray_image[y:y + h, x:x + w] text =

pytesseract.image_to_string(license_plate) print("Thong tin nhan dien :", text) cv2.imshow("bien so",license_plate) cv2.waitKey(0)

Hình 3.25: Cắt và tách biển số a, biển chữ nhật b, biển vuông Và một bảng hiển thị biển số dạng text như hình:

Hình 3.26: Kết quả cuối cùng in ra dạng text biển hình chữ nhật

TỔNG KẾT LẠI

Khi sử dụng các lệnh trên ta đã nhận diện được biể số của một xe bất kì từ ảnh chụp khi xe đi vào bãi đỗ xe.

3.3 Nhận xét

Chương trình có thể nhận diện được nhiều loại biển số khác nhau, dù là biển hình chữ nhật hay hình vuông vẫn có thể xác định chính xác vị trí của biển số để từ đó đưa ra kết quả cuối cùng về thông tin bên trong biển số đấy. Tuy nhiên vẫn còn một số hạn chế như là chương trình không thể xử lý được ảnh quá nhiễu, điều này trong thực tế khó có thể xảy ra vì trong ứng dụng của đề tài là ở bãi đỗ xe, hình ảnh xẽ được lấy trực tiếp từ camera trong bãi đỗ, chất lượng hình ảnh sẽ khá cao đủ để chương trình có thể chạy một cách chính xác.

TÀI LIỆU THAM KHẢO

[1] M. S. &. B. Sankur, "Survey over image thresholding techniques and quantitative performance evaluation". Journal of Electronic Imaging., 2004.

[2] N. Otsu, "A threshold selection method from gray-level histograms"., 1979. [3] D. Liu, "Otsu method and K-means". Ninth International Conference on Hybrid

Intelligent Systems IEEE., 2009.

[4] P.-S. Liao, "A fast algorithm for multilevel thresholding" (PDF)., 2001.

[5] L. a. W. L. a. Y. T. Jianzhuang, "Automatic thresholding of gray-level pictures using two-dimension Otsu method"., 1991.

[6] J. B. MacQueen, Some Methods for classification and Analysis of Multivariate Observations., 1967.

[7] S. P. Lloyd, "Least square quantization in PCM", 1957,1982.

[8] A. Coates and A. Y. Ng, "Learning feature representations with k-means" (PDF)., 2012.

[9] F. Schwenker, H. A. Kestler and G. Palm, "Three learning phases for radial- basisfunction networks"., 2001.

[10] D. Lin and X. Wu, Phrase clustering for discriminative learning (PDF)., 2009. [11] W. H. Press, S. A. Teukolsky, W. T. Vetterling and B. P. Flannery, "Section 16.1. Gaussian Mixture Models and k-Means Clustering"., 2007.

[12] K. P. Murphy, Machine learning : a probabilistic perspective. Cambridge, Mass., 2012.

[13] M. R. a. S. J. R. Suhakar, Image Compression using..

[14] J. C. Dunn, "A Fuzzy Relative of the ISODATA Process and Its Use in Detecting Compact Well-Separated Clusters"., 1973.

[15] J. C. Bezdek, Pattern Recognition with Fuzzy Objective Function Algorithms., 1981.

[16] M. N. Ahmed, S. M. Yamany, N. Mohamed, A. A. Farag and T. Moriarty, "A Modified Fuzzy C-Means Algorithm for Bias Field Estimation and Segmentation of MRI Data", 2002.

[17] T. Banerjee, "Day or Night Activity Recognition From Video Using Fuzzy Clustering Techniques". IEEE Transactions on Fuzzy Systems., 2014.

[18] K. Alireza, A. Kashani, N. Milani, P. Akhlaghi and K. Khezri, Robust Color Classification Using Fuzzy Reasoning and Genetic Algorithms in RoboCup Soccer Leagues., 2008.

[19] Y. a. C. M. Tian, Extiction of viscous Hamiltion-Jacobi equations, 2009.

[20] S. B. a. F. Meyer, The morphological approach to segmentation: the watershed transformation..

[21] R. L. C. M. D. Barnes, Priority-flood: An optimal depression-filling and watershed-labeling algorithm for digital elevation models., 2014.

[22] R. Barnes, Parallel priority-flood depression filling for trillion cell digital elevation models on desktops or clusters., 2016.

[23] J.-Y. A. M. C. a. R. K. Cédric Allène, "Some links between min-cuts, optimal spanning forests and watersheds", 2009.

[24] N. R. Pal and S. K. Pal, "A review on image segmentation techniques", 1993. [25] D. a. J. S. Mumford, Optimal approximations by piecewise smooth functions and

associated variational problems., 1989.

[26] T. a. L. V. Chan, Active contours without edges. IEEE Trans. Image Process., 2001.

[27] B. a. C. M. Zhou, Level set evolution for boundary extraction based on a p- Laplace equation., 2010.

[28] C. a. Systems, Conference Proceedings, China International Conference., 1991. C. C. X. Y. C. G. a. M. F. Li, Level set evolution without re-initialization: A new variational formulation. Proceedings of the International Conference on Computer Vision and Pattern Recognition, 2005.

Một phần của tài liệu Nhóm_10 (Trang 29)

Tải bản đầy đủ (DOCX)

(39 trang)
w