본문 목표
이미지를 처리함에 있어서 사용자가 확인할 수 있어야 쉽게 코드를 개발할 수 있다.
사각형을 표현해야하는 경우 어떻게 사각형을 이미지에 그려넣을 수 있는지 알아보자.
키워드 : 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)) 이므로, 컬러를 표현할 수 없다.
따라서 흑백이미지에 색을 갖는 직선을 그려넣으려면 복잡한 과정이 필요하다.
결론.
이미지에 그림판에서 하는 것처럼 사각형을 그려넣을 수 있다.
사각형의 색과 선의 두께, 내부채움 여부를 사용자가 조절할 수 있다.
사각형 그리기에 있어서 방향성은 내부채움이냐 아니냐로 구분된다.
도움이 되었거나, 문제가 있는 경우 댓글로 알려주세요~!
감사의 댓글은 작성자에게 큰 힘이 됩니다 ^^
'코딩 > OpenCV' 카테고리의 다른 글
[C++ opencv] 관심영역 Region of Interest (RoI) 사용 방법 (0) | 2020.07.21 |
---|---|
[C++ opencv] 이미지에 원 그리기, circle( ) (0) | 2020.07.21 |
[C++ opencv] 이미지에 선, 직선 그리기 (0) | 2020.07.21 |
[C++ opencv] "이미지 복사" 개념 이해하기 .copyTo (0) | 2020.07.21 |
[C++ opencv] High pass filter (HPF)로 윤곽선 검출, edge detection (1) | 2020.07.15 |
댓글