OpenCV를 이용한 기본 도형 그리기
#include <opencv4/opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
Mat img(300, 300, CV_8UC3, Scalar(255, 0, 0)); // 도형을 넣을 규격이 정해진 빈 화면을 그리자. 크기 row=512, column=512, 8bit_unsigned, channel=3개, Scalar=BGR
Mat imgResize;
resize(img, imgResize, Size(600, 500));
circle(imgResize, Point(150, 150), 20, Scalar(0, 255, 0), 5); // 이미지 삽입할 객체, 원의 중심점, 원의 반지름, 원의 색, 원의 꽉참 유무
rectangle(imgResize, Point(20, 20), Point(280, 280), Scalar(0, 0, 255), 5);
line(img, Point(280, 20), Point(20, 280), Scalar(0,0,0), 5);
putText(img,"korea dream", Point(50, 40),FONT_HERSHEY_SIMPLEX ,1, Scalar(0,0,255), 0.5);
Rect roi(50, 50, 200, 200);
Mat ImgCrop = img(roi);
imshow("basic_image", img);
imshow("roi_image", ImgCrop);
waitKey(0); // 윈도우 끄려면 아무거나 누르시오
return 0;
}
그림 그리는 함수 설명
<opencv2/imgproc/imgproc.hpp>
-
Mat(y, x, CV_8UC3, 색)
빈 화면 생성하기
- row, col은 기본
- CV_8UC3 = Mat 객체의 비트수를 의미함.
- CV 뒤 숫자는 픽셀 당 bit수를 의미한다.
- 그 뒤의 알파벳은 unsigned, signed, float을 의미한다.
- 그 뒤 C는 채널 수를 의미한다. 즉 full color 인지 아닌지 판단.
- 색 = Scalar
-
resize(입력 이미지, 아웃풋 이미지, 원하는 규격)
입력 이미지 사이즈 조정
- Mat 객체: 입력 이미지, 아웃풋 이미지
- Size(row, col): 원하는 규격
-
circle(입력 이미지, 중심점, 반지름, 색, 굵기)
원 그리기
- 입력 이미지: Mat객체
- 중심점: Point(row, col)
- 반지름: float32
- 색: Scalar(x,x,x)
- 굵기: float32
-
line(입력 이미지, 시작점, 끝점, 색, 굵기)
라인 그리기
- 입력 이미지: Mat
- 시작점, 끝점: Point(row, col)
- 색: Scalar
- 굵기: float32
-
rectangle(입력 이미지, 왼쪽 위점, 오른쪽 아래점, 색, 굵기)
사각형 그리기
- 입력 이미지: Mat
- 점 2개: Point
- 색: Scalar
- 굵기: float32
-
Rect roi(x, y, width, height); img(roi)
관심영역 그리기
- 시작점(x, y), 너비 = width, 높이 = height
- img(Rect(Point1, Point2)) 로 해도 됨.
-
fillPoly(입력 이미지, 포인트 배열, 점의 개수, 테두리 수(1), 색, 라인 타입)
관심영역 그리기 with fillpoly
- 관심 영역을 사각형이 아닌 원하는 형태로 만들기 위해 사용
- Point를 2차 배열로 만들어 사용한다.
- 이후 bitwise_and연산으로 roi를 확실히 한다.
Point(가로, 세로)!!!!
fillpoly 예시
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;
int main()
{
// Create black empty images
Mat image = Mat::zeros(400, 400, CV_8UC3); // 세로, 가로 각각 400, 400 사이즈의 검정 이미지를 만든다.
int w = 400;
/** Create some points */
Point rook_points[1][3]; // 여기서 rook는 체스의 말의 이름입니다.
rook_points[0][0] = Point(w / 2.0, w / 4.0); // Point(가로 픽셀 위치, 세로 픽셀 위치)
rook_points[0][1] = Point(w / 4.0, 3 * w / 4.0);
rook_points[0][2] = Point(3 * w / 4.0, 3 * w / 4.0);
const Point* ppt[1] = { rook_points[0] };
int npt[] = { 3 };
fillPoly(image, ppt, npt, 1, Scalar(255, 255, 255), 8);
imshow("Image", image);
imwrite("result.bmp", image);
waitKey(0);
return(0);
}
ROI_image = cv2.bitwise_and(img, mask)
return ROI_image