본문 바로가기
코딩/OpenCV

[C++ opencv] 이미지에 사각형 그리기, rectangle( )

by DIYver 2020. 7. 21.

본문 목표

이미지를 처리함에 있어서 사용자가 확인할 수 있어야 쉽게 코드를 개발할 수 있다.

 

사각형을 표현해야하는 경우 어떻게 사각형을 이미지에 그려넣을 수 있는지 알아보자.

 

 

 

 

키워드 : rectangle( )

 

 

 

 

 

알아볼 함수 원형

- 사각형 그리기 ( rectangle )

	Mat img = imread("lane.png", 1);

	Mat img_rectangle;
	img.copyTo(img_rectangle);
	
	rectangle(img_rectangle, Rect(Point(200, 200), Point(300, 300)), Scalar(0, 0, 255), 1, 8, 0);
	rectangle(img_rectangle, Rect(400, 400, 100, 100), Scalar(0, 0, 255), 1, 8, 0);
	

 

rectangle( img , Rect , Scalar(b, g, r), thickness, lineType, shift )

 

  ○ img : 사각형을 그려넣을 이미지 입력

 

  ○ Rect : 사각형의 범위

      ■ Rect( Point(x1, y1), Point(x2, y2) )  :  두 좌표를 이용한 사각형 범위

      ■ Rect( x, y, width, height )  :  x, y 좌표에서부터 width 와 height 까지의 사각형 범위 

  두 방법 중 택 1

 

  ○ scalar(b, g, r) : 선의 색상을 b, g, r 순으로 입력

- 하얀색의 경우 (255,255,255) 를 써도 되고

  간편하게 Scalar::all(255) 를 사용하면 됨

  

  ○ thickness : 선의 굵기를 설정할 수 있음

  

  ○ lineType : 선의 타입을 설정 가능,

      ■ FILLED : 안을 채워 넣음 , -1

      ■ LINE_4 : 4 connected line , 4

      ■ LINE_8 : 8 connected line , 8

      ■ LINE_AA : 안티앨리어싱 , 16

 

  ○ shift : 사용될 일 없으니 그냥 0을 사용하면 된다.

 

 

 

 

 

 

lineType 에 대해서 부연설명을 해보자면,

 

FILLED는 내부를 채우는 방식인데,

사용법이 살짝 이상하다.

 

thickness 를 입력해야할 자리에 CV_FILLED  또는  FILLED  또는  -1  를 입력하면 된다.

 

이렇게 사용해야 내부가 채워지므로, 주의해야한다.

 

 

 

LINE_4 와 LINE_8 은 

rectangle( ) 에서는 큰 의미가 없으므로, 그냥 기본값을 사용한다.

 

 

LINE_AA 는 안티앨리어싱으로

 

 

왼쪽 이미지가 원본 직선이라면

확대 시킨 것이 오른쪽 이미지이다.

 

이때 오른쪽 이미지에 회색의 픽셀들이 다수 관찰되는데

이렇게 생긴 것들이 안티앨리어싱의 결과이다.

 

부드럽게 선을 표현하고자할 때 사용한다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

코드 테스트 결과

- CODE

#include <opencv2/opencv.hpp>


using namespace cv;
using namespace std;


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

	Mat img_rectangle;
	img.copyTo(img_rectangle);
	
	rectangle(img_rectangle, Rect(Point(200, 200), Point(300, 300)), Scalar(0, 0, 255), 1, 4, 0);
	rectangle(img_rectangle, Rect(400, 200, 100, 100), Scalar(255, 0, 0),CV_FILLED, 8, 0);	// 내부 채우기
	
	imshow("img", img);
	imshow("img_line", img_rectangle);
	waitKey(0);
	return 0;
}

 

- RESULT

아무 이미지를 불러온다.

 

 

그리고 사각형을 만들어 줄 이미지 변수를 새로 만들고

.copyTo( ) 함수를 이용해서 데이터를 복사해준다.

 

 

사각형을 두 개 그리는데,

 

첫 번째로는 사각형의 범위를 Rect( Pt1, Pt2 )를 이용했다.

 

두 번째로는 사각형의 범위를 Rect( x, y, width, height) 를 이용했다.

그리고 내부채움으로 옵션값을 주었다.

 

결과는 위와 같게 나온다.

 

내부채움이 된 것을 확인할 수 있다.

 

 

 

 

위에서 다루지 않은 것이 있는데,

바로 grayscale 이미지에는 직선을 흑백으로 표현할 수밖에 없다.

grayscale 은 8UC1 (8 bit, Unsigned, Channel, 1(one)) 이므로, 컬러를 표현할 수 없다.

따라서 흑백이미지에 색을 갖는 직선을 그려넣으려면 복잡한 과정이 필요하다.

 

 

 

 

 

 

 

결론.

 

이미지에 그림판에서 하는 것처럼 사각형을 그려넣을 수 있다.

 

사각형의 색과 선의 두께, 내부채움 여부를 사용자가 조절할 수 있다.

 

사각형 그리기에 있어서 방향성은 내부채움이냐 아니냐로 구분된다.

 

 

 

 

 

 

 

 

 

도움이 되었거나, 문제가 있는 경우 댓글로 알려주세요~!

감사의 댓글은 작성자에게 큰 힘이 됩니다 ^^

댓글