반응형

아래 코드는 기본적으로 파이썬을 이용해서 영상을 추출할 수 있는 코드이다.

또한 cv2.cvtColor함수를 이용해 원본 영상을 gray로 변경해서 추출했다.

 

기본적으로 카메라가 있어야 하며 (노트북 가능)

numpy와 opencv 패키지가 깔려있어야 한다.

cv2.VideoCapture( 숫자 ) 는 컴퓨터에 연결된 카메라의 갯수만큼 1씩 증가한다. 기본카메라는 0으로 잡히고, 2대가 더 연결된다면, 1, 2 이렇게 잡힐 것이다.

import numpy as np
import cv2

# 기본이 0번, 만약 비디오가 2개이면 1번 cap이라는 변수에 넣어서 핸들링함.
cap = cv2.VideoCapture(0)

while(True):
    ret, frame = cap.read()     # 정상적인 값을 받으면, ret가 True이고, cap.read하면 한 프레임씩 읽어들임.

    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    cv2.imshow('frame', frame)          #   한장을 받아서 연속적으로 프래임 출력.
    cv2.imshow('gray', gray)			#	기본 영상을 gray로 변환

    if cv2.waitKey(1) & 0xFF == ord('q'):   #   q가 나오면 종료
        break

cap.release()
cv2.destroyAllWindows()

(결과)

반응형

 

 

<영상에서 RGB색상 추출하기>

https://ansan-survivor.tistory.com/638

 

[Python OpenCV] 영상에서 R,G,B 색상 추출하기 (원본에서 빨강, 초록, 파랑 색만 골라서 추출)

아래 코드는 반드시 카메라가 있어야 하며, 카메라에 접근할 수 있는 드라이버가 설치되어야 한다. 노트북의 경우 카메라가 달려있기 때문에 바로 사용가능하다. 사용을 위해서는 라이브러리 op

ansan-survivor.tistory.com

 

 

반응형
반응형

 

아래 코드는 반드시 카메라가 있어야 하며, 카메라에 접근할 수 있는 드라이버가 설치되어야 한다.

노트북의 경우 카메라가 달려있기 때문에 바로 사용가능하다.

사용을 위해서는 라이브러리 opencv와 numpy가 있어야 한다.

 

# 라이브러리 다운로드
# pip install opencv-python
# pip install numpy


import cv2
import numpy as np

cap = cv2.VideoCapture(0)       # 카메라 모듈 사용.

while(1):
    ret, frame = cap.read()     #   카메라 모듈 연속프레임 읽기

    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)    # BGR을 HSV로 변환해줌

    # define range of blue color in HSV
    lower_blue = np.array([100,100,120])          # 파랑색 범위
    upper_blue = np.array([150,255,255])

    lower_green = np.array([50, 150, 50])        # 초록색 범위
    upper_green = np.array([80, 255, 255])

    lower_red = np.array([150, 50, 50])        # 빨강색 범위
    upper_red = np.array([180, 255, 255])

    # Threshold the HSV image to get only blue colors
    mask = cv2.inRange(hsv, lower_blue, upper_blue)     # 110<->150 Hue(색상) 영역을 지정.
    mask1 = cv2.inRange(hsv, lower_green, upper_green)  # 영역 이하는 모두 날림 검정. 그 이상은 모두 흰색 두개로 Mask를 씌움.
    mask2 = cv2.inRange(hsv, lower_red, upper_red)

    # Bitwise-AND mask and original image
    res = cv2.bitwise_and(frame, frame, mask=mask)      # 흰색 영역에 파랑색 마스크를 씌워줌.
    res1 = cv2.bitwise_and(frame, frame, mask=mask1)    # 흰색 영역에 초록색 마스크를 씌워줌.
    res2 = cv2.bitwise_and(frame, frame, mask=mask2)    # 흰색 영역에 빨강색 마스크를 씌워줌.

    cv2.imshow('frame',frame)       # 원본 영상을 보여줌
    cv2.imshow('Blue', res)           # 마스크 위에 파랑색을 씌운 것을 보여줌.
    cv2.imshow('Green', res1)          # 마스크 위에 초록색을 씌운 것을 보여줌.
    cv2.imshow('red', res2)          # 마스크 위에 빨강색을 씌운 것을 보여줌.

    k = cv2.waitKey(5) & 0xFF
    if k == 27:
        break

