먼저 마우스 콜백(callback) 함수를 등록해야함
void setMouseCallback(string& winname, MouseCallback onMouse, void* userdata =0);
typedef void(MouseCallback)(int event, int x, int y, int flags, void userdata);
import cv2 as cv
def on_mouse(event, x, y, flags, param):
global oldx, oldy
if event == cv.EVENT_LBUTTONDOWN:
oldx, oldy = x,y
print('L down %d %d'%(x,y))
elif event == cv.EVENT_LBUTTONUP:
print('L up %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('CV images/lenna.bmp') # 이미지 불러오기
if img is None:
print('Image load failed!')
exit()
cv.namedWindow('img')
cv.setMouseCallback('img', on_mouse) # 이미지에 콜백함수 붙이기
cv.waitKey()
cv.destroyAllWindows()
범위안의 값 선택가능한 GUI
int createTrackbar(string& trackbarname, String& winname, int value, int count, TrackbarCallback onChange = 0, void userdata =0);
(이름, 생성창, 위치 받을 정수형 변수 주소, 최대 위치, 콜백함수, 전달할 사용자 데이터 포인터)
정상동작시 1 반환, 아니면 0 반환
typedef void (TrackbarCallback)(int pos, void userdata);
트랙바를 이용해서 이미지를 점차 반전시키는 프로그램
import cv2 as cv
import numpy as np
def saturated(value): #숫자 0~255 내로 범위조정 함수
if value > 255:
value = 255
elif value < 0:
value =0
return value
def callback(pos): # 콜백 함수
img2 = img+saturated(pos*16)
cv.imshow('img2', img2)
img = cv.imread('CV Images/lenna.bmp')
if img is None:
print("open error")
exit()
img2 = np.copy(img)
cv.imshow('img2',img2) # 이미지 보여주기
cv.createTrackbar('bar','img2',0,16,callback ) # 트랙바 생성
cv.waitKey()
cv.destroyAllWindows()
FileStorage(string& filename, int flags, string& encoding= String());
virtual bool FileStorage::isOpened();
정상적으로 열렸으면 true 리턴
virtual void FileStorage:: release()
파일 닫고 메모리 버퍼 해제
사진에 그림 그리고 저장
import cv2 as cv
def on_mouse(event, x, y, flags, param):
global oldx, oldy
if event == cv.EVENT_LBUTTONDOWN:
oldx, oldy = x,y
print('L down %d %d'%(x,y))
elif event == cv.EVENT_LBUTTONUP:
print('L up %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('CV images/lenna.bmp')
if img is None:
print('Image load failed!')
exit()
fs = cv.FileStorage('myimg.json', cv.FILE_STORAGE_WRITE) # 저장 클래스 생성
cv.namedWindow('img')
cv.setMouseCallback('img', on_mouse)
cv.waitKey()
fs.write('data', img) # 이미지 저장
fs.release()
cv.destroyAllWindows()
json 파일에는 JSON 문법을 이용하여 각각의 데이터가 저장돼있음
getNode() 함수를 이용하여 각 노드에 접근
import cv2 as cv
import numpy as np
fs = cv.FileStorage('myimg.json', cv.FILE_STORAGE_READ)
####
img = fs.getNode('data').mat()
####
img = np.array(img, dtype = np.uint8)
print(img)
print(img.shape)
cv.imshow('img',img)
cv.waitKey()
cv.destroyAllWindows()