OpenCV C++ basic_3 기본 알고리즘 사용

최준혁·2021년 6월 19일

OpenCV_Basic

목록 보기
3/4

OpenCV 기본 알고리즘 사용

1. GaussianBlur(in_img, ret_img, kernel_size, sigma_x, sigma_y, padding)

  • kernel_size: 가우시안 필터에서 사용될 필터의 크기 결정.

  • sigma_x, y: 가우시안의 편차 정하기. 0을 넣으면 알아서 결정됨

  • padding: 바깥의 테두리를 어떻게 할건지 결정 0 = 사이즈 유지, 1 = 사이즈 축소 등.

2. Canny(in_gray_img, ret_img, threshold1, threshold2)

  • in_gray_img: 인풋되는 이미지, gray만 됨

  • threshold1, 2: 스레쉬홀드1, 2 설정

3. HoughLines(in_canny_img, ret_line, rho, theta, threshold)

  • in_canny_img: 엣지 detect된거 넣어주기

  • rho: 계산한 픽셀의 해상도. 그냥 1 사용

  • thetaL 계산할 각도의 해상도, 모든 방향을 검출하려면 CV_PI/180 이용

  • 변환된 그래프에서 라인을 검출하기 위한 최소 교차 수(몇개까지 검출할거냐), 클 수록 적게 검출함.

HoughLines는 ret_line에 값을 넣기에 빈 그림에 따로 정보를 넣어 줘야 한다. 참고로 canny에 그릴 수 있지만 본인의 roi를 설정하여 그릴 수 있다. 베스트는 roi에서 검출만 하고 이를 bitwise하여 빈 화면에 넣는 것. 그리고 add_weight를 하여 원래 화면과 합치는 것 까지 하면 완벽할듯 하다.

#include <opencv4/opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>

using namespace std;
using namespace cv;

int main(int argc, char** argv)
{
	Mat img = imread("line.jpeg");

	Mat img_gray;
	cvtColor(img, img_gray, COLOR_BGR2GRAY);

	Mat img_canny;
	Canny(img_gray, img_canny, 150, 255);

	vector<Vec2f> lines;
	HoughLines(img_canny, lines, 1, CV_PI / 180, 200);

	Mat img_hough;
	img.copyTo(img_hough);

	Mat img_lane;
	threshold(img_canny, img_lane, 150, 255, THRESH_MASK);

	for (size_t i = 0; i < lines.size(); i++)
	{
		float rho = lines[i][0], theta = lines[i][1];
		Point pt1, pt2;
		double a = cos(theta), b = sin(theta);
		double x0 = a * rho, y0 = b * rho;
		pt1.x = cvRound(x0 + 1000 * (-b));
		pt1.y = cvRound(y0 + 1000 * (a));
		pt2.x = cvRound(x0 - 1000 * (-b));
		pt2.y = cvRound(y0 - 1000 * (a));
		line(img_hough, pt1, pt2, Scalar(0,0,255), 2, 8);
		line(img_lane, pt1, pt2, Scalar::all(255), 1, 8);
	}

	imshow("img_canny", img_hough);
	imshow("img_lane", img_lane);

	waitKey(0);
	return 0;


  return 0;
}
profile
3D Vision, VSLAM, Robotics, Deep_Learning

0개의 댓글