1. 직선 그리기

 

 

결과창

 

 

2. 도형 그리기

 

 

결과창

 

 

3. 문자열 출력하기

 

 

getTextSize() 활용 문자열 위치 조절

 

'OpenCV' 카테고리의 다른 글

카메라와 동영상 파일 다루기  (0) 2020.03.23
기본 자료형 클래스(4)  (0) 2020.03.21
기본 자료형 클래스(3)  (0) 2020.03.20
기본 자료형 클래스(2)  (0) 2020.03.10
기본 자료형 클래스(1)  (0) 2020.03.10

1. VideoCapture 클래스

 

동영상 파일 또는 카메라에서 정지 프레임을 받아오는 클래스

 

VideoCapture 클래스의 생성자 사용, VideoCapture::open() 멤버 함수 사용을 통해 동영상 파일이나 카메라 사용

동영상 파일의 경우 경로와 파일명, 카메라일 경우 카메라 번호( 0, 1, .. )를 인자로 전달

 

카메라 또는 동영상 파일 열기를 수행한 후에는 VideoCapture::isOpened() 멤버 함수를 이용해 열기 작업이 성공적으로 수행되었는지 확인 ( bool형으로 true, false 로 반환 )

 

카메라 사용이 끝나면 VideoCapture::release() 함수를 호출하여 사용하던 자원을 해제해야 함

 

카메라 또는 동영상 파일로부터 한 프레임의 정지 영상을 받아 오는 방법

VideoCapture::operator >>() 연산자 재정의 사용, VideoCapture::read() 함수 사용

 

* 컴퓨터에 연결된 기본 카메라로부터 한 프레임의 정지 영상을 받아오는 일련의 과정

 

VideoCapture cap(0);

 

Mat frame1, frame2;

cap >> frame1;

cap.read(frame2);

 

여러 대의 카메라를 연결하고 여러 카메라로부터 동시에 영상을 획득하고 싶다면 VideoCapture::read() 함수보다 VideoCapture::grab() 함수와 VideoCapture::retrieve() 함수를 같이 사용하는 것이 좋다.

( read() 함수는 grab() 함수와 retrieve() 함수가  합쳐진 것이라 볼 수 있는데 수행 시간 때문에 같은 시점의 사진을 획득할 때에는 grab() 함수를 차례대로 호출하고 retrieve() 함수를 차례대로 호출하여 받아오는 것이 좋다. )

 

현재 열려 있는 카메라 장치 또는 동영상 파일로부터 여러 가지 정보를 받아오기 위해서는 VideoCapture::get() 함수를 사용한다.

 

* 시스템 기본 카메라를 열고 카메라의 기본 프레임 크기를 확인하는 방법

 

VideoCapture cap(1);

 

int w = cvRound(cap.get(CAP_PROP_FRAME_WIDTH));

int h = cvRound(cap.get(CAP_PROP_FRAME_HEIGHT));

 

VideoCapture::get() 함수는 double 자료형으로 반환하므로 정수형 변수에 프레임 크기를 저장하려면 반올림하여 정수형으로 변환하는 것이 좋다.

 

VideoCapture::get() 함수와 반대로 현재 열려 있는 카메라 또는 비디오 파일 재생과 관련된 속성 값을 설정할 때에는 VideoCapture::set() 함수를 사용한다.

 

* video.mp4 파일을 열어서 100번째 프레임으로 이동하는 코드

 

VideoCapture cap("video.mp4");

cap.set(CAP_PROP_POS_FRAMES, 100);

 

 

2. 카메라 입력 처리하기

 

 

 

결과창

 

 

 

3. 동영상 파일 처리하기

 

 

 

결과창

 

 

 

4. 동영상 파일 저장하기

 

OpenCV는 카메라 및 동영상 파일의 프레임을 받아 오는 기능뿐만 아니라 일련의 프레임을 동영상 파일로 저장하는 기능을 VideoWriter 클래스를 통해 제공한다.

 

 

output.avi

 

'OpenCV' 카테고리의 다른 글

다양한 그리기 함수  (0) 2020.03.23
기본 자료형 클래스(4)  (0) 2020.03.21
기본 자료형 클래스(3)  (0) 2020.03.20
기본 자료형 클래스(2)  (0) 2020.03.10
기본 자료형 클래스(1)  (0) 2020.03.10

