Top Ad unit 728 × 90


Nhận dạng làn đường, sử dụng trong ô tô thông minh, hệ thống tự động lái.

Mục tiêu dự án: Phát triển một phần mềm để xác định nhận dạng làn đường trong một đoạn video từ một camera phía trước trên một chiếc xe hơi. Phát hiện các tuyến đường trong nhiều điều kiện, bao gồm thay đổi đường bộ, đường cong, và ánh sáng thay đổi.

Các bước thực hiện:

  1. Tính toán ma trận hiệu chuẩn camera và hệ số biến dạng cho một tập hợp các hình ảnh bàn cờ vua.
  2. Chỉnh sửa méo từ ảnh thô.
  3. Sử dụng các phép biến đổi màu và gradient để tạo ra một hình ảnh nhị phân .
  4. Áp dụng một phối cảnh chuyển đổi để khắc phục hình ảnh nhị phân ("birds-eye view").
  5. Phát hiện điểm ảnh làn và phù hợp với một biểu thức đa thức để tìm ranh giới làn đường.
  6. Xác định độ cong của làn đường và vị trí của xe đối với trung tâm.
  7. Che phủ ranh giới làn đường đã phát hiện trở lại hình ảnh ban đầu.
  8. Hiển thị hình ảnh của ranh giới làn đường và ước lượng số lượng đường cong và vị trí của chiếc xe trong đoạn video.
Project Video

Bước 1: Giai đoạn Hiệu chỉnh Camera

Camera thực tế sử dụng các ống kính cong để hình thành một hình ảnh, và các tia sáng thường uốn cong quá nhiều hoặc quá ít ở các cạnh của các ống kính này. Điều này tạo ra hiệu ứng bóp méo các cạnh của hình ảnh, do đó các đường kẻ hoặc các đối tượng xuất hiện nhiều hoặc ít cong hơn thực tế. Đây được gọi là biến dạng xuyên tâm, là loại biến dạng phổ biến nhất.
Có ba hệ số cần thiết để biến dạng xuyên tâm: k1, k2, và k3. Để sửa sự xuất hiện của các điểm bị bóp méo hình ảnh trong một hình ảnh, người ta có thể sử dụng một công thức chỉnh sửa được đề cập dưới đây.
CalibrationCalibration correction
Trong các phương trình sau, (x, y) là một điểm trong hình ảnh méo. Để undistort những điểm này, OpenCV tính r, đó là khoảng cách được biết giữa một điểm trong một hình ảnh undistorted (đã chỉnh lại) (xcorrected, ycreated) và tâm của ảnh bị méo , mà thường là tâm của hình ảnh đó (xc, yc) . Điểm trung tâm này (xc, yc) đôi khi được gọi là điểm tâm bóp méo. Những điểm này được mô tả ở trên.
Chức năng do_calibration () thực hiện các thao tác sau:
  1. Đọc ảnh chessboad và chuyển đổi sang ảnh xám gray scale
  2. Tìm góc của chessboard .
    • Tôi bắt đầu bằng cách chuẩn bị các điểm đối tượng, nó sẽ là tọa độ (x, y, z) của các góc ảnh bàn cờ trên thế giới. Ở đây tôi giả định rằng ảnh bàn cờ đã được cố định trên mặt phẳng (x, y) tại z = 0 sao cho các điểm đối tượng giống nhau cho mỗi ảnh hiệu chuẩn. Do đó, objp chỉ là một mảng được lặp đi lặp lại của các tọa độ, và objpoints sẽ được nối với một bản sao của nó mỗi khi tôi phát hiện thành công tất cả các góc chessboard trong một hình ảnh thử nghiệm. imgpoints sẽ được nối với vị trí pixel (x, y) của mỗi góc của mặt phẳng hình ảnh với mỗi lần phát hiện ảnh bàn cờ thành công.
  3. Thực hiện cv2.calibrateCamera () để tính hệ số co-efficients và ma trận camera mà chúng ta cần phải chuyển đổi các điểm đối tượng 3d thành 2d điểm ảnh.
  4. Lưu giá trị hiệu chuẩn trong tệp camera_cal / camera_cal.p để sử dụng sau.
Hàm get_camera_calibration() để đọc các giá trị calibration từ camera_cal/camera_cal.p file.


Bước 2: Sửa méo ảnh

