본문 바로가기
First step/AI 기초반

[TIL]21.07.21openCV 기초

by Joshua21 2021. 7. 21.

오늘은 몸상태가 너무 않좋아서 수업을듣기가정말 힘들었다.

거짓말 안보태고 30분마다 한번씩 토를 했다. 라이브 수업듣다가  화면끄고 튀어가서 토하고 다시코드짜고하면서 겨우겨우 들었다.

 

 먼저 지난시간에 했었던 소캣 실습을복습했다.

 

import socket
from _thread import*
from pynput import keyboard
import time
import threading
import sys

bServerLoopEnd=False
bClientWaitEnd=False

def Mainloop():
    if(bServerLoopEnd==False): 
        threading.Timer(0.1,Mainloop).start()
    else:
        print('server close')
        server_socket.clsoe()
        sys.exit()
        
def on_press(key):
    '''
    try:
        print('Alophanumeric key pressed: {0}'.format(kye.char))
        
    except AttributeError:
        print('special key pressed: {0}'.format(key))
    '''
def on_release(key):
    global bClientWaitLoopEnd #전역 변수 bLoopEnd 사용 
    if  key == keyboard.key.esc:
        print("=====esc=====")
        bLoopEnd=True
        return False
#쓰레드에서 실행되는 코드
def clientchkThreaded(i):
    global bServerLoopEnd
    global bClientWaitEnd
    while True:
        print('clientChkThreaded wait!!')
        
        server_socket,settimeout(1)
        if (bClientWaitEnd == False):
            try:
                client_socket, addr=server_socket.accept()
            except socket.timeout:
                continue
            server_soket.settimeout(None)
            print('client_socket connected!!',addr)
            threaded(client_socket,addr)
        else:
            print('keyboardInterrupt')
            bServerLoopEnd = True
            break
            
            
            
            
def threaded(client_socket,addr):
    print('connected by : ',addr[0],':',addr[1])
    while True:
        try:
            #데이터가 수신되면 클라이언트에 다시 전송합니다.(에코)
            data=client_socket.recv(1024)
            
            if not data:
                print('Disconnected by '+ addr[0],':',addr[1])
                break
            print('Received from'+addr[0],':',addr[1],data.decode())
            
            client_socket.send(data)
            
        except ConnectionResetError as e:
            print('Disconnected by'+addr[0],':',addr[1])
            break
    
    print('end')
    client_socket.close()
    
    
HOST ='127.0.0.1'
PORT=9999
server_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,1)
server_socket.bind((HOST,PORT))
server_socket.listen()

print('server start')

i=0
start_now_thread(ClientChkThreaded,(i,))
MainLoop()

#keayboaerd listner를 등록 colletc events until released
with keyboard.Listener(on_press=on_press,on_release=on_release)as listener:
    lintener.join()
    
#리스너 등록방법2    
# listener=keyboard.Listener(on_press=on_press,on_release=on_release)
# listener.start()
# listener.join

 

open cv를 배우기 시작했다.

import cv2
import numpy as np

image= np.zeros((300,400), np.uint8)
image.fill(200)

cv2.imshow('Window title',image)

key= cv2.waitKey(0)
print('key :',key)
cv2.destroyAllWindows()

 

import cv2
import numpy as np

image= np.zeros((200,400), np.uint8)
image[:]=200

title1,title2='Position1','Position2'
cv2.namedWindow(title1,cv2.WINDOW_AUTOSIZE)
cv2.namedWindow(title2)
cv2.moveWindow(title1,150,150)
cv2.moveWindow(title2,400,50)

cv2.imshow(title1,image)
cv2.imshow(title2,image)
cv2.waitKey(0)
cv2.destroyAllWIndows()

 

import cv2
import numpy as np

image= np.zeros((200,300), np.uint8)
image.fill(255)
image[:100] = 100
title1,title2='Autosize','normal'
cv2.namedWindow(title1,cv2.WINDOW_AUTOSIZE)
cv2.namedWindow(title2,cv2.WINDOW_NORMAL)

cv2.imshow(title1,image)
cv2.imshow(title2,image)
cv2.resizeWindow(title1,400,300)
cv2.resizeWindow(title2,400,300)

cv2.waitKey(0)
cv2.destroyAllWindows()

 

import cv2
import numpy as np

