OpenCV를 이용한 차선 검출 예제 풀이(작성중)

python으로 앞에서 하였던 차선 검출 과제를 한번 더 해볼 것이다.
OpenCV를 사용하였고, Visualstudio2019를 사용 하였다.

앞의 과제를 간략히 정리하면 다음과 같다.

동영상에서 차선 검출하기
"road.avi" 동영상에서 차선 검출하기
동영상은 opencv 폴더에서 불러오기

평가기준 :
차선 검출 성능(검출율, 처리 속도 등)
코드 내용(코드에 주석 처리 필수)

제출 서류 :
프로젝트 관련 내용 정리 파일(hwp, doc)
전체 코드 첨부
사용 알고리즘 정리
왜 사용했는지 간략하게 정리
결과 이미지 첨부

마찬가지로 어떻게 할건지 생각을 해보았고 다음과 같은 과정을 거쳐 문제를 해결해 볼 것이다.
1. 영상을 불러오기
2. 영상을 Grayscale로 변환(흑백 영상으로 변환)
3. blur 처리를 통하여 noise를 제거 (gaussian blur 사용)
4. canny edge를 통해 선을 검출
5. 선 인지를 위해 ROI를 지정
6. 이미지 비트 연산 적용 (Bit Operation)
7. cv.HoughLinesP를 이용하여 좌표값을 환산
8. Optimization 작업

1. 영상을 불러오기

#include "opencv2/opencv.hpp"
#include <iostream>
using namespace std;
using namespace cv;

int main(void)
{
	VideoCapture cap("road.avi");

	if (!cap.isOpened())
	{
		cerr << "Video open failed!" << endl;
		return -1;
	}

	Mat frame;
	while (true)
	{
		cap >> frame;
		if (frame.empty())
			break;

		imshow("frame", frame);
		waitKey(25);
	}
	destroyAllWindows();
}

frame이라는 이름으로 영상이 나오는 것을 확인할 수 있다.

2. 영상을 Grayscale로 변환(흑백 영상으로 변환)

#include "opencv2/opencv.hpp"
#include <iostream>
using namespace std;
using namespace cv;

int main(void)
{
	VideoCapture cap("road.avi");

	if (!cap.isOpened())
	{
		cerr << "Video open failed!" << endl;
		return -1;
	}

	Mat frame;
	Mat gray;

	while (true)
	{
		cap >> frame;
		cvtColor(frame, gray, COLOR_RGB2GRAY); //cvtColor(input Array, output Array, flag), COLOR_BGR2GRAY == 6
		if (frame.empty())
			break;

		imshow("frame", gray);
		waitKey(25);
	}
	destroyAllWindows();
}

영상이 grayscale 적용이 된 것을 볼 수 있다.

3. blur 처리를 통하여 noise를 제거 (gaussian blur 사용)

#include "opencv2/opencv.hpp"
#include <iostream>
using namespace std;
using namespace cv;

int main(void)
{
	VideoCapture cap("road.avi");

	if (!cap.isOpened())
	{
		cerr << "Video open failed!" << endl;
		return -1;
	}

	Mat frame;
	Mat gray;
	Mat gray_blur;

	while (true)
	{
		cap >> frame;
		cvtColor(frame, gray, COLOR_RGB2GRAY); //cvtColor(input Array, output Array, flag), COLOR_BGR2GRAY == 6
		GaussianBlur(gray, gray_blur, Size(7, 7), 0);
		if (frame.empty())
			break;

		imshow("frame1", gray);
		imshow("frame", gray_blur);
		waitKey(25);
	}
	destroyAllWindows();
}

frame은 grayscale영상이고, frame_blur은 GaussianBlur를 적용시킨 영상이다.
GaussianBlur를 적용하여 Noise가 어느정도 제거된 모습을 확인할 수 있다.

4. canny edge를 통해 선을 검출

#include "opencv2/opencv.hpp"
#include <iostream>
using namespace std;
using namespace cv;

int main(void)
{
	VideoCapture cap("road.avi");

	if (!cap.isOpened())
	{
		cerr << "Video open failed!" << endl;
		return -1;
	}

	Mat frame;
	Mat gray;
	Mat gray_blur;
	Mat img_edge;

	while (true)
	{
		cap >> frame;
		cvtColor(frame, gray, COLOR_RGB2GRAY); //cvtColor(input Array, output Array, flag), COLOR_BGR2GRAY == 6
		GaussianBlur(gray, gray_blur, Size(7, 7), 0);
		Canny(gray_blur, img_edge, 100, 150);
		if (frame.empty())
			break;

		imshow("frame_blur", gray_blur);
		imshow("frame_canny_edge", img_edge);
		waitKey(25);
	}
	destroyAllWindows();
}

왼쪽의 frame_blurgaussianblur가 적용된 영상이고, 오른쪽의 frame_canny_edgecanny_edge가 적용된 영상임을 확인할 수 있다.

5. 선 인지를 위해 ROI를 지정

참고 사이트 : https://diyver.tistory.com/53

ROI를 지정해 주기 위해 픽셀 값을 받아와야 하는데, 픽셀 값은 그림판으로 얻을 수 있었다.

내가 잡고 싶은 모습은 이렇게 어느정도 폭이 넓게 나오는 직선 구간이었고, 해당 픽셀은 다음과 같다.
(0, 420), (240, 230), (290, 230), (130, 479), (440, 479), (300, 230), (340, 230), (640, 479)

좋은 웹페이지 즐겨찾기