Sử dụng các hệ số biến dạng và ma trận camera thu được từ giai đoạn hiệu chỉnh camera, chúng ta loại méo ảnh sử dụng chức năng cv2.undistort.
Một ảnh cờ vua mẫu và hình ảnh không bị bóp méo tương ứng :Calibration sample 1
Bằng cách hiệu chỉnh méo , chúng ta thấy rằng các đường chessboard xuất hiện song song với hình ảnh thô ban đầu
Another sample image and corresponding undistorted image is shown below: Calibration sample 2
Chúng ta có thể thấy rằng chiếc xe bên trái xuất hiện sẽ được shift đi so với ảnh gốc ban đầu.

Bước3: Tạo một ảnh nhịn phân sử dụng color transforms và gradients

Trong giai đoạn nhị phân ảnh, nhiều phép biến đổi được áp dụng và kết hợp lại để có được hình ảnh nhị phân tốt nhất để phát hiện làn đường.
Đoạn Code sử dụng cho nhị phân ảnh là  thresholding_main.py. Chi tiết các bước trong đoạn code này sẽ được giải thích dưới đây:

Bước 3.1: Saturation thresholding:

Các hình ảnh được chuyển đổi sang không gian màu HLS để có được các giá trị bão hòa, các làn đường màu vàng được phát hiện tốt nhất trong không gian màu bão hòa. Thao tác ngưỡng này được gọi trong hàm color_thr ().Saturation 1Saturation 2

Bước 3.2: Histogram equalized thresholding:

Các hình ảnh được chuyển đổi sang dạnh ảnh xám và cân đối histogram bằng lệnh cv2.equalizeHist(), đường màu trắng được phát hiện tốt nhất bằng cách sử dụng phương pháp này. Thao tác ngưỡng này được gọi trong hàm adp_thresh_grayscale ().Histogram Equalisation


Bước 3.3: Gradient Thresholding:

Phương thức Sobel được áp dụng để lấy gradient theo hướng x và y cũng được sử dụng để có được cường độ và hướng của các ngưỡng ảnh . Để giải thích các ngưỡng này tôi sử dụng hình ảnh thử nghiệm dưới đây và áp dụng các hoạt động ngưỡng 4.Original
  • Bước 3.3.1: Gradient thresholded tại hướng x sử dụng Sobel  Thresholding được gọi trong hàm abs_sobel_thresh() .
Gradient X thresholding
  • Bước3.3.2: Gradient thresholded tại hướng y sử dụng Sobel thresholding được gọi trong hàm abs_sobel_thresh() .
Gradient Y thresholding
  • Step 3.3.3: Ngưỡng biên độ của Gradient  thresholding được gọi trong hàm mag_thresh() .
Gradient Magnitude thresholding
  • Step 3.3.4: Ngưỡng hướng của Gradient thresholding được gọi trong hàm dir_threshold() .
Gradient Directional thresholding

Bước 3.4: Tìm vùng quang trọng/cần thiết:

Để tìm vùng cần thiết cho việc tìm làn nhận dạng làn đường chúng ta sử dụng hàm region_of_interest() được thực hiên trong file perspective_regionofint_main.py.
Hình ảnh phía dưới là ảnh sau khi đã loại bỏ những vùng ảnh không cần thiết. ROI

Bước 3.5: Kết hợp bước thresholding ở trên để có được hình ảnh nhị phân tốt nhất để phát hiện làn xe.

Để có được làn đường rõ ràng rõ ràng trong hình ảnh nhị phân, các tham số ngưỡng cho các công đoạn trên phải được tinh chỉnh. Đây là phần quan trọng nhất vì những làn đường nhìn thấy rõ ràng dễ phát hiện và phù hợp với poly trong các bước tiếp theo. Quy trình tinh chỉnh được thực hiện bằng cách tương tác thay đổi các giá trị ngưỡng và kiểm tra kết quả như được hiển thị bên dưới. Ở đây khu vực cần thiêt/có ích cũng được thực hiện để có được hình ảnh nhị phân cuối cùng.
Thresholding Combined


Bước 4: Perspective transformation(Phối cảnh chuyển đổi):

Sau khi hoàn tất các tham số ngưỡng(thresholding ), chúng ta tới giai đoạn tiếp theo - Perspective transformation. Bước này là để biển đối khung ảnh chụp được với camera và kéo giản ra cho các bước sau này dễ dàng nhận dạng làn đường.
Ở đây chúng ta sử dụng hàm perspective_transform() nằm trong file perspective_regionofint_main.py.