cv2.destroyAllWindows()
반응형

(파이썬 실행 결과)

red파라미터값이 주변 조명에 의해 잘 추출되지 않았다. 값을 수정하면 된다.

주변 빛의 밝기에 따라 추출값이 달라질 수 있다.

범위 값 파라미터를 적절히 변경하여 사용하면 된다.

 

 

<영상을 그레이로 변경하기>

https://ansan-survivor.tistory.com/639

 

[Python OpenCV] 파이썬 영상 추출하기, 회색(gray)으로 배경 변경하기

아래 코드는 기본적으로 파이썬을 이용해서 영상을 추출할 수 있는 코드이다. 또한 cv2.cvtColor함수를 이용해 원본 영상을 gray로 변경해서 추출했다. 기본적으로 카메라가 있어야 하며 (노트북 가

ansan-survivor.tistory.com

 

<RGB색상 합성하기>

https://ansan-survivor.tistory.com/640

 

[Python OpenCV] 파이썬 두 이미지 합치기, 두 이미지 합성 시키기 (RGB값 더하기)

Mask를 이용하여 두 이미지를 합성하는 예제 코드이다. 단, 두 이미지의 크기가 같아야 작동한다. 만약 이미지 크기가 조금이라도 다르다면 오류를 일으킨다. 여기서는 flippy.jpg 라는 이미지와 'log

ansan-survivor.tistory.com

 

 

 

반응형
반응형

파이썬 패키지를 윈도우 cmd 터미널 창에서 설치할 수 있듯이, 파이참 내부에서도 해당 동일한 터미널 환경을 제공한다. 이를 이용해 pip 명령어로 패키지 설치가 가능하다. 또한 GUI환경으로 손쉽게 어떤 패키지가 설치되어있는지 알려주고 없는 패키지를 설치 할 수 있다.

 

 

<<터미널로 설치>>

1. 하단에 Terminal을 클릭하면, 터미널 환경으로 바뀐다.

2. 테스트로 numpy 패키지를 설치해봤다.

pip install numpy

이런식으로 손쉽게 설치가 가능하다.

 

 

<<GUI 로 설치>>

1. File - Settings

2. Project탭에 Python Interpreter를 선택하면, 어떤 패키지가 설치되어있는지 항목과 버전이 나온다.

3. 새로운 패키지를 설치하고자 하면, 아래 +를 누른다.

4. 원하는 항목을 검색하면 리스트가 나온다.

5. install package 를 선택하면 자동으로 설치가 된다.

 

반응형
반응형

파이참은 기본적으로 여러 가상 환경 (virtual environment)을 만들고 파이썬을 실행 할 수 있도록 지원한다.

그런데 이러한 지식없이 파이썬을 쓰다보면 내가 작성한 코드가 실행이 안되는 경우가 있다.

처음 프로젝트 생성때 잘 세팅을 해야 한다.

 

 

1. File - New Project

2.

3. System Interpreter를 클릭하면 default 인터프리터의 경로가 자동으로 들어가는데, 이를 설정한다.

   Python3을 초기 설치시 인터프리터의 기본위치는 아래와 같다.

C:\Users\계정이름\AppData\Local\Programs\Python\Python37

해당 인터프리터를 파이참에 default로 자동 config시킨다.

4. Create를 눌러 프로젝트 생성

 

반응형

 

(결과 테스트)

실행버튼
샘플 코드 실행
print 결과 출력

잘 코드가 실행되었다.

 

반응형
반응형

cmd에서 파이썬을 구동시켜주기 위해서는 먼저 파이썬3를 설치해야 한다.

테스트 했던 버전은 python 3.8.2 이다. 아래 링크로 다운로드 할 수 있다. (windows OS)

www.python.org/downloads/release/python-382/

 

Python Release Python 3.8.2

The official home of the Python Programming Language

www.python.org

 

 

파이썬 코드를 이용해서 내부 공유기 환경에서 체팅 서버를 만들 수 있다.

하나의 컴퓨터가 서버로 코드를 구동하면, 여러 클라이언트들이 접속해서 대화를 나눌 수 있다.

 

 

아래는 소스코드

(서버 코드)

import socketserver
import threading

HOST = '192.168.219.104' # 서버의 ip를 열음. (이 서버의 ip로 클라이언트가 접속을 해야 한다), 그전에 ping을 먼저 확인하도록.
PORT = 9009				 # 포트번호 (같아야 함)
lock = threading.Lock()  # syncronized 동기화 진행하는 스레드 생성


class UserManager:  # 사용자관리 및 채팅 메세지 전송을 담당하는 클래스
    # ① 채팅 서버로 입장한 사용자의 등록
    # ② 채팅을 종료하는 사용자의 퇴장 관리
    # ③ 사용자가 입장하고 퇴장하는 관리
    # ④ 사용자가 입력한 메세지를 채팅 서버에 접속한 모두에게 전송

    def __init__(self):
        self.users = {}  # 사용자의 등록 정보를 담을 사전 {사용자 이름:(소켓,주소),...}

    def addUser(self, username, conn, addr):  # 사용자 ID를 self.users에 추가하는 함수
        if username in self.users:  # 이미 등록된 사용자라면
            conn.send('이미 등록된 사용자입니다.\n'.encode())
            return None

        # 새로운 사용자를 등록함
        lock.acquire()  # 스레드 동기화를 막기위한 락
        self.users[username] = (conn, addr)
        lock.release()  # 업데이트 후 락 해제

        self.sendMessageToAll('[%s]님이 입장했습니다.' % username)
        print('+++ 대화 참여자 수 [%d]' % len(self.users))

        return username

    def removeUser(self, username):  # 사용자를 제거하는 함수
        if username not in self.users:
            return

        lock.acquire()
        del self.users[username]
        lock.release()

        self.sendMessageToAll('[%s]님이 퇴장했습니다.' % username)
        print('--- 대화 참여자 수 [%d]' % len(self.users))

    def messageHandler(self, username, msg):  # 전송한 msg를 처리하는 부분
        if msg[0] != '/':  # 보낸 메세지의 첫문자가 '/'가 아니면
            self.sendMessageToAll('[%s] %s' % (username, msg))
            return

        if msg.strip() == '/quit':  # 보낸 메세지가 'quit'이면
            self.removeUser(username)
            return -1

    def sendMessageToAll(self, msg):
        for conn, addr in self.users.values():
            conn.send(msg.encode())


class MyTcpHandler(socketserver.BaseRequestHandler):
    userman = UserManager()

    def handle(self):  # 클라이언트가 접속시 클라이언트 주소 출력
        print('[%s] 연결됨' % self.client_address[0])

        try:
            username = self.registerUsername()
            msg = self.request.recv(1024)
            while msg:
                print(msg.decode())
                if self.userman.messageHandler(username, msg.decode()) == -1:
                    self.request.close()
                    break
                msg = self.request.recv(1024)

        except Exception as e:
            print(e)

        print('[%s] 접속종료' % self.client_address[0])
        self.userman.removeUser(username)

    def registerUsername(self):
        while True:
            self.request.send('로그인ID:'.encode())
            username = self.request.recv(1024)
            username = username.decode().strip()
            if self.userman.addUser(username, self.request, self.client_address):
                return username


class ChatingServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
    pass


def runServer():
    print('+++ 채팅 서버를 시작합니다.')
    print('+++ 채텅 서버를 끝내려면 Ctrl-C를 누르세요.')

    try:
        server = ChatingServer((HOST, PORT), MyTcpHandler)
        server.serve_forever()
    except KeyboardInterrupt:
        print('--- 채팅 서버를 종료합니다.')
        server.shutdown()
        server.server_close()

runServer()

 

반응형

 

서버 사용 방법.

cmd로 해당 파이썬 파일을 실행시키며 구동.

 

서버 구동.

1. cmd 입력

2. 내 ip주소 확인

    ipconfig

서버의 ip주소를 192.168.219.104 로 한다.

3. 해당 ip주소로 파이썬 server.py 코드를 수정해준다.

4. 해당 디렉터리로 이동해서 명령 프롬프트로 아래와 같이 쓰면 서버가 실행된다.

python server.py

 

 

클라이언트 사용 방법.

cmd로 해당 파이썬 파일을 실행시키며 구동.

 

(클라이언트 소스코드)

import socket
from threading import Thread

HOST = '192.168.219.104'    # 내가 접속할 서버의 ip주소
PORT = 9009                 # 서버의 포트 번호 (서로 같아야 연결 가능)


def rcvMsg(sock):
    while True:
        try:
            data = sock.recv(1024)
            if not data:
                break
            print(data.decode())
        except:
            pass


def runChat():
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
        sock.connect((HOST, PORT))
        t = Thread(target=rcvMsg, args=(sock,))
        t.daemon = True
        t.start()

        while True:
            msg = input()
            if msg == '/quit':
                sock.send(msg.encode())
                break

            sock.send(msg.encode())


runChat()

 

클라이언트 구동.

1. cmd 입력

2. 접속할 서버의 ip주소로 파이썬 client.py 코드를 수정해준다.

3. 그리고 같은 공유기 망에 있는 어떤 컴퓨터든 간에 명령프롬프트로 client.py를 실행시키면 접속이 된다.

    필자는 컴퓨터가 1대이므로 루프백 방식으로 서버이자 클라이언트로 접속했다.

 

    3-1. 로그인 ID를 입력하라고 나오면 id를 입력하면 된다. 필자는 student1으로 입력해서 접속했다.

왼쪽 서버, 오른쪽 클라이언트

    3-2. student2, student3 계정을 더 만들어서 접속했다.

    서버에는 아래와 같이 현재 몇명이 접속되었는지 실시간으로 체크가 된다.

 

 

(에러 문제) 만약 서버의 ip주소를 잘못 입력하거나, 서버가 닫혀있을때 아래와 같은 에러가 발생한다.

 

반응형
반응형

이미지파일에 원하는 부분에 색상을 넣고, 글자를 넣는다.

 

원본파일은 아래와 같다. (mask.jpg)

이 파일을 아래 파이썬 코드를 실행시켜본다.

3개의 함수를 직접 만들었다.

'''

made by 안산드레이아스
https://ansan-survivor.tistory.com/

'''

import cv2

clickflag = 0       # 클릭상태 확인 전역변수 초기값 0

def draw_circle(event, x, y, flags, param):
    if event == cv2.EVENT_LBUTTONDOWN :                         # 마우스 왼쪽버튼을 누르면
        cv2.circle(img, (x, y), 10, (255,0,0), -1)              # (x,y)마우스좌표 중심점으로 반지름 10, (B,G,R)색상, -1은 내부 모두 채움

def draw_rec(event, x,y, flags, param):
    if event == cv2.EVENT_LBUTTONDOWN:
        cv2.rectangle(img, (x,y), (x+100,y+100), (0,255,0), 3)  # (x,y)마우스좌표 중신점으로 100x100 사각형을 만듦

def free_drawing(event, x,y, flags, param):                     # 자유롭게 그리기
    global  clickflag                                           # 클릭상태를 확인 (전역 변수를 불러옴)

    if event == cv2.EVENT_LBUTTONDOWN:                          # 왼쪽버튼을 누르면 플레그를 1로
        clickflag = 1
    if event == cv2.EVENT_LBUTTONUP:                            # 버튼은 때면 0으로
        clickflag = 0

    if clickflag == 1:
        event = cv2.EVENT_MOUSEMOVE                             # 플레그가 1일때, 마우스가 움직여도 그림이 그려짐
        cv2.circle(img, (x, y), 10, (255, 0, 0), -1)

img = cv2.imread('./mask.jpg', cv2.IMREAD_COLOR)                                    # img에 이미지를 불러옴.
img = cv2.line(img,(0, 100), (1025, 100), (155,55,55),(30))                         # 위쪽에 가로 줄을 그음.
font = cv2.FONT_HERSHEY_DUPLEX                                                      # 텍스트의 폰트를 지정.

cv2.putText(img, "WARNNING!! This is DDOS Virus", (20, 90), font, 2,(0,0,155), 2, cv2.LINE_AA)  # 텍스트를 입력, 글자, 위치, 폰트, 크기 등

cv2.namedWindow('image')
cv2.setMouseCallback('image', free_drawing)         #  free_drawing함수 호출 (이곳에서 윈도우에서 실행결정)

while(1):
    cv2.imshow('image', img)
    if cv2.waitKey(20) & 0xFF == 0x1B:                  # 무한 반복중, 키보드 ESC 아스키코드가 들어오면 빠져나감.
        break

cv2.destroyAllWindows()             # 창을 종료

 

반응형

 

(결과)

먼저 위에 코드에 있는 "WARNNING!! This is DDOS Virus" 라는 텍스트가 쓰여지고 위에 길다란 직사각형이 생성된다.

이제 유저가 마우스 드레그를 하면 아래와 같이 그림이 그려진다. (hello world라고 써봤다)

그리고 ESC가 들어오면 해당창이 꺼진다.

 

 

 

 

 

반응형
반응형

 

서버 코드

import socket

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('192.168.109.226', 9008))    # ip주소, 포트번호 지정
server_socket.listen(0)                          # 클라이언트의 연결요청을 기다리는 상태