1. Vec 클래스

 

Vec 클래스는 다양한 OpenCV 프로그래밍에서 유용하게 사용되고 있으며, 특히 Vec3b, Vec4i, Vec2f 등 이름으로 재정의되어 사용되고 있다.

Vec 클래스는 Matx 클래스를 상속받아 만들어지며 열 개수가 1개로 특화된 벡터 표현 클래스이다.

Vec 클래스는 템플릿을 사용하기 때문에 자료형과 데이터 개수를 명시해야 한다.

 

Vec<uchar, 3> p1, p2(0, 0, 255);

 

위와 같은 방식으로 입력하는 것에 번거로움이 있어 OpenCV에서 이름 재정의를 제공한다.

 

typedef Vec<uchar, 3> Vec3b;

 

Vec3b p1, p2(0, 0, 255);

 

다음과 같이 변수를 선언할 경우 p1과 p2는 각각 내부에 uchar val[3]; 형식의 멤버 변수를 가진다.

만약 p1 변수의 첫 번째 원소를 100으로 변경하고 싶다면 다음과 같이 표현할 수 있다.

 

p1.val[0] = 100; 

 

그런데 Vec 클래스는 [] 연산자 재정의가 되어 있기 때문에 다음과 같이 쉽게 접근 가능하다.

 

p1[0] = 100;

 

 

2. Scalar 클래스

 

OpenCV 프로그래밍에서 Mat 클래스 다음으로 자주 사용되는 클래스이다.

Scalar 클래스는 4 채널 이하의 영상에서 픽셀 값을 표현하는 용도로 자주 사용된다.

Scalar 클래스는 Scalar_ 템플릿 클래스의 double형 이름 재정의 이며 Scalar_ 클래스는 Vec 클래스를 상속한다.

 

typedef Scalar_<double> Scalar;

 

Scalar 클래스 객체 생성 방법

 

Scalar(밝기)

Scalar(파란색, 녹색, 빨간색)

Scalar(파란색, 녹색, 빨간색, 투명도)

 

 

 

3. InputArray 클래스

 

 

4. OutputArray 클래스

 

영상 입력 -> 영상 처리 수행 -> 반환

반환 시 return 구문으로 반환하는 것이 아니라 보통 OutputArray 클래스의 참조를 함수 인자로 사용하여

결과 영상을 전달

함수 (InputArray, OutputArray)

'OpenCV' 카테고리의 다른 글

다양한 그리기 함수  (0) 2020.03.23
카메라와 동영상 파일 다루기  (0) 2020.03.23
기본 자료형 클래스(3)  (0) 2020.03.20
기본 자료형 클래스(2)  (0) 2020.03.10
기본 자료형 클래스(1)  (0) 2020.03.10

1. Mat 행렬 생성과 원소 값 초기화

 

 

2. Mat 행렬 복사

 

 

결과창

 

 

얕은 복사를 한 img2, img3는 img1을 따라 노란색으로 변경되었으며

깊은 복사를 한 img4, img5는 사과 이미지를 그대로 유지하고 있음을 볼 수 있다.

 

 

3. 부분 행렬 추출

 

 

결과창

 

 

얕은 복사를 진행한 img2를 변경함으로서 원본이미지인 img1이 변경되었음을 확인할 수 있다.

또한, 깊은 복사를 진행한 im3는 변경되지 않았음을 확인할 수 있다.

 

 

4. 행렬의 원소 값 참조

 

 

 

결과창

 

 

 

5. 행렬 정보 참조하기

 

 

 

6. 행렬 연산

 

 

 

 

7. 크기 및 타입 변환 함수

 

'OpenCV' 카테고리의 다른 글

카메라와 동영상 파일 다루기  (0) 2020.03.23
기본 자료형 클래스(4)  (0) 2020.03.21
기본 자료형 클래스(2)  (0) 2020.03.10
기본 자료형 클래스(1)  (0) 2020.03.10
OpenCV 사용 이미지 띄워보기  (0) 2020.03.10

7. Mat

OpenCV에서 가장 많이 사용하는 클래스