The following images shows the perspective transformation from source to destination.
  • Ảnh 1 - Làn đường song song
    Perspective Transform 1Perspective Transform 2
  • Ảnh 2 -  Làn đường cong, ở đây làn xe xuất hiện song song với góc quan sát bình thường, nhưng khi chuyển đổi chúng ta có thể thấy rõ là các làn đường cong.Perspective Transform 3Perspective Transform 4

Bước 5: Phát hiện các pixels của làn đường và ăn khớp để tìm ranh giới làn xe.

Sau khi áp dụng hiệu chuẩn, ngưỡng và perspective transform cho ảnh làn đường, chúng ta có một hình ảnh nhị phân nơi mà các đường nét nổi bật như đã trình bày ở trên. Tiếp theo một đường cong polynomial khớp với các làn xe. Điều này được định nghĩa trong hàm for_sliding_window () trong tệp tin sliding_main.py. 

Đối với điều này, ta đầu tiên có một histogram cùng tất cả các cột ở nửa dưới của hình ảnh. Biểu đồ biểu đồ được hiển thị bên dưới.Lane ppixel histogramVới histogram nhà, chúng ta thêm các giá trị pixel dọc theo mỗi cột trong ảnh. Trong ảnh nhị phân ngưỡng (thresholded binary image) của chúng ta, pđiểm ảnh là 0 hoặc 1, vì vậy hai đỉnh nổi bật nhất trong biểu đồ này sẽ là các chỉ số tốt về vị trí x của đường cơ sở của các làn đường. Tôi sử dụng nó như là một điểm khởi đầu để tìm kiếm các đường dây. Từ đó, tôi sử dụng một cửa sổ trượt, đặt xung quanh các trung tâm dòng, để tìm và theo các đường lên trên cùng của khung. Kỹ thuật trượt cửa sổ có thể được hiển thị như trong hình dưới đây:Lane pixel histogramTrong hình trên, các cửa sổ trượt được hiển thị màu xanh lá cây, làn đường bên trái có màu đỏ, đường phải là màu xanh và phù hợp với đa thức là các đường màu vàng.

Đường liên hợp này khi áp dụng cho các khung hình video cho rất nhiều biến động giữa các khung. Tôi đã thực hiện làm mịn / trung bình trên 10 khung hình trước đó để có được làn đường được nhận dạng và không có biến động. 
Smoothened valuesỞ đây các đường màu xanh lá cây là sự phù hợp đa thức trong 10 khung hình trước và màu xanh biểu thị sự phù hợp đa thức cho khung hiện tại. Các điểm ảnh làn đường có màu hồng. Có thể nhận thấy rằng các làn đường bên trái và bên phải vượt qua nhau mà không phải là một môi trường thực tế, do đó, một tốt hơn ở đây là để xem xét đa thức trung bình của khung ảnh trong quá khứ trong những trường hợp này.

Bước 6: Xác định độ cong của làn đường và vị trí của xe đối với trung tâm.

Độ cong của làn đường f (y) được tính bằng cách sử dụng công thức R (đường cong)Curvature
Vị trí của xe được tính như sự khác biệt giữa trung tâm hình ảnh và trung tâm làn xe. Nó được thể hiện trong hình dưới đây như là độ lệch từ trung tâm

Bước 7:Chồng hình khu vực làn đường nhận dạng được với ảnh gốc.


Mapped Original

Code: Tải về ở đây
Video

Nguồn: Sujay Babruwad

Nhận dạng làn đường, sử dụng trong ô tô thông minh, hệ thống tự động lái. Reviewed by Jacky on tháng 1 01, 2018 Rating: 5

3 nhận xét:

  1. đi vào đường đất thì sao nhỉ :D

    Trả lờiXóa
  2. e là newbie, hứng thú với ứng dụng này mong ad list các bài học cần hiểu bằng python ạ vì có nhiều bài basics toàn là c++

    Trả lờiXóa
  3. chao ban,
    Sao minh download code ve thi thay khong co cac tep main.py de run project nhu youtube cua ban, ban co the gui ve emai cho minh.
    Cam on rat nhieu

    Trả lờiXóa

All Rights Reserved by Cộng Đồng OpenCV © 2017
Edit bởi: Jacky Le | Youtube Channel: JACKY LE

Biểu mẫu liên hệ

Tên

Email *

Thông báo *

Được tạo bởi Blogger.