client_socket, addr = server_socket.accept()     # 연결 요청을 수락함. 그러면 아이피주소, 포트등 데이터를 return

data = client_socket.recv(65535)                 # 클라이언트로 부터 데이터를 받음. 출력되는 버퍼 사이즈. (만약 2할 경우, 2개의 데이터만 전송됨)

print("받은 데이터:", data.decode())             # 받은 데이터를 해석함.

 

반응형

클라이언트 코드

import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

sock.connect(('192.168.109.226', 9008))     # 접속할 서버의 ip주소와 포트번호를 입력.
sock.send('Hello'.encode())                 # 내가 전송할 데이터를 보냄.

내부망(공유기)으로 2대의 컴퓨터나 가상머신으로 테스트해보면 된다.

본인 ip주소는 ipconfig로 찾고, 포트는 안쓰는 포트 아무거나 적어서 테스트 해본다.

 

이를 응용하면, 아래와 같이 체팅서버를 만들 수 있다.

ansan-survivor.tistory.com/319

 

파이썬 체팅 서버 만들기, 체팅 서버 및 클라이언트

cmd에서 파이썬을 구동시켜주기 위해서는 먼저 파이썬3를 설치해야 한다. 테스트 했던 버전은 python 3.8.2 이다. 아래 링크로 다운로드 할 수 있다. (windows OS) www.python.org/downloads/release/python-382/..

