산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

곡선 차선 감지

스토리

소개

모든 운전 시나리오에서 차선은 교통 흐름과 차량이 운전해야 하는 위치를 나타내는 필수 구성 요소입니다. 자율주행차를 개발할 때 좋은 출발점이기도 합니다! 이전의 차선 감지 프로젝트를 기반으로 훨씬 더 잘 작동하고 까다로운 환경에 더 강력한 곡선형 차선 감지 시스템을 구현했습니다.

차선 감지 시스템은 OpenCV 라이브러리를 사용하여 Python으로 작성되었습니다. 현재 이미지 처리 파이프라인은 다음과 같습니다.

이전 시스템의 한계

이전 차선 감지 프로젝트에서 이미지에서 직선 차선을 감지할 수 있는 매우 간단한 차선 감지 시스템을 개발했습니다. 완벽한 조건에서 제대로 작동했지만 곡선 차선을 정확하게 감지하지 못했고 장애물과 그림자에 강하지 않았습니다. 이 버전은 이러한 두 가지 제한 사항을 모두 개선합니다.

왜곡 보정

카메라 렌즈는 들어오는 빛을 왜곡하여 카메라 센서에 초점을 맞춥니다. 이는 환경의 이미지를 캡처하는 데 매우 유용하지만 결국 빛을 약간 부정확하게 왜곡하는 경우가 많습니다. 이는 컴퓨터 비전 애플리케이션에서 부정확한 측정을 초래할 수 있습니다. 그러나 이 왜곡을 쉽게 수정할 수 있습니다.

어떻게 하시겠습니까? 알려진 물체에 대해 이미지를 보정하고 렌즈 왜곡을 설명하는 왜곡 모델을 생성할 수 있습니다.

이 개체는 종종 아래와 유사한 비대칭 바둑판입니다.

보정 체커보드(OpenCV Docs)

테스트 비디오에 사용된 카메라는 왜곡 모델을 생성하는 데 사용된 체커보드 사진 20장을 찍는 데 사용되었습니다. 먼저 이미지를 회색조로 변환한 다음 cv2.findChessboardCorners() 함수를 적용합니다. 우리는 이 체스판이 전적으로 직선을 가진 2차원 개체라는 것을 이미 알고 있으므로 감지된 모서리에 일부 변형을 적용하여 적절하게 정렬할 수 있습니다. 왜곡 계수와 카메라 매트릭스를 얻기 위해 cv2.CalibrateCamera()를 사용했습니다. 카메라가 보정되었습니다!

그런 다음 cv2.undistort()를 사용하여 나머지 입력 데이터를 수정할 수 있습니다. 아래에서 바둑판의 원본 이미지와 수정된 이미지의 차이를 확인할 수 있습니다.

보정 체커보드가 포함된 이미지에 왜곡 보정이 적용되었습니다.

여기에 내가 사용한 정확한 코드가 있습니다.

def undistort_img():
# 객체 포인트 준비 0,0,0 … 8,5,0
obj_pts =np.zeros((6*9,3), np.float32)
obj_pts[:,:2] =np.mgrid[0:9, 0:6].T.reshape(-1,2)
# 모든 이미지의 모든 객체 점 및 img 점을 저장합니다.
objpoints =[]
imgpoints =[]
# 모든 보정 이미지에 대한 디렉토리 가져오기
images =glob.glob('camera_cal/*.jpg')
for indx, fname in enumerate (이미지):
img =cv2.imread(fname)
회색 =cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, 모서리 =cv2.findChessboardCorners(회색, (9,6) ), 없음)
ret ==True인 경우:
objpoints.append(obj_pts)
imgpoints.append(corners)
# img에서 왜곡 방지 테스트
img_size =( img.shape[1], img.shape[0])
# 카메라 보정
ret, mtx, dist, rvecs, tvecs =cv2.calcera(objpoints, imgpoints, img_size, None,None)
dst =cv2.undistort(img, mtx, dist, None, mtx)
# 나중에 사용하기 위해 카메라 보정을 저장합니다.
dist_pickle ={}
dist_pickle['mtx'] =mtx
dist_pickle['dist' ] =dist
pickle.dump( dist_pickle, open('camera_cal/cal_pickle.p', 'wb') )
def undistort(img, cal_dir='camera_cal/cal_pickle.p'):
#cv2.imwrite('camera_cal/test_cal.jpg', dst)
open(cal_dir, mode='rb')을 f:
file =pickle.load(f) mtx =파일 ['mtx']
dist =파일['dist']
dst =cv2.undistort(img, mtx, dist, None, mtx)
dst 반환
undistort_img()
img =cv2.imread('camera_cal/calibration1.jpg')
dst =undistort(img) # 왜곡되지 않은 이미지

이에 사용되는 함수는 Jupyter 노트북의 코드 아래에서도 찾을 수 있습니다. 섹션.

도로 이미지에 적용된 왜곡 보정은 다음과 같습니다. 미세한 차이는 못 느낄 수도 있지만 이미지 처리에 큰 영향을 미칠 수 있습니다.

운전 장면에 적용된 왜곡 보정

원근 왜곡