switch_case={
    ord('a'):'a키입력',
    ord('b'):'b키입력',
    0x41: 'A키 입력',
    int('0x42',16): 'b키 입력',
    2424832:'왼쪽 화살표키 입력',
    2490368:'위쪽 화살표키 입력',
    2555904:'오른쪽 화살표키 입력',
    2621440:'아래쪽 화살표키 입력'
}

image=np.ones((200,300),np.uint8)
cv2.namedWindow('keyboaerd Event')
cv2.imshow('keyboard Event',image)
while True:
    key = cv2.waitKeyEx(100)
    if key==27: #esc누르면 종료
        break
    try:
        result= switch_case[key]
        print(result)
    except KeyError:
        result=-1
cv2.destroyAllWindows()

 

import cv2
import numpy as np

def onMouse(event,x,y,flags,param):
    if event == cv2.EVENT_LBUTTONDOWN:
        print('마우스 왼쪽 버튼 누르기')
    elif event == cv2.EVENT_RBUTTONDOWN:
        print('마우스 오른쪽 버튼 누르기')
    elif event== cv2.EVENT_RBUTTONUP:
        print('마우스 오른쪽 버튼 때기')
    elif event== cv2.EVENT_LBUTTONUP:
        print('마우스 왼쪽 버튼 때기')

image=np.full((200,300),255,np.uint8)

title1,title2 = 'Mouse Event1','Mouse Event2'
cv2.imshow(title1,image)
cv2.imshow(title2,image)

cv2.setMouseCallback('Mouse Event1',onMouse)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

import cv2
import numpy as np

def onChange(value):
    global image
    print('value 값 : ', value)
    image=np.zeros((300,500),np.uint8)
    image=image + value
    cv2.imshow(title,image)
    
image=np.zeros((300,500),np.uint8)

title='Trackbar Event'
cv2.imshow(title,image)

cv2.createTrackbar('Brightness',title,image[0][0],255,onChange)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

#왼,오마우스버튼으로 화면밝기를10씩조정
import cv2
import numpy as np

def onChange(value):
    global image,title
    image=np.zeros((300,500),np.uint8)
    image=image + value
    cv2.imshow(title,image)
    
def onMouse(event,x,y,flags,param):
    global image,bar_name
    if event == cv2.EVENT_RBUTTONDOWN:
        if (image[0][0]<246): image=image+10
        cv2.setTrackbarPos(bar_name,title,image[0][0])
        cv2.imshow(title,image)
        
    elif event == cv2.EVENT_LBUTTONDOWN:
        if (image[0][0]>=10): image=image-10
        cv2.setTrackbarPos(bar_name,title,image[0][0])
        cv2.imshow(title,image)
    
image=np.zeros((300,500),np.uint8)

title='Trackbar &Mouse Event'
bar_name='Brightness'
cv2.imshow(title,image)

cv2.createTrackbar(bar_name,title,image[0][0],255,onChange)
cv2.setMouseCallback(title,onMouse)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

#왼,오버튼트로 화면 흑,백으로 바꾸기
import cv2
import numpy as np

def onChange(value):
    global image,title
    image=np.zeros((300,500),np.uint8)
    image=image + value
    cv2.imshow(title,image)
    
def onMouse(event,x,y,flags,param):
    global image,bar_name
    if event == cv2.EVENT_RBUTTONDOWN:
        image.fill(0)
        cv2.setTrackbarPos(bar_name,title,image[0][0])
        cv2.imshow(title,image)
        
    elif event == cv2.EVENT_LBUTTONDOWN:
        image.fill(255)
        cv2.setTrackbarPos(bar_name,title,image[0][0])
        cv2.imshow(title,image)
    
image=np.zeros((300,500),np.uint8)

title='Trackbar &Mouse Event'
bar_name='Brightness'
cv2.imshow(title,image)

cv2.createTrackbar(bar_name,title,image[0][0],255,onChange)
cv2.setMouseCallback(title,onMouse)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

#직선 및 사각형그리기
import cv2
import numpy as np


blue,green,red = (255,0,0),(0,255,0),(0,0,255)
image=np.zeros((400,600,3),np.uint8) #3채널컬러영상 생성
image[:]=(255,255,255)
pt1,pt2=(50,50),(250,150)
pt3,pt4=(400,150),(500,50)
roi=50,200,200,100

cv2.line(image,pt1,pt2,red)
cv2.line(image,pt3,pt4,green,3,cv2.LINE_AA)

