[Python] cvlib로 얼굴인식(성별, 나이) 예측하기cvlib 란?파이썬에서 얼굴, 객체 인식을 위한 사용하기 쉬운 라이브러리이다. opencv와 tensorflow를 사용하고 있기 때문에, 이 라이브러리를 사용하려면 위 2개를 설치해야 한다.$ pip install opencv-python tensorflow소스코드얼굴인식얼굴인식은 opencv의 dnn 모듈을 사용하여 사전에 학습된 모델로 inference해준다. 별다른 것 없이 cv.detect_face()함수면 쉽게 사용할 수 있다. 이 함수로 반환되는 결과는 얼굴의 좌표들과 예측된 얼굴 각각의 confidence이다. 예측된 얼굴 좌표는 (xmin, ymin, xmax, ymax) 순으로 반환된다. confidence는 0~1사이의 flo..
[Python] opencv로 얼굴인식 하기Haar Featureopencv 에서는 haar feature를 이용한 얼굴인식 코드를 제공한다. haar feature는 영상에서 object detection을 하기 위해 나온 것으로 2001년에 "Rapid Object Detection using a Boosted Cascade of Simple Features"라는 논문에서 제안되었다. 아래와 같은 커널을 convolution 연산을 통해 feature를 구한다.Haar Cascade Classifierhaar cascade classifier는 영상을 windowing 하면서 haar feature들을 순차적으로 여러 stage로 검사하여 face가 아니면 이후는 보지도 않고 버려 버린다. 모든 fe..
[영상처리] 모자이크 처리하기 (OpenCV-Python)모자이크 처리영상에서 특정 영역을 작게 축소했다가 다시 확대하면 원래의 픽셀과 비슷하긴 하지만, 보간법에 의해서 연산한 결과로 선명도가 떨어져 뿌옇게 보인다. 보간법 알고리즘으로 cv2.INTER_AREA를 사용하면 아래의 코드 예시에서처럼 저해상도 픽셀처럼 된다.코드opencv에서 제공하는 cv2.selectROI() 함수로 ROI를 쉽게 선택할 수 있다. 이후 해당 부분을 축소, 확대하여 선명도가 깨지는 부분으로 변경한다.import cv2 rate = 15 title = 'mosaic' img = cv2.imread('imgs/taekwonv1.jpg') while True: # 마우스 드래그로 ROI 선택 x, y, w, h = cv2.se..
[영상처리] 원근 변환 Perspective Transform (OpenCV-Python)원근 변환원근 변환(perspective transform)은 보는 사람의 시각에 따라 같은 물체도 먼 것은 작게, 가까운 것은 크게 보이는 현상인 원근감을 주는 변환이다. opencv에서 변환 전과 후를 짝짓는 4개의 매핑 좌표만 지정해 주면 원근 변환에 필요한 3x3 변환행렬을 계산해주는 cv2.getPerspectiveTransform() 함수를 제공한다. 이 함수를 이용하여 얻은 변환행렬을 cv2.warpPerspective() 함수를 이용해 적용한다. 코드아래 코드는 이미지에서 마우스로 4개의 꼭짓점을 클릭하면, 해당 영역에 대해 평면처럼 보이도록 원근변환을 해주는 코드이다.import cv2 import ..
[영상처리] Histogram Noramlize(정규화), Equalization(평탄화), CLAHE(opencv-python)Normalization(정규화)정의영상에서 특정 부분에 몰려 있는 값을 전체 영역으로 골고루 분포하게 하도록 만드는 방법을 Normalization(정규화) 라고 한다.적용 공식IN=(I−Min)newMax−newMinMax−Min+newMinI_N = (I-Min) \dfrac{newMax-newMin}{Max-Min}+newMinIN=(I−Min)Max−MinnewMax−newMin+newMinIII: 노멀라이즈 이전 값Min,MaxMin, MaxMin,Max: 노멀라이즈 이전 범위의 최소값, 최대값newMin,newMaxnewMin, newMaxnewMin,ne..
[영상처리] Histogram(OpenCV-python)히스토그램이란?히스토그램이란 뭐가 몇 개 있는지 개수를 세어 놓은 것을 그림으로 표시한 것을 말한다. 히스토그램은 영상을 분석하는데 유용하다. opencv python 코드cv2.calcHist 함수로 쉽게 영상의 히스토그램을 확인할 수 있다.cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])Parameters: • image – 분석대상 이미지(uint8 or float32 type). Array형태. • channels – 분석 채널(X축의 대상). 이미지가 graysacle이면 [0], color 이미지이면 [0],[0,1] 형태(1 : Blue, 2: Gre..

[영상처리] 알파 블렌딩(Alpha Blending)이란? (OpenCV-python)알파 블렌딩(Alpha Blending)이란?두 개의 영상을 합성할 때, 일반적으로 생각할 수 있는 방법은 더하기 연산이다. 그러나 일반적인 덧셈으로는 픽셀값이 255를 넘어가면 overflow가 발생하거나, 255로 고정이 되는데 이렇게 되면 원하는 결과를 얻기가 힘들다. 그래서 두 영상에 가중치를 주어 더하는 방식이 알파 블렌딩이다.g(x)=(1−α)f0(x)+αf1(x)g(x) = (1-\alpha)f_0(x)+\alpha f_1(x)g(x)=(1−α)f0(x)+αf1(x)위의 수식대로 f1의 영상에 가중치 α\alphaα를 곱하고, 다른 영상 f0에는 1−α1-\alpha1−α 를 곱한다. Opencv ..

[영상처리] 적응형 Treshold (OpenCV)적응형 Threshold란?지난 게시물에서 otsu algorithm(thresholding) 에 대해 알아봤다. 이는 하나의 고정된 값으로 thresholding 하는 것인데, 영상의 조명이 일정하지 않거나 배경색이 여러가지인 경우에는 하나의 고정된 threshold로는 좋은 결과를 얻지 못한다. 그래서 이미지를 여러 영역으로 나눈 후에 그 주변 픽셀 값을 기준으로 계산하여 영역마다의 threshold를 지정한다. 이것을 적응형 threshold(Adaptive threshold)라고 한다. OpenCV에서 제공하는 Adaptive Thresholdcv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresh..

[영상처리] 오츠의 알고리즘(Otsu Algorithm, Thresholding)오츠의 알고리즘이란?어떤 영상을 thresholding 하고 싶을 때, 적정한 threshold 값을 찾아주는 알고리즘을 말한다. 방법은 경게값을 임의로 정해서 픽셀들을 두 부류로 나누고 두 부류의 명암 분포를 반복해서 구한 다음 두 부류의 명암 분포를 가장 균일하게 하는 경게 값을 선택한다. 다시말해, 특정 threshold를 T라 하면, T를 기준으로 이진 분류된 픽셀의 비율의 차가 가장 작은 optimal T를 구하는 것이다.오츠 알고리즘은 모든 threshold에 대해 계산해야 하기 때문에 속도가 느리다는 단점이 있다. 또한 노이즈가 많은 영상에는 오츠의 알고리즘을 적용해도 좋은 결과를 얻지 못하는 경우가 있다.코드p..
손 인식을 하기 위해 YCrCb라는 색공간을 이용한다. Cr:133~173Cb:77~127 이 일반적인 살색 이라고 한다. 1234567891011121314151617import cv2import numpy as np img = cv2.imread('./hand_sample.jpg') #YCrCb 변환ycrcb = cv2.cvtColor(img,cv2.COLOR_BGR2YCrCb)#Cr:133~173, Cb:77~127mask_hand = cv2.inRange(ycrcb,np.array([0,133,77]),np.array([255,173,127])) cv2.imshow("Hands",mask_hand)cv2.imshow("Origin",img) cap.release()cv2.destroyAllWind..
- Total
- Today
- Yesterday