행렬을 나타내는 클래스(실제로 2차원 영상을 표현하는 용도로 많이 사용)

 

 

 

멤버 변수

Mat::dims

Mat 행렬의 차원을 나타냄(2차원일 경우 값은 2)

 

Mat::rows

Mat::cols

행렬의 행 개수, 열 개수를 나타냄

(영상의 세로 픽셀 크기, 가로 픽셀 크기)

(2차원 행렬인 경우에만 의미 있는 값을 가지며 3차원 이상의 행렬에서는 -1)

 

Mat::size

3차원 이상의 행렬의 크기 정보

 

Mat::data

행렬의 원소 데이터가 저장되어 있는 메모리 공간을 가리키는 포인터형 멤버 변수

 

 

행렬의 생성과 초기화

 

Mat img1;

기본 생성자를 사용한 변수 선언(비어 있는 행렬 생성)

 

Mat img2(480, 640, CV_8UC1);

가로 640, 세로 480, 1채널(그레이스케일)의 unsigned char형 행렬 생성

 

Mat img3(480, 640, CV_8UC3);

가로 640, 세로 480, 3채널(트루컬러)의 unsigned char형 행렬 생성

 

Mat img4(Size(640, 480), CV_8UC3);

Size 클래스 이용, 가로 640, 세로 480, 3채널의 unsigned char형 행렬 생성

 

위와 같은 방식은 행렬의 값이 정해지지 않기 때문에 쓰레기 값이 들어감, 다음과 같은 방식으로 값을 정해줄 수 있음

 

Mat img5(480, 640, CV_8UC1, Scalar(128));

밝기 128

Mat img6(Size(640, 480), CV_8UC3, Scalar(0, 0, 255));

red 칼라

 

새로운 행렬을 생성할 때 모든 원소 값을 0으로 초기화하는 경우가 많으며 이런 경우에 사용하기 위한 별도의 함수존재

 

Mat mat1 = Mat::zeros(3, 3, CV_32SC1);

 

1로 초기화

 

Mat mat2 = Mat::ones(3, 3, CV_32FC1);

 

단위 행렬

 

Mat mat3 = Mat::eye(3, 3, CV_32FC1);

 

Mat 객체를 생성할 때, 행렬 원소를 저장할 메모리 공간을 새로 할당하는 것이 아니라 기존에 이미 할당되어 있는 메모리 공간의 데이터를 행렬 원소 값으로 사용할 수 있다.

 

float data[] = { 1, 2, 3, 4, 5, 6 };

Mat mat4(2, 3, CV_32FC1, data);

 

외부 메모리 공간을 활용하여 Mat 객체를 생성한다는 것은 자체적인 메모리 할당을 수행하지 않고 외부 메모리를 참조하는 방식이기 때문에 객체 생성이 빠르다는 장점이 있다.

또한, 외부 배열을 행렬 원소 값으로 사용하고자 할 경우 외부 배열 크기와 생성할 행렬 원소 개수는 같아야 하고 서로 사용하는 자료형도 같아야 한다.

동적 할당하여 만든 대용량 메모리도 Mat 클래스에 참조하여 사용 가능, 다만 동적 할당한 메모리는 Mat 객체가 소멸될 때 자동으로 해제되지 않으므로 반드시 사용자가 직접 메모리를 해제해야 한다.

 

Mat_ 클래스 사용 Mat 객체 생성

 

Mat_<float> mat5_(2, 3);

mat5_ << 1, 2, 3, 4, 5, 6;

Mat mat5 = mat5_;

 

다음과 같이 한줄로도 사용가능

 

Mat mat5 = (Mat_<float>(2, 3) << 1, 2, 3, 4, 5, 6);

 

초기화 리스트를 이용한 행렬 초기화 방법

 

Mat mat6 = Mat_<float>({2, 3}, { 1, 2, 3, 4, 5, 6 });

 

비어 있는 Mat 객체 또는 이미 생성된 Mat 객체에 새로운 행렬을 할당하려면 Mat 클래스의 Mat::create() 사용

 

mat4.create(256 ,256, CV_8UC3);

mat5.create(4, 4, CV_32FC1);

 