카메라 공간에서 곡선 차선을 감지하는 것은 그리 쉬운 일이 아닙니다. 차선을 조감도로 볼 수 있다면 어떨까요? 이는 이미지에 원근 변환을 적용하여 수행할 수 있습니다. 다음과 같습니다.

원근법 왜곡된 이미지

눈에 띄는 것이 있습니까? 차선이 평평한 2D 표면에 있다고 가정하면 차선 공간에서 차선을 정확하게 나타낼 수 있는 다항식을 맞출 수 있습니다! 멋지지 않나요?

변환 행렬을 가져오기 위해 cv2.getPerspectiveTransform() 함수를 사용하고 이미지에 적용하기 위해 cv2.warpPerspective() 함수를 사용하여 이러한 변환을 모든 이미지에 적용할 수 있습니다. 여기에 내가 사용한 코드가 있습니다:

def Perspective_warp(img,
dst_size=(1280,720),
src=np.float32([(0.43,0.65),(0.58,0.65),(0.1,1),(1,1) )]),
dst=np.float32([(0,0), (1,0), (0,1), (1,1)])):
img_size =np. float32([(img.shape[1],img.shape[0])])
src =src* img_size
# 목적지 지점의 경우 임의의 지점을 선택합니다.
# 뒤틀린 결과를 표시하는 데 적합합니다.
# 정확하지는 않지만 목적에 충분히 가깝습니다.
dst =dst * np.float32(dst_size)
# 주어진 src 및 dst 포인트 , 원근 변환 행렬 계산
M =cv2.getPerspectiveTransform(src, dst)
# OpenCV warpPerspective()를 사용하여 이미지 왜곡
warped =cv2.warpPerspective(img, M, dst_size)
뒤틀린 반환

소벨 필터링

이전 버전에서는 색상을 사용하여 차선을 필터링했습니다. 그러나 이것이 항상 최선의 선택은 아닙니다. 도로가 아스팔트 대신 연한 색의 콘크리트를 사용한다면 도로는 컬러필터를 쉽게 통과하고 파이프라인은 이를 흰색 차선으로 인식하게 된다. 좋지 않습니다.

대신 에지 감지기와 유사한 방법을 사용하여 이번에는 도로를 필터링할 수 있습니다. 차선은 일반적으로 도로와 대비가 높기 때문에 이를 유리하게 사용할 수 있습니다. 캐니 이전에 버전 1에서 사용된 에지 감지기는 Sobel Operator를 사용합니다. 이미지 함수의 그라디언트를 가져옵니다. OpenCV 문서에는 작동 방식에 대한 환상적인 설명이 있습니다. 이를 사용하여 차선 표시를 필터링하고 도로를 무시하기 위해 고대비 영역을 감지합니다.

HLS 색상 공간을 다시 사용하여 이번에는 채도 및 밝기의 변경 사항을 감지합니다. 소벨 연산자는 이 두 채널에 적용되며 x축에 대한 기울기를 추출하고 기울기 임계값을 통과하는 픽셀을 이미지의 픽셀을 나타내는 이진 행렬에 추가합니다. 카메라 공간과 레인 공간에서의 모습은 다음과 같습니다.

카메라에서 더 멀리 떨어진 이미지 부분은 품질이 잘 유지되지 않습니다. 카메라의 해상도 제한으로 인해 더 멀리 있는 물체의 데이터는 심하게 흐릿하고 노이즈가 있습니다. 전체 이미지에 집중할 필요가 없으므로 일부만 사용할 수 있습니다. 사용할 이미지는 다음과 같습니다.

히스토그램 피크 감지

슬라이딩이라는 특수 알고리즘을 적용합니다. 알고리즘 차선을 감지합니다. 그러나 이를 적용하기 전에 알고리즘의 좋은 시작점을 결정해야 합니다. 레인 픽셀이 있는 지점에서 시작하면 잘 작동하지만 처음에 이러한 레인 픽셀의 위치를 ​​어떻게 감지할 수 있습니까? 실제로는 정말 간단합니다!

X축에 대한 이미지의 히스토그램을 얻습니다. 아래 히스토그램의 각 부분은 이미지의 각 열에 있는 흰색 픽셀 수를 표시합니다. 그런 다음 각 차선 선에 대해 하나씩 이미지의 각 측면에서 가장 높은 봉우리를 취합니다. 바이너리 이미지 옆의 히스토그램은 다음과 같습니다.

슬라이딩 윈도우 검색

차선 경계를 나타내는 두 개의 서로 다른 곡선을 맞출 수 있도록 슬라이딩 창 알고리즘을 사용하여 왼쪽과 오른쪽 차선 경계를 구분합니다.

자세히 보기:곡선 차선 감지


제조공정

  1. 8051 마이크로컨트롤러 기반 초음파 물체 감지 회로
  2. 기본 침입 탐지 시스템
  3. 광전 센서는 ToF 감지 거리를 연장합니다.
  4. ToF 센서는 빠른 3D 감지를 제공합니다.
  5. Lidar 기술은 장거리 감지 기능을 갖추고 있습니다.
  6. 움직임 감지 경보 시스템
  7. Farmaid:식물 질병 감지 로봇
  8. KINECT 및 RASPBERRY PI를 사용한 SONBI 로봇 인간 탐지
  9. 블로그:Microarray를 통한 유전자 검출
  10. 곡면용 CNC 밀링 기술