ansan-survivor.tistory.com

 

반응형
반응형

사용전 라이브러리 opencv와 numpy가 필요하다.

라이브러리 설치법은 아래 참고

ansan-survivor.tistory.com/308

 

[Python OpenCV] 파이썬 바코드(barcode), QR코드 인식 프로그램 코드

먼저 바코드를 인식하는 open source 라이브러리를 제공해주는데, 그 라이브러리를 pip을 이용해 다운로드 한다. 윈도우의 cmd 창을 이용해서 다운받아본다. 총 3개의 라이브러리가 필요하다. 1. openCV

ansan-survivor.tistory.com

 

왜곡된 이미지에서 4개의 포인트를 지정하고 쭉 펼치는 테스트 함수다.

아래 좌표점은 테스트를 위해 미리 찾아서 넣은것이다.

'''

made by 안산드레이아스
https://ansan-survivor.tistory.com/

'''

# 왜곡된 이미지를 쭉 펼치는 테스트

import cv2
import numpy as np

img = cv2.imread('hough.jpg')
rows, cols, ch = img.shape

a = [[65,15],[481,13],[28,439],[508,445]]
b = [[0, 0],[1000, 0],[0,500],[1000,500]]   # 왼쪽위점, 오른쪽위점, 왼쪽아래점, 오른쪽아래점

pts1 = np.float32(a)
pts2 = np.float32(b)

img = cv2.circle(img, (a[0][0], a[0][1]), 3, (0,0,255),-1)
img = cv2.circle(img, (a[1][0], a[1][1]), 3, (0,0,255),-1)
img = cv2.circle(img, (a[2][0], a[2][1]), 3, (0,0,255),-1)
img = cv2.circle(img, (a[3][0], a[3][1]), 3, (0,0,255),-1)
#cv2.circle(img, c, 5, (55, 255, 55), -1)

M = cv2.getPerspectiveTransform(pts1, pts2)
dst = cv2.warpPerspective(img, M, (1000, 500))  # 변환후 크기 (x좌표, y좌표)

cv2.imshow('imgage',img)
cv2.imshow('dst', dst)
cv2.waitKey(0)
반응형

테스트 이미지(hough.jpg)

(결과) 왼쪽 원본이미지에서 찍은 4개 좌표, 오른쪽 쭉 펼치기

 

 

 

반응형
123456

+ Recent posts