Xác định tọa độ các điểm mốc và các vị trí đỗ xe

Một phần của tài liệu (LUẬN văn THẠC sĩ) NHẬN DẠNG CHỖ đỗ XE ô tô BẰNG CAMERA (Trang 62)

Quá trình ban đầu để xác định tọa độ các điểm mốc, nhóm thực hiện lấy ảnh bãi đỗ xe đã được đánh dấu mốc, tính toán đo đạc vị trí các điểm mốc thông qua paint để đưa ra các tọa độ mẫu của các điểm mốc và các vị trí đỗ xe.

Hình 3. 4: Xác định tọa độ điểm mốc

39

Hình 3. 5: Xác định tọa độ các vị trí đỗ xe 3.2.2. Thực hiện nội suy tọa độ ảnh

Với yêu cầu nhận diện ra được các mốc với màu sắc và kích thước cố định, cách đơn giản nhất là sử dụng nhận diện màu sắc và kích thước thay vì sử dụng những thuật toán phức tạp khác như SIFT, ORB hay Machine Learning. Để nhận diện được màu sắc 1 cách chính xác nhất, ta sẽ sử dụng không gian màu HSV thay vì RGB. Đây là không gian màu mô phỏng lại cách con người tiếp nhận màu sắc, bao gồm cả màu sắc, độ sáng và độ xám của màu.

Do ảnh nhận được từ camera là ảnh theo RGB, ta cần có bước chuyển đổi không gian màu trong chương trình

# Convert image from RGB space to HSV space

hsv_image = cv2.cvtColor(rgb_image, cv2.COLOR_BGR2HSV)

Sau khi chuyển đổi không gian màu của ảnh sang HSV, để nhận diện màu, chỉ cần chọn ra những pixel nằm trong ngưỡng giá trị của màu đó. Trong trường hợp này, giá trị Hue của màu vàng là 30 nên ta sẽ chọn ngưỡng giá trị là 20-40. Mặc dù 2 giá trị Saturation và Value dùng để xử lý trường hợp điều kiện ánh sáng thay đổi, tuy nhiên ta sẽ không sử dụng toàn bộ khoảng giá trị của chúng do sẽ tạo ra nhiều nhiễu

# Create mask

mask = cv2.inRange(hsv_image, lower_threshold, upper_threshold)

Để tìm được giá trị Hue chính xác của 1 màu nhất định, ngoài cách tìm kiếm các bảng giá trị của màu hay sử dụng các công cụ chuyển đổi không gian màu online thì ta có thể sử dụng code python và thư viện OpenCV.

> yellow = np.uint8([[[0,255,255 ]]])

40

> hsv_yellow = cv2.cvtColor(yellow,cv2.COLOR_BGR2HSV)

> print(hsv_yellow)

Đoạn chương trình trên nhận giá trị RGB của màu vàng, sau đó quy đổi giá trị này sang giá trị tương ứng của không gian màu HSV và in ra màn hình. Ưu điểm của phương pháp này là nhanh gọn và độ chính xác cao, đặc biệt là khi khoảng giá trị của từng thành phần trong HSV không phải là cố định (có nơi dùng H theo góc của color wheel và không sử dụng khoảng giá trị 0-180) nên dùng cách này ta sẽ có chính xác giá trị cần tìm theo thang của OpenCV, thuận tiện cho khi sử dụng không cần phải quy đổi lần thứ 2.

Để đảm bảo không nhận diện sót các mốc trong các điều kiện thời tiết, ánh sáng khác nhau, ta cần chọn lựa khoảng giá trị S và V rộng hơn so với điều kiện lý tưởng. Chính vì lí do này, chương trình sẽ cho ra khá nhiều nhiễu (như là cây hơi ngà vàng) trong mask như trong Hình 3. 6.

Hình 3. 6: Hình ảnh tham khảo bị nhiễu

