cap = cv.VideoCapture('jnary.mp4')
cap = cv.VideoCapture(0) # 연결된 카메라 id >= 0
if not cap.isOpened(): # 제대로 파일 불러왔는지 확인
print("Camera open failed!")
exit()
print('width: ', int(cap.get(cv.CAP_PROP_FRAME_WIDTH)))
print('height: ', int(cap.get(cv.CAP_PROP_FRAME_HEIGHT)))
while True:
ret, frame = cap.read()
if not ret:
break
inversed = ~frame # 비트 단위 반전연산
cv.imshow('frame', frame)
cv.imshow('inversed', inversed)
if cv.waitKey(10) == 27:
break
cv.destroyAllWindows()
fps = cap.get(cv.CAP_PROP_FPS)
delay = round(1000 / fps)
if cv.waitKey(delay) == 27:
break
outputVideo = cv.VideoWriter('output.avi', fourcc, fps, (w, h))
w = round(cap.get(cv.CAP_PROP_FRAME_WIDTH))
h = round(cap.get(cv.CAP_PROP_FRAME_HEIGHT))
fps = cap.get(cv.CAP_PROP_FPS)
delay = round(1000 / fps)
fourcc = cv.VideoWriter_fourcc(*'DIVX')
outputVideo = cv.VideoWriter('output.avi', fourcc, fps, (w, h))
if not outputVideo.isOpened():
print('File open failed')
exit()
while True:
ret, frame = cap.read()
...
outputVideo.write(inversed)
→ 시험 X, 과제 O
delay : 키 입력을 기다릴 시간(밀리초 단위)
delay ≤ 0 : 무한히 기다림
눌러진 키 값 반환
→ 눌러진 키 없으면 -1 반환
while(true) {
if (waitKey() == 27) break;
//esc키 == 27번
}
하나의 문자를 인자로 받아 unicode 정수값 반환
cv.namedWindow('img') # 이후 imshow에 대한 창 생성
cv.imshow('img', img)
while True:
keycode = cv.waitKey()
if keycode == ord('i'):
img = ~img
cv.imshow('img', img)
elif keycode == 27 or keycode == ord('q'):
break
cv.destroyAllWindows()
def on_mouse(event, x, y, flags, param):
global oldx, oldy
if event == cv.EVENT_LBUTTONDOWN:
oldx, oldy = x, y
print('EVENT_LBUTTONDOWN: %d, %d' % (x, y))
elif event == cv.EVENT_LBUTTONUP:
print('EVENT_LBUTTONUP: %d, %d' % (x, y))
elif event == cv.EVENT_MOUSEMOVE:
if flags & cv.EVENT_FLAG_LBUTTON:
cv.line(img, (oldx, oldy), (x, y), (0, 255, 255), 2)
cv.imshow('img', img)
oldx, oldy = x, y # 다음번 마우스 이동을 위한 갱신
img = cv.imread('cat.bmp')
if img is None:
exit()
cv.namedWindow('jnary')
# 마우스 이벤트 발생할 때마다 자동적으로 호출될 콜백함수
cv.setMouseCallback('jnary', on_mouse)
cv.imshow('jnary', img)
cv.waitKey()
cv.destroyAllWindows()
트랙바 인터페이스
int createTrackbar(const String& trackbarname, const String& winname, int value, int count, TrackbarCallback onChange = 0, void userdata = 0);
typedef void (TrackbarCallback) (int pos, void userdata);
ex. 그레이스케일 레벨 16단계로 보여주기
def on_level_change(pos):
img[:] = saturated(pos * 16)
cv.imshow('jnary', img)
img = np.zeros((400, 400), np.uint8)
cv.namedWindow('jnary')
cv.createTrackbar('level', 'jnary', 0, 16, on_level_change)
cv.imshow('jnary', img)
int getTrackbarPos(trackbarname, winname)
void setTrackbarPos(trackbarname, winname, pos)
filename = 'mydata.json'
name = 'Jnary'
age = 22
fs = cv.FileStorage(filename, cv.FILE_STORAGE_WRITE)
if not fs.isOpened(): # 열렸는지 확인
print('File open failed!')
exit()
fs.write('name', name)
fs.write('age', age)
fs.release() # 필수, file write 수행 -> 메모리 버퍼 해제
{
"name": "Jnary",
"age": 21,
"point": {
"type_id": "opencv-matrix",
"rows": 2,
"cols": 1,
"dt": "d",
"data": [100.0, 200.0]
},
...
}
<?xml version="1.0"?>
<opencv_storage>
<name>Jnary</name>
<age>21</age>
<point type_id="opencv-matrix">
<rows>2</rows>
...
</point>
XML/YAML/JSON 파일 읽기모드 → 파일 전체 분석 → 계층적 구조 갖는 node 집합 구성
Node : 이름, 값으로 구성되어있는 하나의 데이터
getNode() : 특정 이름으로 저장되어있는 Node에 접근
fs = cv.FileStorage('mydata.json', cv.FILE_STORAGE_READ)
name = fs.getNode('name').string()
age = int(fs.getNode('age').real()) # real : 수치형 변환
print('name: ', name)
print('age: ', age)
fs.release()
임의의 모양을 갖는 ROI(Region-Of-Interest) 설정 목적
입력 영상과 크기 동일, 깊이 = CV_8U인 마스크 영상을 인자로 전달
마스크 영상의 픽셀값 = 0인 좌표에 대해서만 연산 수행
→ 보통 구분이 쉽도록 0~255로 구성된 흑백 영상 사용
ex. 일부 영역에 대해서만 픽셀값 노란색으로
def mask_setTo():
src = cv2.imread('lenna.bmp', cv2.IMREAD_COLOR)
mask = cv2.imread('mask_smile.bmp', cv2.IMREAD_GRAYSCALE)
if src is None or mask is None:
return
src[mask > 0] = (0, 255, 255)
cv2.imshow('src', src)
cv2.imshow('mask', mask)
cv2.waitKey()
cv2.destroyAllWindows()
ex. 마스크 영상에 의해 지정된 일부 영역만 복사하기
dst = cv2.imread('field.bmp', cv2.IMREAD_COLOR)
dst[mask > 0] = src[mask > 0]
tm = cv.TickMeter()
tm.start()
# 측정하고자 하는 연산
tm.stop()
print(tm.getTimeMilli()) # getTimeMicro(), getTimeSec()
tm.reset() # 0부터 다시 시작할 때
tm.reset()
mask : mask 부분의 특정 원소 평균 구하기
sum_img = np.sum(img)
mean_img = np.mean(img, dtype = np.int32)
array = np.array([[1,2,3],[4,5,6],[7,8,9]])
mask = array > 5
mean_value = np.mean(array[mask]) # 마스크 연산 적용 가능
minVal, maxVak, minPos, maxPos = cv.minMaxLoc(img)
최솟값 alpha, 최댓값 beta가 되도록 모든 원소값 크기 조절
실수로 구성된 행렬 → 그레이스케일 영상 형태 변환할 때 유용
src = np.array([[-1, -0.5, 0, 0.5, 1]], dtype=np.float32)
dst = cv.normalize(src, None, 0, 255, cv.NORM_MINMAX, cv.CV_8U)
# dst : [[ 0 64 128 191 255]]