cv2.rectangle(image,pt1,pt2,blue,3,cv2.LINE_4) #4방향연결선
cv2.rectangle(image, roi,red,3,cv2.LINE_8) #내부 체움
cv2.rectangle(image,(400,200,100,100),green,cv2.FILLED) #내부 채움

cv2.imshow('Line&reactangle',image)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

#글자 쓰기
import cv2
import numpy as np

olive,violet,brown=(128,128,0),(221,160,221),(42,42,165)
pt1,pt2=(50,200),(50,260)

image=np.zeros((300,500,3),np.uint8)
image.fill(255)

cv2.putText(image,'SIMPLEX',(50,50),cv2.FONT_HERSHEY_SIMPLEX,2,brown)#2는확대비율,brown 색상
cv2.putText(image,'DUPLEX',(50,130),cv2.FONT_HERSHEY_DUPLEX,3,olive)
cv2.putText(image,'TRUPLEX',pt1,cv2.FONT_HERSHEY_TRIPLEX,2,violet)

fontFace=cv2.FONT_HERSHEY_PLAIN | cv2.FONT_ITALIC
cv2.putText(image,'ITALIC',pt2,fontFace,4,violet)

cv2.imshow('put text',image)
cv2.waitKey(0)

 

#원그리기
import cv2
import numpy as np


orange,blue,cyan = (0,165,255),(255,0,0),(255,255,0)
white,black = (255,255,255),(0,0,0)
image=np.full((300,500,3),white,np.uint8)