새로 만들 행렬의 크기 또는 타입이 기존 행렬과 다른 경우, 기존 메모리 공간을 해제한 후 새로운 행렬 데이터 저장을 위한 메모리 공간 할당

 

Mat::create() 함수는 새로 만든 행렬의 원소 값을 초기화하는 기능이 없기 때문에 행렬을 생성한 후 행렬 전체 원소 값을 초기화하고 싶다면 Mat::setTo() 멤버 함수 또는 = 연산자 재정의를 이용해야한다.

 

mat4 = Scalar(255, 0, 0);

mat5.setTo(1.f);

'OpenCV' 카테고리의 다른 글

기본 자료형 클래스(4)  (0) 2020.03.21
기본 자료형 클래스(3)  (0) 2020.03.20
기본 자료형 클래스(1)  (0) 2020.03.10
OpenCV 사용 이미지 띄워보기  (0) 2020.03.10
프로젝트 생성 및 설정  (0) 2020.03.08

1. Point_

2차원 평면 위에 있는 점의 좌표를 표현하는 템플릿 클래스

2차원 좌표를 나타내는 x와 y 멤버 변수를 가짐

 

멤버 함수

 

Point::dot()

두 점 사이의 내적을 계산하여 반환

 

Point::ddot()

두 점 사이의 내적을 실수형으로 계산하여 double 형으로 반환

 

Point::cross()

두 점 사이의 외적을 반환

 

Point::inside()

점의 좌표가 사각형 r 영역 안에 있으면 true를 반환

 

 

템플릿 함수이므로 여러 자료형 사용 가능

 

정수형(int) : Point2i (Point)

정수형(int64) : Point2l

실수형(float) : Point2f

실수형(double) : Point2d

 

 

2. Size_

영상 또는 사각형 영역의 크기를 표현하는 템플릿 클래스

사각형 영역의 가로와 세로 크기를 나타내는 width와 height 멤버 변수를 가짐

 

멤버 함수

 

Size::area()

사각형 크기에 해당하는 면적(w x h)을 반환

 

Size::empty()

유효하지 않은 크기이면 true 반환

 

int : Size2i (Size)

int64 : Size2l

float : Size2f

double : Size2d

 

 

3. Rect_

사각형의 위치와 크기 정보를 표현하는 템플릿 클래스

좌측 상단 점의 좌표(x, y), 가로 및 세로 크기(width, height) 멤버 변수 가짐

 

멤버 함수

 

Rect::tl()

사각형의 좌측 상단 점의 좌표 반환

 

Rect::br()

사각형의 우측 하단 점의 좌표 반환

 

Rect::size()

사각형의 크기 정보 반환

 

Rect::area()

사각형의 면적 반환

 

Rect::empty

유효하지 않은 사각형이면 true 반환

 

Rect::contains()

인자로 전달된 pt 점이 사각형 내부에 있으면 true 반환

 

int : Rect2i (Rect)

float : Rect2f

double : Rect2d

 

 

4. RotatedRect

회전된 사각형을 표현하는 클래스

중심 좌표를 나타내는 center, 가로 및 세로 크기를 나타내는 size, 회전 각도를 나타내는 angle 멤버 변수 가짐

템플릿 클래스x 모든 정보를 float 자료형을 사용하여 표현

중심점 좌표는 Point2f, 크기 정보는 Size2f, 회전 각도는 float 사용

 

멤버 함수

 

RotatedRect::points()

회전된 사각형 객체의 네 꼭지점 좌표 반환

 

RotatedRect::boundingRect()

RotatedRect::boundingRect2f() (실수형)

회전된 사각형을 감싸는 최소 크기의 사각형 반환

 

 

5. Range

범위 또는 구간을 표현하는 클래스

범위의 시작과 끝을 나타내는 start와 end 멤버 변수 가짐(start는 범위에 포함, end는 포함하지 않음)

 

멤버 함수

 

Range::size()

함수의 크기(end - start)를 반환

 

Range::empty()

start와 end가 같으면 true 반환

 

Range::all()

start = INT_MIN, end = INT_MAX로 설정한 Range 객체 반환

 

 

6. String

OpenCV 라이브러리에서는 자체적인 String 클래스를 정의하여 사용

