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();
}
#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();
}
#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();
}
#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();
}
#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_blur
는 gaussianblur
가 적용된 영상이고, 오른쪽의 frame_canny_edge
는 canny_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)
Author And Source
이 문제에 관하여(OpenCV를 이용한 차선 검출 예제 풀이(작성중)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@happy5368/OpenCV를-이용한-차선-검출-예제-풀이작성중저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)