OpenCV C++ basic_2 도형 그리기

최준혁·2021년 6월 19일

OpenCV_Basic

목록 보기
2/4

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
profile
3D Vision, VSLAM, Robotics, Deep_Learning

0개의 댓글