Trong kết quả nhận diện màu trên, rất nhiều phần trên lá cây cũng đã được nhận diện là màu vàng, điều này tạo ra khá nhiều nhiễu cho chương trình và trong trường hợp nhiễu đủ lớn sẽ gây ra trường hợp false positive (nhận diện nhầm vật khác thành mốc). Với các nhiễu thưa như trên, cách đơn giản và hiệu quả nhất để loại bỏ chính là sử dụng thuật toán Morphological Transformation Opening. Kết quả sau khi loại bỏ nhiễu bằng thuật toán Morphological Transform như sau

41

Hình 3. 7: Hình ảnh loại bỏ nhiễu bằng Morphological Transform

Như trên Hình 3. 7, hầu hết các nhiễu đã bị loại bỏ trong khi phần mốc vẫn được giữ nguyên. Ngoài Morphological Transform, chương trình cũng sẽ loại trừ các blob không chính xác bằng cách đặt điều kiện về kích thước, khu vực của mốc và mật độ pixel trắng trên 1 bounding box. Chương trình thực hiện như sau:

if 20 <= w <= 90 and 12 <= h <= 55 and 0.35 <= av <= 2.5 and 320 <= h * w

<= 4500:

if (white_pixel / (w * h)) > 0.6:

Dưới đây là hình ảnh kết quả nhận diện đầy đủ 4 mốc:

Hình 3. 8: Kết quả nhận diện đầy đủ 4 mốc với ảnh chứa mốc được triển khai thực tế

Với các tọa độ các mốc vừa tìm được, ta có thể dễ dàng phát hiện được rằng camera có bị lệch hay không với điều kiện phát hiện được ít nhất 2 mốc. Khi đó để phát hiện xem camera có bị lệch hay không, ta chỉ cần so sánh tọa độ của 2 hoặc nhiều mốc này với tọa độ của các mốc ở vị trí tương ứng trong ảnh tham chiếu. Nếu

42

các giá trị nằm trong 1 ngưỡng sai số nhất định, camera sẽ được coi như vẫn đang giữ vị trí cố định, còn không sẽ coi là bị lệch.

Trong trường hợp camera vẫn đang được giữ cố định, ta sẽ thực hiện cắt ảnh ngay lập tức. Còn trong trường hợp camera bị lệch, tùy vào mức độ lệch của camera, chương trình sẽ quyết định sử dụng phương pháp làm méo ảnh Image warping (trong trường hợp mức độ lệch vẫn còn trong khả năng xử lý của chương trình) hoặc đưa ra cảnh báo và dừng chương trình (khi mức độ lệch là quá lớn như khi bị mất vị trí đỗ xe hoặc có khả năng bị mất vị trí đỗ xe). Trong trường hợp thứ nhất, với các điều kiện về vị trí của mốc đã đặt trước, ta có thể dễ dàng phân biệt được các mốc, từ đó dễ dàng bóp méo ảnh về vị trí ban đầu dựa theo các điểm mốc. Chương trình bóp méo ảnh sẽ hoạt động nếu như tìm được thành công tối thiểu 3 điểm mốc, nếu không chương trình sẽ báo lỗi.

43

Dưới đây là kết quả sau khi thực hiện làm méo ảnh:

Hình 3. 9: Hình ảnh tham chiếu

Hình 3. 10: Hình ảnh hiện tại khi góc camera bị lệch

44

Hình 3. 11: Hình ảnh hiện tại sau khi đã thực hiện làm méo ảnh với 3 mốc

Sau khi ảnh được làm méo thành công, đồng nghĩa với việc vị trí các mốc và các vị trí đỗ xe đã được đưa về vị trí tham chiếu, ta thực hiện cắt hình các vị trí đỗ xe như bình thường sử dụng tọa độ được đặt sẵn.

Hình 3. 12: Vị trí đỗ xe được cắt theo hình tham chiếu

Hình 3. 13: Vị trí đỗ xe được cắt theo hình được làm méo với các góc camera khác nhau

Hình 3. 14: Vị trí đỗ xe được cắt theo tọa độ cho trước với các góc camera khác nhau

45

3.3. Thực hiện cắt ảnh

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

Một phần của tài liệu (LUẬN văn THẠC sĩ) NHẬN DẠNG CHỖ đỗ XE ô tô BẰNG CAMERA (Trang 62)

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

(71 trang)
w