과거 자료들

TIL - 03.15

jfl 2022. 3. 16. 15:18

# 영상 불러와서 출력하기

@OpenCV 주요 함수

include opencv/opencv.hpp : opencv 헤더파일 모음

using namespace std, cv; : std::, cv:: 생략가능

 

imread("a", [b]): 'a' 영상 불러오기 // a는 파일이름(현재 위치에 파일이 있어야 함.) or 경로, [b]는 불러올 방법

imwrite("a", b): "a"라는 이름에 b 확장자로 저장

imshow("a", b): "a"라는 창에 b 이미지 띄우기

 

waitkey(): key를 누를 때 까지 기다림. // waitkey() == 27 로 조건을 세우면 특정 키 누를 때 까지 기다림.

destroyWindow("a"): a창 닫기

destoryAllWindows(): 모든창 닫기

 

*OpenCV 도움말 사이트 http://docs.opencv.org/ 

 

# OpenCV 편하게 사용하기

@lmage Watch 프로그램

Mat 데이터를 이미지로 보여주는 vs 확장 프로그램

 

사용법

-디버깅 한번 한 상태에서 종단점 선택(왼쪽 회색 UI 클릭 -> 빨간 원 생성)

-디버그 시작

-보기 > 다른 창 > lmage Watch 선택

-디버그 종료하면 Image Watch 사라짐

 

기능

-마우스 커서 움직임 : 해당 픽셀 값 확인간ㅇ

-마우스 휠 : 확대/축소

-왼쪽 상단 Watch 체크 -> 검색: 원하는 값 찾을 수 있다.

 

@OpenCV 프로젝트 템플릿

말그대로 템플릿, 내가 원하는 대로 커스텀

-속성, 기본 소스코드, 리소스 파일 포함 ...

 

사용법

-zip 안에 sln 확장자 실행

-파일 > 템플릿 내보내기

-프로젝트 설정 창 설정(이름, 설명, 출력 위치 ...)

 

zip 안에 vstemplat 파일 수정하면 새 프로젝트 만들기에서 더 이쁘게 볼 수 있다.

 

# OpenCV 주요 클래스

@Point_ 클래스

2차원 점의 좌표 표현을 위한 템플릿 클래스

멤버 변수: x, y

멤버 함수

-dot(): 내적계산

-ddot(): 더블로 내적계산

-cross(): 외적계산

-inside(): 어떤 점이 어떤 사각형 안에 들어있는지

-연산자 오버로딩 가능

-std::cout 출력을 위한 << 지원

 

@size_ 클래스

영상, 사각형의 크기 표현을 위한 템플릿 클래스

멤버 변수: width, height

멤버 함수

-area(): 면적 계산

-연산자 오버..... (위와 동일)

 

@Rect_ 클래스

2차원 사각형 표현을 위한 템플릿 클래스

멤버 변수: x, y, width, height

멤버 함수

-tl(): top left, 좌측 상단 점의 좌표 반환

-br(): bottom right, 우측 하단 점 좌표 반환

-size(): (width, height)으로 된 자료형 반환

-area(): 넓이

-contains(): 점이 사각형 안에 있는지

-연산자 오버 ... (위와 동일)

 

매직 매소드 많이 넣어서 클래스 잘 만듦, 앵간한거 다 지원해준다.

+= 축약 연산도 가능, int와 계산도 가능

 

@Range 클래스

정수 값의 범위를 나타내기 위한 클래스

Range(start, end), ] 는 해당 값 포함 안함

 

@String 클래스

std::string 클래스와 동일

a= "abc" 로 만들어도 됨.

 

@Vec 클래스

std:ㅣ vector 와 동일, 벡터를 표현

 

@Scalar 클래스

크기가 4인 double 배열을 멤버 변수로 가지고 있는 클래스

무조건 4개에 같은 타입을 저장 할 수 있다.

이건 거의 안쓴다.

 

# Mat 클래스

@개요

CV.Mat으로 다차원 행렬 구현

*포인터 변수: 포인터 주소를 저장하는 변수( a* 같은 것(?))

*uchar : 1바이트 메모리 사용, 모든값 양수로 생각, 0 ~ 255

*char(schar) : 1바이트 메모리 사용, 음수 있는, -128 ~ 127

@깊이, 채널, 타입

CV_8UC1 - 타입

 

8U - 깊이, 8bit uchar

 

C1 - 채널, 1개 -> 그레이스케일

 

깊이(depth)

-원소의 자료형 정보

 

채널(channel)

-원소 하나가 몇 개로 구성

-ex, 그레이스케일 1개, 트루컬러 3개

 

타입(type)

-img.type() 명령어로 볼 수 있고

-깊이 + 채널.

 

@InputArray / OutputArray

Mat 의외의 다양한 자료형을 받고, 출력할 수 있도록 하기 위한 프록시 클래스

 

InputArray / OutputArray 객체를 생성하는게 아니라, 어떤 Array 객체를 입력하면, InputArray로 처리되 OpenCV 가 알아서 Mat 자료형으로 변환해준다.

 

# Mat 기초 사용법

Mat img(세로, 가로, 타입, [값])

-값 : Scalar(128), Scalar(0,0,255), data.... 필수는 아니지만, 값을 안넣으면 임의의 쓰레기 값이 들어간다 

-세로크기가 먼저 들어가기 때문에 주의

 

@복사하기

- = 연산 : 얕은 복사

- .clone(), .copyTo() : 깊은 복사

 

@부분 행렬 추출

img(추출할 크기), Rect(x,y,w,h) ; ex. img1(Rect(220, 120, 340, 240))

 

* ~를 객체 앞에 붙이면, 반전된다.

 

@픽셀 값 참조

계산을 통해 data에 직접 접근 해서 참조할 수 있다.

M.data + M.step[0]*i + M*step[1]*j // step[0]: 행의 데이터, i: 행, step[1]: 열 데이터, j: 열

(단, 잘못 접근하거나 메모리 연산이 잘못되면 프로그램 비정상 종료 할 수 있다.)

=> 그래서, 반복자를 활용해 접근할 것을 OpenCV에서 권장

 

at<타입>(y, x)

-임의 좌표에 접근 가능

-y: 행(rows), x: 열(cols)

-타입 지정해야함. (_Tp 타입으로 캐스팅 되서.)

-2중 for문과 함께 이동 mat1.at

-예제 참고

 

ptr<타입>(y):

-at()보다 빠름, 행 단위 연산 수행 유리

-y: 행(rows)

-타입 지정해야함.

-포인터 연산 형식으로 해도 된다. // 포인터 변수에 이동할 행 주소를 저장해 두고, 포인트 변수를 반복문에 돌려도 됨.

 

MatIterator_<타입> 반복자

-for문처럼 첫 번째 원소부터 ~ 반환

 

@기초 행렬 연산

inv() : 역행렬 구하는 함수

t() : 전치행렬 구하는 함수

행렬 + int : 행렬 전체에 더해짐

행렬 + 행렬 : 같은 위치끼리 더해짐

=> 나머지 연산자도 동일하다.