opencv c++ line() 함수를 이용한 선 그리기

  • 최초 작성일: 2022년 11월 21일(월)

목차

[TOC]


목표

이미지 처리 개발 시, 사용자가 직접 확인할 수 있으면 더 좋지 않을까?

내가 불러온 이미지 파일에 직선을 그려 넣으려면 어떻게해야 하는지 알아보자.



실습

함수 원형

line(Input Output array, pt1, pt2, scalar(B,G,R), thickness, lineType, shift)

  • Input Output array: 입력 이미지
  • pt1, pt2: 직선의 양 끝 좌표, Point(x, y)
  • scalar(B,G,R): 직선의 RGB 색상 정보를 B, G, R 순으로 입력
    • 흰색의 경우 (255, 255, 255) 혹은 Scalar::all(255) 사용
  • thickness: 직선의 굵기
  • lineType: 직선의 타입
    • FILLED: 안을 채워 넣음
    • LINE_4: 4 connected line, 4
    • LINE_8: 8 connected line, 8
    • LINE_AA: 안티앨리어싱, 16
  • shift: 사용될 일 없으니, 그냥 0으로 사용


lineType에 대해 부연 설명하자면,

직선을 그릴 때에는 FILLED는 사용될 일이 없을 것이고,

LINE_4와 LINE_8 의 차이를 살펴보면,


LINE_4는 4방향,

LINE_8은 8방향을 의미한다.

image

즉, LINE_4 옵션은 4 방향으로 선이 연결이 되고,

LINE_8 옵션은 8 방향으로 선이 연결되어 대각선으로도 표현이 가능하다.

image

왼쪽 직선을 보면 픽셀들이 가로/세로로 연결이 되어있는 것을 볼 수 있으며, 이것이 LINE_4 방식이다.

오른쪽 직선은 대각선으로 픽셀들이 연결되어 있는 것을 볼 수 있으며, 이것이 LINE_8 방식이다.

opencv 에서는 LINE_8 이 디폴트 값이다.

LINE_8 혹은 8 을 입력하면 된다.


소스 코드

#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main(int ac, char** av)
{
	Mat img = imread("road.png", 1);
	
	Mat img_line;
	img.copyTo(img_line);  

	line(img_line, Point(230, 370), Point(450, 450), Scalar::all(255), 1, 8, 0);		// white line
	line(img_line, Point(230, 370), Point(0, 450), Scalar::all(255), 1, 8, 0);			// white line
	line(img_line, Point(230, 370), Point(231, 330), Scalar(0, 250, 0), 1, LINE_4, 0);	// green line
	line(img_line, Point(230, 370), Point(220, 600), Scalar(0, 0, 255), 2, 8, 0);		// red line

	imshow("img", img);
	imshow("img_line", img_line);

	waitKey(0);
	return 0;
}

결과

image

왼쪽 이미지가 원본이고, 원본 이미지에 임의로 좌표를 이용해 직선들을 그어보았다.


이때, line() 함수는

입력, 출력 이미지가 같기 때문에 미리 사용할 이미지를 복사해서 사용하는 것이 좋다.