- 목표
openCV 활용해서 영상 내에 다양한 도형 그리기 및 글자 쓰기
- Rectangle (사각형그리기)
void rectangle(Mat& img, Point pt1, Point pt2, const Scalar& color, int thickness=1, int lineType=8, int shift=0)
- Pt1, Pt2 : 사각형을 구성하는 꼭지점 (pt2는 pt1의 반대방향에 있는것)
- Color : 색상
- thickness : 두께
- lineType: 선의 타입
- shift : 사각형을 정교하게 그리고 싶을 때 사용함
void rectangle(Mat& img, Rect rec, const Scalar& color, int thickness=1, int lineType=8, int shift=0)
Rect라는 데이터 구조를 이용. Rect(x_LT, y_LT, width, height)
int main(){
Mat image = imread("lena.jpg");
Rect rect = Rect(10, 10, 100, 100); // LT position, width, height
rectangle(image, rect, Scalar(255, 0, 0), 4, 8, 0);
imshow("image",image);
waitKey(0);
return 0;
}
- Line/Circle (선/원 그리기)
void line(Mat& img, Point pt1, Point pt2, const Scalar& color, int thickness=1, int lineType=8, int shift=0)
- pt1, pt2 : 선의 양 끝점
- lineType: 선의타입. (Ex. 8(or omitted): 8-connected line. 4: 4-connected line. CV_AA: antialiased line)
int main(){
Mat image = imread("lena.jpg");
Point p1(25, 25), p2(100, 50);
line(image, p1, p2, Scalar(255, 0, 0), 3, 8, 0);
imshow("image",image);
waitKey(0);
return 0;
}
void circle(Mat& img, Point center, int radius, const Scalar& color, int thickness=1, int lineType=8, int shift=0)
- center : 원의 중점
- radius : 원의 반지름
- Polygon (다각형 그리기)
void fillPoly(Mat& img, const Point** pts, const int* npts, int ncontours, const Scalar& color, int lineType=8, int shift=0, Point offset=Point())
다각형을 그리고 그 안을 255,0으로 채우는 함수
pts : 각각의 꼭지점들을 포함하고 있는 2차원 array
npts : 각각의 꼭지점들이 몇개가 있는가 설정해주는 1차원 array(여러개의 다각형을 동시에 그릴 수 있다.)
ncontours : 특정한 영역을 둘러싸고있는 궤적, 둘레(contour)의 개수
shift, offset : 보다 정교하게 그리기 위해있는 옵션
int main() {
Mat image = Mat::zeros(400, 400, CV_8UC3); //unsinged char, 3-channel
int w = 400;
Point trapezoid[1][4]; // 2차원 array. 점들(다각형)의 위치를 넣어줌
trapezoid[0][0] = Point(w*2 / 6, w / 4);
trapezoid[0][1] = Point(w*4 / 6, w / 4);
trapezoid[0][2] = Point(w*5 / 6, w*3 / 4);
trapezoid[0][3] = Point(w / 6, w*3 / 4);
const Point* ppt[1] = { trapezoid[0] }; // trapezoid값 받아옴.
int npt[] = { 4 };
fillPoly(image, ppt, npt, 1, Scalar(255, 255, 255), 8); // 하나의 도형만 그리는 것이기 때문에 ncontours= 1
// Scalar(255, 255, 255) -> 흰색으로 채움
imshow("image", image);
waitKey(0);
}
- Write text
void putText(Mat& img, const string& text, Point org, int fontFace, double fontScale, Scalar color, int thickness=1, int lineType=8, bool bottomLeftOrigin=false
org : text string이 위치할 위치 설정
글체(fontface), 크기(fontscale), 색상(color), 두께(thickness), 선의타입(lineType) 등으로 구성
String cv::format(const char *fmt, …)
mat frame마다 다른 text를 적고싶은 경우에 사용하는 format()함수
printf랑 유사하게 text string을 리턴해줌.
int main() {
// Create black empty images
Mat image = Mat::zeros(400, 600, CV_8UC3);
int w = image.cols; // number of columns. 이미지의 너비
int h = image.rows; // 이미지의 높이
putText(image, format("width: %d, height: %d", w, h), // text string이 들어갈 위치에 format()함수 이용. 함수내부가 pirntf랑 형식 똑같음
Point(50, 80), FONT_HERSHEY_SIMPLEX, 1,
Scalar(0, 200, 200), 4); // B = 0, G, R 각각 400 -> 노랑
imshow("image", image);
waitKey(0);
return(0);
}
이 게시물은 한동대학교 황성수 교수님의 컴퓨터비전 강의를 공부하며 정리한 내용입니다.
'Computer Vision' 카테고리의 다른 글
[OpenCV] 밝기값 변환(Intensity Transformation) (0) | 2020.01.18 |
---|---|
[OpenCV] 메모리 관리 및 픽셀 액세스(Memory Management/Pixel Access) (0) | 2020.01.11 |
[OpenCV] Mat 연산자(Mat operator) (0) | 2020.01.11 |
[OpenCV] Open CV 기초 (0) | 2020.01.09 |
[컴퓨터 비전] 색공간의 이해 (0) | 2020.01.09 |