Trong đề tài này, em sẽ đề xuất hai phương pháp để cắt ảnh: phương pháp cắt ảnh sử dụng tọa độ và phương pháp cắt ảnh sử dụng mask.
3.3.1. Cắt ảnh sử dụng tọa độ
Một hình ảnh là 1 mảng 3 chiều bao gồm chiều dài, chiều rộng và RGB. Cắt ảnh sử dụng tọa độ tức là ta sẽ sử dụng tọa độ để chọn ra các phần tử mảng tương ứng của ảnh và lưu/viết ra 1 file riêng. Ưu điểm của phương pháp này là đơn giản, nhanh nhưng chỉ thực hiện được với những hình đơn giản (hình vuông, hình chữ nhật, hình tròn …) chứ không thực hiện được với những hình có hình dạng phức tạp (hình ngôi sao, …)
Để lấy được tọa độ các vị trí đỗ xe, ta có thể làm theo 2 cách:
- Cách 1: Sử dụng phần mềm thứ 3 để lấy tọa độ, sau đó lưu lại các tọa độ này vào 1 fle txt hoặc viết trực tiếp vào trong code. Những phần mềm phù hợp với yêu cầu bài toán có thể kể đến như Paint hay LabelImg. Ưu điểm của chúng là dễ sử dụng và đặc biệt là với phần mềm Paint, ta có thể dễ dàng kiểm soát được hình dạng của hình cắt 1 cách trực quan nhất, bao gồm cả vị trí lẫn kích thước chính xác của hình cắt.
Hình 3. 15: Giao diện phần mềm Paint sử dụng để cắt ảnh
- Cách 2: Sử dụng chương trình python để trực tiếp chọn ra các vị trí trên hình.
Chương trình lấy tọa độ này sẽ gồm các chức năng như sau: Hiện hình ảnh 46
lên cửa sổ chương trình, sử dụng chuột chọn vị trí trực tiếp trên ảnh (mouse event) và in tọa độ ra file mỗi khi thao tác chuột.
Hình 3. 16: Các contour được vẽ trực tiếp lên cửa sổ chương trình
Ưu điểm của phương pháp này là nhanh, tuy nhiên, nếu như khi sử dụng phần mềm thứ 3 ta có thể vẽ sẵn contour sau đó kéo thả về vị trí mình muốn trước khi lấy tọa độ thì với phương pháp này ta chỉ vẽ 1 lần và chương trình sẽ đưa ra tọa độ luôn, chính vì vậy nên vị trí và kích thước cắt sẽ có độ dao động. Ngoài ra với các kiểu hình vẽ khác nhau có thể cần phải sử dụng chương trình khác nhau với các chức năng mouse event, cách lưu điểm và cờ khác nhau
# Mouse-click activate
if event == cv2.EVENT_LBUTTONDOWN:
min_point = (x, y)
# Mouse-release activate
elif event == cv2.EVENT_LBUTTONUP:
max_point = (x, y)
Đoạn code trên hỗ trợ thực hiện lấy tọa độ theo phương pháp kéo-thả chuột. Tọa độ được lấy khi click chuột trái và khi thả chuột bằng cách sử dụng các cờ tương ứng (EVENT_LBUTTONDOWN và EVENT_LBUTTONUP). Các tọa độ này sẽ được in ra fle txt, bao gồm tọa độ (x, y) tại điểm góc phía trên bên trái và tọa độ góc phía dưới bên phải. 2 cặp tọa độ này là đủ để tính toán ra 2 tọa độ còn lại cũng như cắt hình.
47
Hình 3. 17: Tọa độ được lưu vào file text
Với những tọa độ đã tìm được, để cắt hình vuông (hay hình chữ nhật) phục vụ cho dataset, ta chỉ cần sử dụng những tọa độ này để tách mảng chứa thông tin của ảnh ra một mảng mới và in/viết ảnh này ra fle
img_cut = img[y_min[i]:y_max[i], x _min[i]:x_max[i]]
48
Dưới đây là hình ảnh kết quả cắt các vị trí đỗ:
Hình 3. 18: Hình ảnh cắt các vị trí đỗ xe
Chương trình thực hiện:
for i in range(1, 24): # Loop through 23 coordinates set
img_cut = image[y_min[i]:y_max[i], x_min[i]:x_max[i]]
cv2.imwrite(os .path.join('D:/HUST/LAB/Digital IC
Design/PKLotProject/20-5/Slot %d' % i, filename), img_cut)
Đoạn chương trình trên thực hiện vòng lặp qua tất cả 23 vị trí đỗ xe trong bãi đỗ và cắt hình, in hình cắt tương ứng với mỗi bộ tọa độ ra fle nhằm phục vụ cho việc training.
Khi cắt ảnh sử dụng tọa độ thu được từ chương trình sẽ có 2 tình huống xấu có thể xảy ra:
- Kích thước ảnh không chính xác như ta mong muốn: Khi cắt ảnh bằng phương pháp kéo thả ta có thể dễ dàng nhìn ra được vị trí của 2 tọa độ của contours (góc trên bên trái và góc dưới bên phải). Tuy nhiên ta lại khó kiểm soát được độ dài của các cạnh (ta có thể vẽ thành hình chữ nhật trong khi hình ta cần là hình vuông). Với những trường hợp này, ta sẽ phải có thêm 1 bước resize ảnh về kích thước mong muốn. Do khi chọn mốc ta đã chú ý về kích thước của hình nên sai số khi resize sẽ là không đáng kể, nhất là khi trong training set của mạng CNN hệ thống sử dụng đã có bao gồm những
ảnh tăng cường có độ co giãn nhất định
49
- Vị trí cắt không chính xác như ta mong muốn: Khi cắt ảnh bằng phương pháp click chuột 1 lần, và từ tọa độ của mouse event lần lượt nội suy ra tọa độ của 4 điểm góc của contours, thì hình ảnh sẽ được cắt theo kích thước chính xác như ta muốn. Tuy nhiên chỉ với 1 lần click chuột ta sẽ khó hình dung được vị trí chính xác của các vị trí được nội suy, đặc biệt là khi kích thước ảnh hiển thị trên màn hình khá nhỏ và không phải kích thước thật.
3.3.2. Cắt ảnh sử dụng mask
Với những hình cắt đơn giản (hình chữ nhật) ta có thể sử dụng phương án trên, tuy nhiên trong nhiều trường hợp với những vị trí đỗ xe chéo so với góc chiếu camera, việc cắt theo hình vuông sẽ khiến cho ảnh cắt của mình chứa 1 phần của các ô tô khác đỗ cạnh đó, gây ra nhiễu loạn thông tin và sẽ cho ra kết quả sai khi phân loại (Hình 3. 19)
Hình 3. 19: Sử dụng contours hình vuông và hình thoi
Với những trường hợp này, ta cần cắt hình dựa theo mask tạo trước. Ưu điểm của phương pháp này là có thể sử dụng để cắt hình với bất kỳ hình dạng nào mình cần mà không bị giới hạn, tuy nhiên thời gian để tạo ra 1 mask sẽ lâu hơn so với thời gian lấy tọa độ (trường hợp làm thủ công bằng phần mềm thứ 3) và sẽ phức tạp hơn khi chọn kích thước cho từng vị trí đỗ xe (trường hợp sử dụng phần mềm)
50
Hình 3. 20: Ví dụ về cách sử dụng phần mềm Paint 3D để tạo mask
Để tạo mask bằng phần mềm (chẳng hạn phần mềm Paint 3D), ta chỉ cần bôi đen phần không cần thiết và giữ màu trắng tại vị trí hình mà mình muốn cắt. Cách thực hiện được thể hiện trên Hình 3. 20.
Với trường hợp tạo mask bằng chương trình code thì đơn giản hơn, trước tiên ta tạo ra 1 ảnh Greyscale có độ chói bằng 0 và kích thước bằng với kích thước của ảnh tham chiếu. Sau đó với tọa độ chọn từ mouse event, chương trình sẽ đưa ra vị trí các góc còn lại và nối liền các góc đó lại với nhau tạo thành 1 contour liền mạch. Cuối cùng sẽ thực hiện thuật toán Hole Filling để tô màu cho các contours đó tạo thành các blob.
Hình 3. 21: Hình minh họa mask với 4 blob cho 4 vị trí đỗ
Tiếp đó, ta sẽ cho 2 hình ảnh bãi đỗ và mask qua 1 cổng AND để kết hợp 2 hình lại với nhau. Hình cắt sau này sẽ được cắt trên ảnh kết hợp này.
51
Hình 3. 22: Kết quả sau khi kết hợp hình ảnh bãi đỗ và mask vừa tạo
Để cắt hình, ta sử dụng tọa độ các blob trong mask, những tọa độ blob này cũng chính là tọa độ của những vị trí đỗ xe mà ta đã chọn. Do tính chất của 1 ảnh, ảnh được cắt lúc này sẽ vẫn là hình vuông hoặc hình chữ nhật (với phần viền bên ngoài vị trí đỗ được tô màu đen). Sau khi cắt sẽ cần có thêm 1 bước xử lý để xoay ảnh về với hình vuông.
# Find contours
cnt, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_SIMPLE)
for c in cnt:
# Top left coordinates (x, y), width (w) and height (h) of bounding box
x, y, w, h = cv2.boundingRect(c)
# Cutting
img_cut = com[y:y+h, x:x+w]
Tuy nhiên, tùy với tình hình của bãi đỗ mà contours sẽ có kích thước cũng như góc xoay khác nhau mà ta không thể nhận diện được. Chính vì vậy nên sẽ rất khó để thực hiện thuật toán xoay ảnh bởi việc tìm ra được góc xoay chính xác là rất phức tạp. Cách thức hợp lý hơn sẽ là sử dụng Homography: Ta sẽ tìm ra các điểm cực của blob (ngoài cùng bên trái, phía trên cùng, ngoài cùng bên phải, và phía dưới cùng), sau đó sử dụng những điểm này để xoay hình về đồng thời resize hình về kích thước mong muốn.
52
Hình 3. 23: Kết quả sau khi thực hiện Warping 3.4. Kết quả đạt được
Kết quả chúng ta đạt được từ các quá trình được trình bày ở trên là hình ảnh nhỏ chụp từng vị trí đỗ của bãi đỗ xe. Những hình ảnh này sẽ là tài liệu để phục vụ cho công việc tiếp theo đó là phân loại trạng thái của từng vị trí đỗ xe. Dưới đây là hình ảnh kết quả thu được.
Hình 3. 24: Kết quả ảnh phục vụ cho quá trình phân loại 3.5. Kết luận chương
Việc xây dựng và triển khai các công việc trong khối Image Processing là rất cần thiết. Vì nó là sự bắt đầu cho toàn bộ hệ thống nhận dạng chỗ đỗ xe ô tô. Vậy nên, nhóm nghiên cứu đã làm rất sát với những gì đã tìm hiểu được ở chương trước.
53
Với hình ảnh tham khảo và các hình ảnh thực tế tiếp theo của bãi đỗ xe, ta đã chuyển đổi không gian màu, loại bỏ nhiễu, xác định vị trí các điểm mốc cũng như các vị trí đỗ: trước đó, ta cần xác định tọa độ các điểm mốc và các vị trí đỗ của hình ảnh tham khảo. Hiện nay, việc này đang được thực hiện thủ công trên phần mềm paint. Sau đó, với những hình ảnh thực tế đưa vào khi camera không bị lệch so với tọa độ của ảnh tham khảo thì chúng ta thực hiện cắt ảnh ngay, còn đối với những hình ảnh khi camera bị lệch thì ta sẽ xác nhận xem hình ảnh đó có xử lý được tiếp hay không? Nếu không thể xử lý chương trình sẽ báo lỗi chỉnh lại camera do lệch quá nhiều. Nếu xử lý được ta tiếp tục xác định số lượng điểm mốc so với hình ảnh tham khảo có lớn hơn 2 không? Nếu không lớn hơn 2 sẽ không xử lý được nữa và sẽ thông báo lỗi, còn nếu thỏa mã điều kiện số lượng mốc lớn hơn 2 chúng ta đi đến bước nắn ảnh theo các tọa độ của hình ảnh tham khảo, sau đó thực hiện cắt ảnh các vị trí đỗ. Cuối cùng, chúng ta sẽ tạo được thành những file ảnh nhỏ chụp các vị trí đỗ để phục vụ cho công việc tiếp theo.
Bài toán ban đầu thực sự đưa cho chúng ta một kết quả như mong đợi nhưng vẫn còn những điểm cần cải thiện. Trong tương lai, nhóm nghiên cứu sẽ phát triển xử lý hình ảnh khi chúng ta chỉ cần biết hai điểm mốc và trực tiếp nhận diện vị trí đỗ xe mà không cần phải chọn tọa độ thủ công nữa.
54
KẾT LUẬN 1. Kết luận
Hiện nay, với các bãi đỗ xe thông thường dành cho ô tô thì mất khá nhiều thời gian ở khâu đi tìm vị trí đỗ xe, hoặc xảy ra tình trạng xe vào bãi nhưng không còn vị trí trống. Tình trạng này gây mất thời gian và phiền toái cho phương tiện cũng như người quản lý bãi xe. Xuất phát từ thực trạng này, chúng tôi đã thiết kế và xây dựng lên mô hình nhận dạng trạng thái của bãi đỗ. Giải pháp sử dụng các camera giám sát trong bãi đỗ xe để nhận dạng vị trí đỗ xe. Mang lại hiệu quả cao cho các hoạt động ra vào tại bãi xe.
Dự án mặc dù mới được phát triển nhưng đem lại kết quả khá chính xác trong việc nhận dạng vị trí. Tuy nhiên, cũng không thể tránh được những hạn chế khi bắt tay vào xây dựng một hệ thống mới như việc áp dụng chưa được trải rộng khắp các bãi đỗ xe trên toàn thành phố, yếu tố ngoại cảnh có thể ảnh hưởng đến việc xác nhận sai của từng vị trí đỗ xe …
2. Hướng phát triển của luận văn trong tương lai
Để khắc phục những hạn chế còn gặp phải. Tương lai chúng ta hướng tới hệ thống tự động hóa hoàn toàn được cải thiện qua từng bước như: xác định các vị trí mốc khi hình ảnh chỉ xuất hiện hai điểm mốc, trực tiếp nhận diện vị trí đỗ xe mà không cần phải chọn tọa độ thủ công… Chúng ta sẽ áp dụng không chỉ trong thành phố mà còn có thể mở rộng trên toàn quốc với độ chính xác tuyệt đối. Góp phần làm giảm những khó khăn, áp lực cho người lái xe ô tô khi mật độ xe ô tô ngày càng tăng cao.
55
TÀI LIỆU THAM KHẢO
[1] "Digital Gardian," [Online]. Available: www.digitalgardian.com. [2] "Trafic Technology Today," [Online]. Available:
www.trafictechnologytoday.com.
[3] "diva-portal," [Online]. Available: www.diva- portal.org/smash/get/diva2:1321752/FULLTEXT01.pdf.
[4] "ParkingDetection," [Online]. Available: www.parkingdetection.com.
[5] "ResearchGate," [Online]. Available: www.researchgate.net. [6] "Semanticscholar," [Online]. Available:
pdfs.semanticscholar.org/9457/bbe1db6cbe2d91e75585f67f2b0a61e10cf6.pdf.