std::string 클래스와 완전히 호환되도록 설계되어 있음

OpenCV 4.0 버전부터는 std::string 클래스를 String으로 재정의하여 사용

 

 

'OpenCV' 카테고리의 다른 글

기본 자료형 클래스(3)  (0) 2020.03.20
기본 자료형 클래스(2)  (0) 2020.03.10
OpenCV 사용 이미지 띄워보기  (0) 2020.03.10
프로젝트 생성 및 설정  (0) 2020.03.08
OpenCV 설치 및 환경 변수 설정(Window)  (0) 2020.03.08

아래의 코드를 이용해서 lena.jpg 이미지를 띄워보자

 

코드

 

 

12행 : Mat 클래스의 img 객체를 선언

13행 : imread 함수를 이용하여 lena.jpg를 Mat 형태로 반환하여 img에 저장

21행 : namedWindow함수를 이용하여 "image"라는 이름의 새 창을 생성

22행 : imshow 함수를 이용하여 "image" 창에 img에 저장된 이미지 출력

24행 : waitKey함수를 이용하여 키보드에 입력 신호가 들어올 때까지 대기(이미지 창을 대기)

 

코드를 모두 작성하였다면 실행시키기 전에 lena.jpg 이미지를 인터넷을 통해 다운로드 받거나

opencv 폴더 안에서 찾아서 현재 사용 중인 Visual Studio 프로젝트 폴더 안에 넣는다.

 

 

결과 화면

 

'OpenCV' 카테고리의 다른 글

기본 자료형 클래스(3)  (0) 2020.03.20
기본 자료형 클래스(2)  (0) 2020.03.10
기본 자료형 클래스(1)  (0) 2020.03.10
프로젝트 생성 및 설정  (0) 2020.03.08
OpenCV 설치 및 환경 변수 설정(Window)  (0) 2020.03.08

환경 변수 등록을 마쳤다면 Visual Studio를 실행한 후 파일 -> 새로 만들기 -> 프로젝트를 클릭한 후

Visual C++ -> Windows 데스크톱에 Windows 데스크톱 마법사를 클릭, 프로젝트 이름을 정한 후

솔루션용 디렉터리 만들기를 해제하고 확인을 누른다. 그다음 빈 프로젝트를 클릭한 후 프로젝트를 생성한다.

 

 

프로젝트를 생성 하였다면 OpenCV를 사용하기 위한 설정을 할 것이다.

우선 환경에 맞게 프로젝트 상단 툴바에 x86이라고 되어 있는 부분을 64비트에 맞게 x64로 변경한다.

Debug 모드로 설정이 되어 있는 걸 볼 수 있는데 해당 부분의 Debug 모드와 Release 모드 둘 다 다음 3단계의 과정을 진행한다.

 

처음으로 프로젝트 > (프로젝트이름) 속성 항목을 선택하고 C/C+ -> 일반 -> 추가 포함 디렉터리를 선택하고

편집을 누르고 $(OPENCV_DIR)\include를 추가한다.

 

 

다음으로 링커 -> 일반 -> 추가 라이브러리 디렉터리 항목을 선택하고 편집을 누르고

$(OPENCV_DIR)\x64\vc15\lib라고 입력한다.

 

 

마지막으로 링커 -> 입력 -> 추가 종속성 항목을 선택하고 편집을 누른 뒤

opencv_world420d.lib (Debug 모드), opencv_world420.lib (Release 모드)를 입력한다.

 

(OpenCV 버전에 따라 파일명이 바뀔 수 있으니 확인 후 진행)

 

 

해당 과정까지 마쳤다면 Visual Studio에서 만든 프로젝트에서 OpenCV를 사용할 준비를 마쳤다.

다음에는 실제로 OpenCV를 사용해서 이미지를 출력해 볼 것이다.

'OpenCV' 카테고리의 다른 글

기본 자료형 클래스(3)  (0) 2020.03.20
기본 자료형 클래스(2)  (0) 2020.03.10
기본 자료형 클래스(1)  (0) 2020.03.10
OpenCV 사용 이미지 띄워보기  (0) 2020.03.10
OpenCV 설치 및 환경 변수 설정(Window)  (0) 2020.03.08

+ Recent posts