center=(image.shape[1]//2,image.shape[0]//2)#영상의 중심 좌표
pt1,pt2=(300,50),(100,220)
shade=(pt2[0]+2,pt2[1]+2)#그림자 좌표

cv2.circle(image,center,100,blue) #원그리기
cv2.circle(image,pt1,50,orange,2)
cv2.circle(image,pt2,70,cyan,-1) #원 내부 채움

font = cv2.FONT_HERSHEY_COMPLEX
cv2.putText(image,'center_blue',center,font,1.0,blue)
cv2.putText(image,'pt1_orange',pt1,font,0.8,orange)
cv2.putText(image,'pt2_cyan',shade,font,1.2,black,2)
cv2.putText(image,'pt2_cyan',pt2,font,1.2,cyan,1)

title='Draw circles'
cv2.namedWindow(title)
cv2.imshow(title,image)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

#타원 그리기
import cv2
import numpy as np


orange,blue,white = (0,165,255),(255,0,0),(255,255,255)
image=np.full((300,700,3),white,np.uint8)

pt1,pt2 = (180,150),(550,150) #타원의 중심점
size=(120,60) #타원의크기 -반지름값

cv2.circle(image,pt1,1,0,2) #타원의 중심점(2개의픽셀점) 표시
cv2.circle(image,pt2,1,0,2)

cv2.ellipse(image,pt1,size,0,0,360,blue,1)
cv2.ellipse(image,pt2,size,90,0,360,blue,1)
cv2.ellipse(image,pt1,size,0,30,270,orange,4)
cv2.ellipse(image,pt2,size,90,-45,90,orange,4)

cv2.imshow('Draw Eclipse & Arc ',image)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

#실습문제
import cv2
import numpy as np
import random
rand_data=list()
def makeRandom(cnt):
    global rand_data
    x=random.randint(0,400)
    y=random.randint(0,400)
    rand_data.append([x,y])

for i in range(10):
    makeRandom(400)
    
print(rand_data)
rand_arr=np.array(rand_data)

x_max = max(rand_arr[:,0])
x_max_index=np.argmax(rand_arr[:,0])

x_min= min(rand_arr[:,0])
x_min_index=np.argmin(rand_arr[:,0])

y_max = max(rand_arr[:,1])
y_max_index=np.argmax(rand_arr[:,1])

y_min= min(rand_arr[:,1])
y_min_index=np.argmin(rand_arr[:,1])


#page2

orange,blue,cyan=(0,165,255),(255,0,0),(255,255,0)
white,black = (255,255,255),(0,0,0)

image=np.full((400,400,3),white,np.uint8)
center=(image.shape[1]//2,image.shape[0]//2)
cv2.circle(image,center,25,blue)

for i in range(10):
    print(rand_arr[i][0],rand_arr[i][1])
    cv2.putText(image,'+',(rand_arr[i][0],rand_arr[i][1]),cv2.FONT_HERSHEY_SIMPLEX,0.5,(0,0,255))
    
cv2.line(image,rand_data[x_max_index],rand_data[y_min_index],(0,0,255))
cv2.line(image,rand_data[x_max_index],rand_data[y_max_index],(0,0,255))
cv2.line(image,rand_data[x_min_index],rand_data[y_min_index],(0,0,255))
cv2.line(image,rand_data[x_min_index],rand_data[y_max_index],(0,0,255))

title='Ex1'
cv2.imshow(title,image)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

#예제2
import cv2
import numpy as np


def onMouse(event,x,y,flags,param):
    global title,pt
    if event==cv2.EVENT_LBUTTONDOWN:
        if pt[0] <0:
            pt =(x,y)
        else:
            cv2.rectangle(image,pt,(x,y),(255,0,0),2)
            cv2.imshow(title,image)
            pt=(-1,-1)
            
    elif event== cv2.EVENT_RBUTTONDOWN:
        if pt[0]<0: pt=(x,y)
            
        else:
            dx,dy=pt[0]-x,pt[1]-y
            radius=int(np.sqrt(dx*dx+dy*dy))
            cv2.circle(image,pt,radius,(0,0,255),2)
            cv2.imshow(title,image)
            pt=(-1,-1)
            
image=np.full((300,500,3),(255,255,255),np.uint8)
pt=(-1,-1)
title='draw event'
cv2.imshow(title,image)
cv2.setMouseCallback(title,onMouse)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

import cv2

def print_matInfo(name,image):
    if image.dtype=='uint8': mat_type='CV_8U'
    elif image.dtype=='int8': mat_type='CV_8S'
    elif image.dtype=='uint16': mat_type='CV_16U'
    elif image.dtype=='int16': mat_type='CV_16S'
    elif image.dtype=='float32': mat_type='CV_32F'
    elif image.dtype=='float64': mat_type='CV_64F'
    nchannel =3 if image.ndim==3 else 1
    ## depth, channel 출력
    print('%12s: depth(%s),channels(%s)-> mat_type(%sC%d)'%
         (name,image.dtype,nchannel,mat_type,nchannel))

title1,title2 ='gray2gray','gray2color'
gray2gray= cv2.imread('C:/Users/cyan9/read_gray.jpg',cv2.IMREAD_GRAYSCALE)
gray2color=cv2.imread('C:/Users/cyan9/read_gray.jpg',cv2.IMREAD_COLOR)
if (gray2gray is None or gray2color is None):
    raise Exception('영상파일 읽기 에러')

    
print('행렬 좌표 (100,100) 화소값')
print('%s %s'%(title1,gray2gray[100,100]))
print('%s %s\n'%(title2,gray2color[100,100]))
print_matInfo(title1,gray2gray)
print_matInfo(title2,gray2color)
cv2.imshow(title1,gray2gray)
cv2.imshow(title2,gray2color)
cv2.waitKey(0)
cv2.destroyAllWindows()

import sys
sys.path.append('C:\Users\cyan9\common')

import cv2
from common.utils import print_matInfo


title1,title2 ='gray2gray','gray2color'
gray2gray= cv2.imread('C:/Users/cyan9/read_color.jpg',cv2.IMREAD_GRAYSCALE)
gray2color=cv2.imread('C:/Users/cyan9/read_color.jpg',cv2.IMREAD_COLOR)
if (gray2gray is None or gray2color is None):
    raise Exception('영상파일 읽기 에러')
    
print('행렬 좌표 (100,100) 화소값')
print('%s %s'%(title1,gray2gray[100,100]))
print('%s %s\n'%(title2,gray2color[100,100]))

print_matInfo(title1,gray2gray)
print_matInfo(title2,gray2color)
cv2.imshow(title1,gray2gray)
cv2.imshow(title2,gray2color)
cv2.waitKey(0)
cv2.destroyAllWindows()

'First step > AI 기초반' 카테고리의 다른 글

[TIL]21.07.26 CNN  (0) 2021.07.26
[TIL]21.07.23 mnist 사용 기초  (0) 2021.07.23
[TIL]21.07.20TCP/IP 기초 예외처리  (0) 2021.07.20
[TIL] 21.07.19pandas로 웹크롤링  (0) 2021.07.19
[TIL]21.07.19 비지도학습  (0) 2021.07.19