src = cv2.imread('./data/lenna.bmp', cv2.IMREAD_COLOR)
mask = cv2.imread('./data/mask_smile.bmp', cv2.IMREAD_GRAYSCALE)
if src is None or mask is None:
print("Image load failed")
sys.exit()
src[mask > 0] = (0, 255, 255)
cv2.imshow('src', src)
cv2.imshow('mask', mask)
cv2.waitKey()
cv2.destroyAllWindows()
-->
src = cv2.imread('./data/airplane.bmp', cv2.IMREAD_COLOR)
mask = cv2.imread('./data/mask_plane.bmp', cv2.IMREAD_GRAYSCALE)
dst = cv2.imread('./data/field.bmp', cv2.IMREAD_COLOR)
if src is None or mask is None or dst is None:
print("Image load failed")
sys.exit()
#TODO
dst[mask > 0] = src[mask > 0]
cv2.imshow('src', src)
cv2.imshow('mask', mask)
cv2.imshow('dst', dst)
cv2.waitKey()
cv2.destroyAllWindows()
-->
Mat& Mat::setTo(InputArray value, InputArray mast = noArray()); 행렬의 픽셀 값을 설정 하기 위해 setTo() 함수를 사용하며 setTo()함수는 마스크 연산을 지원하는 함수 ・value - 행렬 원소에 설정할 값 ・mask - 마스크 행렬, 마스크 행렬의 원소가 0이 아닌 위치에서만 value 값이 설정 됩니다. 행렬 전체 원소 값을 설정하려면 noArray()또는 Mat()을 지정합니다 ・반환값 - Mat 객체의 참조
void Mat::copyTo(OutputArray m, InputArray mask) const; copyTo() 함수는 두 가지 형태로 저의되어 있습니다 . 하나는 복사할 대상 행렬 하나만 인자로 받고, 다른 하는 복사할 대상 행렬과 마스크 영상 두개르 인자로 받습니다. ・m - 복사본이 저장될 행렬. 만약 *this행렬과 크기 및 타입이 다르면 메모리를 새로 할당한 후 픽셀 값을 복사합니다. ・mask - 마스크 행렬. 마스크 행렬 원소 값이 0이 아닌 죄표에서만 행렬 원소를 복사합니다. mask행렬은 *this와 같은 크기이고 깊이는 CV_8U이어야 합니다.
### 연산 시간 측정
src = cv2.imread('./data/lenna.bmp', cv2.IMREAD_GRAYSCALE)
if src is None:
print("Image load failed")
sys.exit()
dst = np.empty(src.shape, dtype=src.dtype)
tm = cv2.TickMeter()
tm.start()
for y in range(src.shape[0]):
for x in range (src.shape[1]):
dst[y, x] = 255 - src[y, x]
tm.stop()
print("%4.3f ms" % tm.getTimeMilli())
cv2.imshow('src', src)
cv2.imshow('dst', dst)
cv2.waitKey()
cv2.destroyAllWindows()
int64 getTickCount(void) getTickCount()함수와 getTickFrequency()함수를 사용하여 특정 연산의 수행 시간을 측정 ・반환값 - 시스템의 현재 틱(tick)횟수
double getTickFrequency(void) 시스템 틱 주파스를 구할 수 있습니다. ・반환값 - 시스템의 초당 틱(tick)횟수
Scalar sum(InputArray src); Mat행렬의 원소 합을 구하고 싶을 때에는 sum()함수를 사용 ・src - 입력 행렬(1~4채널) ・반환값 - 각 채널의 합
Scalar mean(InputArray src, InputArray mask = noArray()); Mat행렬의 원소 평균을 구하고 싶을 때에는 mean()함수를 사용 ・src - 입력 행렬(1~4채널) ・mask - 마스크 연산 ・반환값 - 각 채널의 평균
void minMaxLog(InputArray src, double* minVal, douvlde* maxVal = 0, Point* minLoc =0, Point* maxLoc =0, ImputArray mask = noArray()); 주어진 행렬의 최소값, 최대값을 찾는 함수 ・src - 입력 영상, 단일 채널 ・minVal - 최소값을 받을 double형 변수의 주소, 필요없으면 0을 지정합니다. ・maxVal - 최대값을 받을 double형 변수의 주소, 필요없으면 0을 지정합니다. ・minLoc - 최솟값 위치 좌표를 받을 Point형 변수의 주소, 필요 없으면 0을 지정합니다 ・maxLoc - 최대값 위치 좌표를 받을 Point형 변수의 주소, 필요 없으면 0을 지정합니다 ・mask - 마스크 영상, 마스크 영상의 픽셀 값이 0이 아닌 위치에서만 연산을 수행합니다.
void normalize(InputArray src, ImputOutputArray dst, double alpha = 1, double beta =0, int norm_type = NORM_L2, int dtype = -1, InputArray mask = noArray()); 행렬의 노름(norm)값을 정규화 하거나 또는 원소 값 범위를 특정 범위로 정규화할 때 사용 ・src - 입력 행렬 ・dst - 출력 행렬. src와 같은 크기 ・alpha - (노름 정규화인 경우)목표 노름 값,(원소 값 범위 정규화인 경우) 최솟값 ・beta - (원소 값 범위 정규화인 경우) 최대값 ・norm_type - 정규화 타입, NORM_INF, NORM_L2, NORM_MINMAX중 하나를 지정합니다. ・dtype - 결과 영상의 타입 ・mask - 마스크 영상
int cvRount(double value); int cvRount(float value); 실수 값의 반올림 연산 ・value - 입력 실수 값. 만약 value가 INT_MIN과 INT_MAX 사이를 벗어날 경우 알 수 없는 값이 반환됩니다. ・반환값 - 반올림한 정수 값
CV_Assert(expr) CV_DbgAssert(expr) 소스 코드엥서 사용된 CV_Assert()는 OpenCV에서 제공하는 매크로 함수로서 괄호 안의 조건식이 참(true)이면 정상적으로 함수를 진행하고, 거짓(false)이면 에러를 발생 ・expr - 조건식, 조건식이 거짓(false)이면 에러가 발생하며 프로그램이 종료합니다.
void func(Mat& img){
CV_Assert(img.type() == CV_8UC1);
// 그레이스케일 영상 처리 수행
}
template<> inline uchar saturate_cast<uchar>(int v); 그레이스케일 값 법위에 맞게끔 결과 영상 픽셀 값을 설정하는 작업은 컴퓨터 비전 프로그래밍에서는 매우 빈번하게 일어나 앞과 같이 행렬의 자료형에 맞게끔 포화 연산을 수행하는 saturate_cast()라는 캐스팅 함수를 지원 ・v - int 자료형이 표현할 수 있는 범위의 정수 ・반환값 - 0~255 사이의 정수
# 영상의 명암비 조절
src = cv2.imread('./data/lenna.bmp', cv2.IMREAD_GRAYSCALE)
if src is None:
print("Image load failed")
sys.exit()
s = 2.0
dst = cv2.multiply(src, s)
cv2.imshow("src", src)
cv2.imshow("dst", dst)
cv2.waitKey()
cv2.destroyAllWindows()
OpenCV에서 영상으 히스토그램 사용 void calcHist(const Mat* images, int nimages, const int* channels, InputArray mask, OutputArray hist, int dims, const int* dims, const int* histSize, const float** ranges, bool uniform = true, bool accumulate = false); calcHist() 함수는 한 장의 영상뿐만 아니라 여러 장의 영상으로 부터 히스토그램을 구할 수 있고, 여러 채널로부터 히스토그램을 구할 수도 있다. ・images - 입력 영상의 배열 또는 입력 영상의 주소, 영사으이 배열인 경우, 모든 영상의 크기와 깊이는 같아야 한다. ・nimages - 입력 영상 개수 ・channels - 히스토그램을 구할 채널릉 나타내는 정수형 배열 ・mask - 마스크 영상. 입력 영상과 크기가 같은 8비트 배열이어야 합니다. 마스크 행렬의 원소 값이 0이 아닌 좌표의 픽셀만 히스토그램 계산에 사용됩니다. mask인자에 Mat() 또는 noArray()를 지정하면 입력 영상 전체에 대해 히스토그램을 구합니다. ・hist - 출력 히스토그램. CV_32F깊이를 사용하는 dims-차원의 행렬입니다. ・dims - 출력 히스토그램의 차원 수 ・histSize - 각 차원의 히스토그램 배열 크기를 나타내는 배열(즉, 각 차원의 히스토그램빈 개수를 나타내는 배열) ・ranges - 각 차원의 히스토그램 범위. 등간격 히스토그램이면(uniform = true), ranges[i]는 각 차원의 최솟값과 초댓값으로 구설된 배열이고[최솟값, 최댓값]^2 범위를 타타냅니다. 비등간력 히스토그램이면(uniform = false), ranges[i]는 각각의 구역을 나타내는 histSize[i]+1개의 원소로 구성된 배열입니다. ・uniform - 히스토그램 빈의 간격이 균등한지를 나타내는 플래그 ・accumulate - 누적 플래그. 이 값이 true이면 hist 배열을 초기화하지 않고 누적하여 히스토그램을 계산합니다.