728x90

 

 기후 변화, 방사능 유출같은 세계적인 문제들로 인해, 그리고 에너지 소모를 줄이기 위해 많은 공학자들이 세로운 제어기 설계 방법을 찾으려고 노력하고 있습니다.

 

 그러한 설계 방법을 그린 엔지니어링 green engineering이라고 부르며, 그린 엔지니어링의 목표는 오염을 줄이고, 사람에게 유해를 줄이도록 하는 제품을 만드는것이 목표라 할수 있겠습니다. 이러한 그린 엔지니어링의 원칙에 따라서 피드벡 제어 시스템의 유용함을 보여드리고자 합니다.

 

 지구 온난화 문제와 오염을 줄이기 위해서는 환경 모니터링 시스템을 늘리고, 품질도 높여야만하는데요. 한 가지의 예시로 외부 환경을 관측하는 무선으로 이동하면서 감지하는 플랫폼들이 있습니다. 보내지는 전력과 전압의 변화 등을 측정하는것도 그러한 예시라고 할수 있겠습니다.

 

 수많은 그린 엔지니어링 시스템들을 다루기 위해서는 신중하게 전류와 전압을 보아야만 하는데요. 전력 변환기는 전력 공급망 상에서 흘러가는 다양한 크기의 전류를 측정하고 모니터링을 할수 있어야 하며, 여기서 사용되는 센서들은  측정치가 제어 시스템이 적절한 동작을 하는데 필요한 정보들을 제공하므로 제어 시스템의 핵심 요소라고 할수 있습니다.

 

 그린 엔지니어링에서의 제어시스템의 역활은 자동화와 정밀화 수준이 높아만 가면서 세계적으로 큰 역활을 하게 될겁니다. 그래서 이후에는 풍력 발전기같은 그린 엔지니어링의 제어나 태양의 밝기가 변화하는 사이에서도 전력 생산량을 최대로 하는 태양광 발전기 피드벡 제어 시스템을 설계해보겠습니다.

 

 제어 시스템으로 개발할수 있는 다른 재밌는 것으로 IoT가 있습니다. 여기서 IoT란 Internet of Things의 약어로 많은 전자 장치들이 연결된것을 말합니다. IoT 네트워크 상에서 수백만의 장치들은 각자의 컴퓨터가 내장되어 인터넷에 연결 됩니다. 이러한 연결된 장비들을 제어해보는것은 제어 공학도에게는 신나는 일이라 할수 있을것 같습니다.

 

 그래서 제어 공학은 재미있고, 도전할만한 분야라고 생각합니다. 제어 시스템은 본래 여러 분야가 혼합된 학문으로, 엔지니어링 커리큘럼 상에서 핵심역활을 한다고 할수 있겠습니다. 이 분야에서는 수학적 배경 지식이 많이 필요하므로, 정리와 증명과 같이 이론적인 부분들도 다루긴 할겁니다. 하지만 최종 목표는 현실에서 동작가능한 제어기를 설계하는 것이므로, ad-hoc(임기 응변)적인 방법과 직관력으로 피드백 제어기를 설계해 보겠습니다.

 

 앞으로 배우는데 있어서 가장 중요한 것은 과거에 다루었던 문제와 이에 대답을 다시 찾아보는것이라 할수 있겠습니다. 그래서 학생들이 수많은 문제들과 해결방안 그리고, 수십년 전에 있어왔던 해결 방안에 대해서 배워보아야 합니다. 옛날의 학습 방법에서 학생은 이러한 문제를 고민하지 않고 단순히 과제들을 풀기만 했었습니다. 하지만 이 과정을 통해서 배우는 사람들이 이론적인 어려움을 줄이고 창의성과 즐거움을 찾길 희망하고 있습니다.

 

 이제 피드벡 제어 이론의 구조에 대해서 살펴보고, 다양한 흥미로운 주제들을 드리고자 합니다. 그래서 여러분들이 피드벡 제어 시스템 이론과 실습에 도움이 되었으면 좋겠습니다.

300x250
728x90

EMC 관점 수동 소자

1. 저항

2. 캐패시터

3. 인덕터

4. Ferrite Bead

5. EMI Filter

6. Common Mode Choke Coil

7. 3단자 캐패시터

 

 

 

 

저항 registor

- 전류 흐름을 억제하는 소자

- 옴의 법칙 : I = V/R

- 저항 특성 : 캐패시터 , 인덕터와 달리 전력 소모

- 기호

- 물리적 원리 : rho는 물질의 비저항(고유저항), s는 물질의 단면적, l은 길이

           => 저항은 고유저항과 길이에 비례, 단면적에 반비례

 

 

 

 

저항의 종류

1. 직렬 접속 저항

- V = IR에 따라 R은 직렬합

 

2. 병렬 접속 저항

- 병렬 접속으로 인해 직렬에 비해 저항의 크기가 줄어듬

 

 

 

 

 

캐패시터 capacitor

- 에너지 저장하는 소자

- 저장 에너지

- 교류 저항

- 시간 영역에서 캐패시터의 전류 전압과의 관계식

- 기호

 

- 물리적 원리 : epsilon_0는 자유공간 유전율, epsilon_r은 비유전율, d는 전극간 거리, S는 전극 면적

 

 

캐패시터의 합성

1. 직렬 연결

 

2.병렬 연결

 

 

캐패시터와 SRF Self Resonant Frequency

- 동작 주파수가 증가할수록 Passive 소자의 제작 구조상 발생하는 기생 캐패시턴스와 인덕턴스의 영향으로 의도된 임피던스 특성과 겨양과 반대로 동작하기 시작하는 주파수

- 캐패시터의 경우 SRF보다 높은 주파수에서 인덕터로 동작

 

 

 

 

 

 

 

 

 

 

 

300x250
728x90

휴대폰 비행기 모드의 필요성

- 전자 시스템 전파 간섭 우려 때문에 필요

=> 전화, 메시지, 인터넷 등이 사용 불가

- 비행기 운형에 영향을 주는 전자파

=> 항공기 운행 오작동 발생 가능

 

 

 

 

전자파란?

- 주기적으로 세기가 변하는 전자기장이 공간속으로 전파해 나가는 파동 현상

- 아래의 그림은 전자파를 이루는 전기장과 자기장을 보여줌

https://m.blog.naver.com/PostView.nhn?blogId=winglass&logNo=220987431370&proxyReferer=https:%2F%2Fwww.google.com%2F

 

 

 

 

전자파의 반사, 굴절, 회절

- 반사 : 입사한 전자파가 되돌아가는 현상

- 굴절 : 산란체의 경계면에서 전자파 진행경로가 꺾이는 현상

- 회절 : 장애물에 의해 전자파가 도달할수 없는 곳에서 전자파가 전파되는 현상

 * 방송이나 무선통신에서 송신 안테나를 볼수없는데도 전자파를 수신함

 

전자파의 세기

- 전자파 발생원으로부터 거리에 따라 급격히 감소

- 자유 공간 진행(직접파)하거나 반사 또는 굴절된 전자파의 전력은 거리의 제곱에 반비례하여 감소

- 회절된 전자파의 전력은 거리에 반비례하여 감소

 * 회절된 전자파는 회절이 일어나는 지점에서 세기가 크게 줄어들므로 직접파나 반사파, 굴절파에 비해 세기가 크게 약해짐

 

 

주파수 스펙트럼과 용도

- 아래의 그림은 각 주파수대역별 용도를 보여줌

http://www.ktword.co.kr/abbr_view.php?m_temp1=624&id=1029

 

 

 

 

 

 

전자파 관련 용어

EMC(Electro Magnetic Compatibility)

- 전자파 적합성or 전자파 양립성

- 기기외부로 불요 전자파를 최소로 방출시켜 다른 기기에 전자파 간섭을 일으키지 않고, 외부로부터 전자파 간섭에 영향을 받아도 정상적으로 동작할 수 있는 상태

 

EMI - Electro Magnetic Interference

- 전자파 간섭

- 전류 흐름에 의해 도선에 자연적으로 발생되는 에너지가 타 기기에 방해 간섭원천으로 동작되는 형태

 

 

EMS Electro Magnetic Susceptibility

- 전자파 내성

- 외부의 전자파 간섭으로부터 전자기기가 간섭을 받음에도 얼마나 기능을 하는가 의미

 

 

 

 

EMI 전자파 간섭의 종류

- RE Radiated Emission 방사방출 : 30MHz 이상 회로서 발생. 전자파가 공기로 방사되는 전자파를 잡음

- Conducted Emission 전도 방출 : 30MHz 이하 회로에서 발생. 신호선, 전원선 같은 매질로 전달되는 전자파 잡음

-ESD ElectroStatic Discharge 정전기 방전

   : 서로 다른 정전기 전위 가진 물체가 가까워질때 갑작스러운 전하 이동으로 과전류 흘러 오작동 발생하는 현상

- RS Radiated Susceptibility 방사 내성 : 자유공간으로부터 전파되어오는 전자파 간섭에 견디는 정도

- CS conducted Susceptibility 전도 내성 :외부 케이블, power cords, IO interconnect 등에서 오는 전자파 간섭에 견디는 정도

- EFT/Burst Electrical Fast Transient/Burst : 전기적 빠른 과도 현상

- Surge : 전기회로에서 수초간 지속되는 전압, 전류, 전력의 과도 현상

- Voltage Dip : 전압 강하. 전압 감소 전자 시스템의 한 지점에서 전압이 급격히 감소했다가 짧은 시간 후에 회복되는 현상

- hazard 위해 : 전자파가 유기체에 미치는 위협

- EMP Electro Magnetic Pulse : 전자파 펄스. 

 

 

 

 

 

 

 

 

전자파 발생 원리

- 아래의 그림은 전자기파의 발생 원리를 보여줌

- 전선을 따라 전류가 흐르면 주위에 전기장과 자기장이 형성됨

https://m.blog.naver.com/applepop/221087212063

 

- 아래의 그림은 LC회로로. 축전기와 코일이 규칙적으로 진동하는 회로

 

 

 

전파의 속도

- 지구 7바퀴 반 도는데 1초

- 지구에서 화성가는데 3.3초

- 지구에서 태양가는데 8분 3초

- 전파의 속도 초당 30만 km

 

 

 

 

 

전자파 환경

- 자연 잡음 :자연적 현상에 의해 발생하는 잡음

       => 대기 잡음 : 번개, 이온층 임펄스, 슈만공진

      => 우주 잡음 : 태양 흑점 활동, 천체 축 열 잡음

- 인공 잡음 : 인간이 사용하는 기계에 의해 발생하는 잡음

    => 의도적 잡음 : 제품 성능 및 기기 동작을 위해 고의적으로 Rf에너지 발생시키는 경우

        * 예시 : 송신기 고조파, 수신기의 국부발진기(AM/FM), TV의 동기 펄스, 마이크로프로세스

    => 비의도적 잡음 : 제품의 성능 또는 기능 동작을 수행하는 동안 비의도적으로 RF 에너지가 발생

       * 예시 : 전동기, 전기접점 기기(릴레이, 스위치), 스파크 방전(이그니션), 코로나 방전(송전선)

 

 

 

전자파 기술 변화 과정

1. 1900년대 이전 - 전자파 개념 존재 x

- 교환 시설 : 수동식(자석식/ 공전식)

- 전송/정보/이동통신 : 기술 발전 미흡

- 전자파 환경 : 자연환경에 의한 전자파가 존재

 

2. 1900년대 - 전자파 활용 기술 연구

- 교환시설 : 기계식 (STM/EM/Cross-Bar)

- 전송 : 아날로그 전송기술 사용(나선 반송/동축케이블/PCM방식)

- 전자파 환경 : 군사 목적에 의해 중요성 인식 시작

 

 

3. 1970년대 - 군사 목적에 의한 전자파 대응

- 교환시설 : 반전자식 교환기 (No.1AESS)

- 전송 : 아날로그 방식 이동전화 상용화

- 전자파 환경 : 무선 분야 기술 전개에 따른 전자파 중요성 인식

 

 

4. 1980년대 - 선진국 중심 EMI 자율적 규제

- 교환시설 : 전전자식

- 이동통신 : 아날로그방식 세계적 운영

- 전송기술 :광통신망 이용

- 전자파 환경 :전자 산업 발달에 따른 전자파 문제 발생 및 중요성 강조

   => 전자파 규제 시작

 

5. 1990년대 - 국내 산업기기 EMI 승인 의무화

- 디지털 시대

- 전파환경의 복잡, 무선 시설이ㅡ 발달

- 사용 주파수 대영 증가

- 전자파 환경 : 전자파 세계적 강제 규제

    =>세계 각국 자국 산업 보호를 위한 규제

 

6. 2000년대 - 전자파 규제 범위 확대

- 유무선 위성통신의 통합

- 첨단 멀티미디어 시대 IMT-2000

- 전자파 환경 : 소비자 및 제품 품질 수준의 척도. => EMI규제에서 EMS 분야로 확대

 

 

 

EMC 문제 대두 배경

1. 전기 전자기기의 디지털화

- 아날로그 회로 : 잡음의 영향이 일과성이 강함

- 디지털 회로 : 메모리 소자 내장, 낮은 직류 전류에서 동작 => 미약한 잡음 영향이 메모리에 기억되어 오작동 발생

 

2. 전기 전자기기의 저전력화

 - 기기의 소형화,  전지의 긴 수명 확보

   => 동작 전압이 낮아짐(저전력화) => 같은 잡음 레벨에도 장애 발생

 

3. 전기 전자기기의 고밀도화

 - CPU가 내장된 디지털 기기의 급속한 보급

 => 좁은 공간에 인접해짐 => 각기기간 전자파 간섭이 심해짐

 

 

300x250
728x90

목표

- 전기전자기기 설계시 전자파 적합성 전반을 이해도를 높여 초기 설계 단계에서 대책을 수립

- 회로에 반영하여 EMC 문제로 인한 비용을 최소화 하기 위함

 

 

OrCAD ( CAD : Computer Aided Design)

- cad : 컴퓨터 기반 설계의 약어

- 제도가 아닌 컴퓨터를 이용한 설계

- 전자 분야에서 설계 자동화에 사용되는 프로그램을 EDA( Electronic Design Automation, 전자설계 자동화) 라고 부름

 

 

CAD 프로그램 종류

- PADS, P-CAD, CADSTAR

- OrCAD : 전자회로설계, 회로시뮬레이션, 회로기판 설계

 

 

 

 

OrCAD

- EDA 전자 설계 자동화 프로그램중 하나로 국내에서 보편적으로 사용됨

- 주요 프로그램

프로그램 주요 기능
Capture 회로도 Schematic 설계
Capture CIS OrCAD Capture에 대화 형식의 부품정보
시스템 통합한것
Pspice 회로 시뮬레이터
PCB Editor PCB 설계
Signal Integrity SI(회로 무결성) 분석

 

 

 

OrCAD Capture 특징

- 회로도 Schematic 분석을 쉽게 도와줌

- 전자회로 도면을 그려서 이를 인쇄회로기판 PCB : Printed Circuit Board로 구현하기 위한 Netlist File을 생성 가능

- 명령어의 빠른 접근을 위한 툴바와 툴 팔레트 제공

- 부품 목록, 도면 정보등을 문서화 시켜서 이를 데이터베이스화

- Excel, Lotus 등 각종 스프레드 시트 등과 파일 호환 가능

 

 

 

회로도 작성 방법

1. 프로젝트 시작

 

2. 설계 환경 설정

 

3. 부품 배치 및 배선하기 ( 부품 생성, 라이브러리 추가, 풋 프린트값 입력)

 

4. 어노테이트 (참조값 갱신)

 

5. DRC ( Design Rule Check)

 

6. 후처리 파일(네트리스트, BOM 파일 등) 생성

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

300x250
728x90

이미지 기본 연산 다루기

 

1. 목표

 

- 특정 픽셀에 접근해서 값을 바꿔봅시다

- 이미지 속성에 접근해 보겠습니다.

- 이미지 영역 Region Of Interest(ROI)을 설정해봅시다

- 이미지를 나누거나 병합해봅시다.

 

 이번에 학습할 연산들은 opencv보다 넘파이와 관련이 많습니다. 또, opnecv로 최적화된 코드를 작성하기 위해서는 넘파이에 대해 깊이 이해하는게 필요합니다.

 

 

 

2. 특정 픽셀에 접근해서 값을 바꾸기

 

import cv2
import numpy as np

img = cv2.imread('/Users/jdo/git/python_vision/01day/kimheungkook.jpg',cv2.IMREAD_COLOR)


px = img[100, 100]
# bgr 색상모델 값을 출력해줍니다.
print(px)

# 파랑색 요소만 접근해서 출력해봅시다.
blue = img[100, 100, 0]
print (blue)


# 동일한 방법으로 픽셀 값을 바꿀수도 있습니다.
img[100, 100] = [255, 255, 255]
print(img[100, 100])

cv2.imshow("iamge", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

파일명 : 01_pixel.py

- 이미지를 우선 로드하고

- 한 픽셀을 y, x 좌표계로 접근해 봅시다.

- BGR 이미지로 로드한 경우 파랑, 녹색, 빨강 값으로 이루어진 배열이 반환될겁니다.

- 흑백 영상의 경우에는 명암 강도 하나만 반환 됩니다.

 

 

 

 

 

- '나' 사이에 흰 점이 보이죠?

# img[100,100] = [255, 255, 255]

 

 

 

 

 

 

 

 

2. 이미지 속성 접근하기

 

 이미지 속성으로는 행과 열, 채널의 수(shape), 이미지 데이터 타입(dtype), 픽셀의 갯수(size) 등이 있습니다.

 

 각 요소에는 아래의 코드로 접근 가능 합니다.

 

import cv2
import numpy as np

img = cv2.imread('/Users/jdo/git/python_vision/01day/kimheungkook.jpg',cv2.IMREAD_COLOR)


print(img.shape)

print(img.size)

print(img.dtype)

파일명 : 02_property.py

 

 

 

 

 

3. 이미지 관심영역 Image ROI

 

 이미지의 특정 영역을 다루고 싶은 경우도 있습니다. 영상에서 눈 검출을 하는 경우 얼굴을 찾을떄까지 영상 전체에서 얼굴 검출을 수행하게 되는데요. 얼굴을 찾고나면 눈의 위치 찾기를 시작합니다. 얼굴위에는 항상 눈이 있으니까 이 방법으로 정확성을, 작은 영역을 찾으므로 성능을 개선시킬수가 있습니다.

 

 ROI는 넘파이 인덱싱을 사용해서 얻을수 있는데요. 다음과 같이 이미지를 변경시킬수도 있습니다.

 

import cv2
import numpy as np

img = cv2.imread('/Users/jdo/git/python_vision/01day/kimheungkook.jpg',cv2.IMREAD_COLOR)


# y x좌표
name = img[55:85, 30: 150]
img[200:230, 200:320] = name
img[340:370, 200:320] = name


cv2.imshow("iamge", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

파일명 : 03_roi.py

 

- 원본 영상에서 이름 영역 (y,x 좌표상) 55:85(y), 30 : 150(x)의 값들을 name 변수에 담아 지정한 좌표에 담아줬더니

- 이름이 복사된 결과를 학인할 수 있습니다.

 

 

 

 

 

 

 

 

 

300x250
728x90

트랙바를 컬러 팔래트로 사용하기

 

1. 목표

- opencv 윈도우 상에 트랙바를 올리는 방법을 배워봅시다.

- 이번에는 cv2.getTrackbarPos(), cv2.createTrackbar() 등의 함수들을 배워보겠습니다.

 

 

2. 코드 데모

 

 이번 시간에는 지정한 색상을 보여주는 간단한 어플을 만들어 보겠습니다. 우리가 만들 프로그램은 색상을 보여주고 3개의 BGR 컬러를 지정가능한 트랙바를 가진 윈도우를 만들고자 합니다. 트랙바를 슬라이드해서 이와 적합하도록 윈도우 색상이 변하게 될겁니다. 초기에는 검은색으로 초기화 시키도록 하겠습니다.

 

 cv2.getTrackbarPos() 함수는 첫번째 매개변수로 트랙바 이름, 두번째는 이 트랙바가 부착될 윈도우 이름을 지정해주어야하고, 세번째 값으로는 디폴트 값, 네번째는 최대 값, 다섯번째는 트랙바가 변할떄마다 실행될 콜백 함수를 지정해주어야 합니다. 콜백 함수는 트랙바 위치 값을 디폴트 매개변수로 사용하게 됩니다. 하지만 이 케이스에서는 콜백 함수를 사용하지않으므로 단순히 pass 하도록 만들겠습니다.

 

 

 이 어플리케이션에서 다른 중요한 요소중 하나는 버튼(스위치)를 사용하는 것입니다. opencv에선 기능적으로 버튼을 제공하고 있지는 않지만 트랙바를 이용해서 스위치 같은 역활을 하도록 만들겠습니다. 여기서 스위치를 만들어, 스위치가 on이 되어있는 동안 어플이 동작하게 될거고, 그렇지 않으면 스크린이 항상 검은색이 되도록 하겠습니다.

 

import cv2
import numpy as np

def nothing(x):
	pass

#이름이 image인 검은 윈도우를 생성하겠습니다.
img = np.zeros((300, 513, 3), np.uint8)
cv2.namedWindow("image")


# 색사이 바뀌도록 하는 트랙바를 생성해봅시다.
cv2.createTrackbar("R", "image", 0, 255, nothing)
cv2.createTrackbar("G", "image", 0, 255, nothing)
cv2.createTrackbar("B", "image", 0, 255, nothing)

# on/off를하는 스위치를 만들어봅시다.
switch = "0 : OFF \n 1 : ON"
cv2.createTrackbar(switch, "image", 0, 1, nothing)


while (1):
	cv2.imshow("image", img)
	k = cv2.waitKey(1) & 0xFF
	if k == 27:
		break

	# 트랙바값 읽기
	r = cv2.getTrackbarPos("R", "image")
	g = cv2.getTrackbarPos("G", "image")
	b = cv2.getTrackbarPos("B", "image")
	s = cv2.getTrackbarPos(switch, "image")

	# 스위치가 OFF이면 검은화면으로, On이면 색상 띄우기
	if s == 0:
		img[:] = 0
	else:
		img[:] = [b,g,r]

cv2.destroyAllWindows()

파일명 : 04_trackbar.py

 

 

 

 

 

 

 

 

 

 

 

 

 

300x250
728x90

마우스를 패인트 브러쉬로 사용하기

 

 

 

 

 

 

 

 

 

 

1. 목표

- 마우스 이벤트를 핸들링(다루는) 방법을 배워봅시다.

- 여기서 다음 함수를 사용하겠습니다 : cv2.setMouseCallback()

 

 

2. 간단한 데모

 

 이미지에 더블클릭하면 원을 그리는 간단한 어플을 만들어 보겠습니다.

 

- 마우스 콜백 함수를 만듭시다

 

-. 마우스 이벤트가 발생할때마다(왼쪽 마우스 누르거나, 때는 등) 해당 마우스 이벤트의 좌표를 알려줍니다.

 

- 이때 이벤트와 좌표로 아무거나 할수 있습니다. 

 

- 마우스 콜백 함수(이벤트가 발생시 호출할 함수)를 특정한 형식으로 정의해주고, 더블 클릭을 할때 원을 그리는 동작을 하도록 해봅시다.

 

 

 

 

import cv2
import numpy as np

# mouse callback function
def draw_circle(event,x,y,flags,param):
    if event == cv2.EVENT_LBUTTONDBLCLK:
        cv2.circle(img,(x,y),100,(255,0,0),-1)

# Create a black image, a window and bind the function to window
img = np.zeros((512,512,3), np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image',draw_circle)

while(1):
    cv2.imshow('image',img)
    if cv2.waitKey(20) & 0xFF == 27:
        break
cv2.destroyAllWindows()

파일명 : 01_simplecallback.py

 

=> 더블 클릭한 자리에 반지름이 100픽셀인 꽉찬 파란색이 생성되었습니다.

 

 

 

 

 

3. 사진에 콜백을 등록해서 원그리기

 

import cv2
import numpy as np

# mouse callback function
def draw_circle(event,x,y,flags,param):
    if event == cv2.EVENT_LBUTTONDBLCLK:
        cv2.circle(img,(x,y),20,(255,0,0),4)

# Create a black image, a window and bind the function to window
img = cv2.imread("/Users/jdo/Documents/GitHub/opencv_python/04day/sarangsonnim.png",cv2.IMREAD_COLOR)
cv2.namedWindow('image')
cv2.setMouseCallback('image',draw_circle)

while(1):
    cv2.imshow('image',img)
    if cv2.waitKey(20) & 0xFF == 27:
        break
cv2.destroyAllWindows()

파일 명 : 02_demo.py

- 아래의 가족 사진에  반지름 20, 폭이 2인 파란색 원을 그리는 콜백함수 등록 하는 응용프로그램

 

 

 

 

 

 

 

4. 데모 프로그램 개선하기

 

 이번에 더 나은 어플을 만들어 봅시다. 이번에는 설정한 모드에 따라서 사각형을 그리거나 원을 드래그를 해서 그릴수 있도록 구현하겠습니다. 그래서 마우스 콜백 함수에는 2파트로 나뉘게 되는데, 하나는 사각형, 나머지 하나는 원을 그리는 내용들이 되겠습니다

 

 다음 예시가 나중에 물체 추적과 영상 분할같은 상호작용(인터렉티브) 어플을 만들고 이해하는데 많은 도움이 되겠스비다.

 

 

import cv2
import numpy as np
import math

drawing = True # true if mouse is pressed
mode = False # if True, draw rectangle. Press 'm' to toggle to curve
ix,iy = -1,-1

# mouse callback function
def draw_circle(event,x,y,flags,param):
	global ix,iy,drawing,mode

	if event == cv2.EVENT_LBUTTONDOWN:
		drawing = True
		ix,iy = x,y

	elif event == cv2.EVENT_LBUTTONUP:
		drawing = False
		if mode == True:
			cv2.rectangle(img,(ix,iy),(x,y),(0,255,0),5)
		else:
			radius = (ix-x)^2 + (iy - y)^2
			print(radius)
			cv2.circle(img,(x,y),int(radius),(0,0,255),5)


img = cv2.imread("/Users/jdo/Documents/GitHub/opencv_python/04day/sarangsonnim.png",cv2.IMREAD_COLOR)
cv2.namedWindow('image')
cv2.setMouseCallback('image',draw_circle)

while(1):
    cv2.imshow('image',img)
    k = cv2.waitKey(1) & 0xFF
    if k == ord('m'):
        mode = not mode
    elif k == 27:
        break

cv2.destroyAllWindows()

파일명 ; 03_dragdemo.py

 

1. 사진을 띄웁니다.

2. 마우스 콜백 등록합니다.

3. 마우스 콜백에서 마우스 왼쪽을 누르면 시작점 지정

4. 꾹 누른 상태에서 이동후 마우스 올리면 현재 위치까지 사각형이나 해당 길이를 반지름으로 하는 원이 그려짐

5. 중간에 m키를 누르면 모드가 변경

 

 

300x250
728x90

1. 목표

- opencv로 기하학적 형태를 그리는 방법에 대해서 배워봅시다.

- 여기서 다음의 함수들을 배워보겠습니다.

 ex) cv2.line(), cv2.circle(), cv2.rentagle(). cv2.ellipse(), cv2.putText()

 

 

2. 코드 개요

- 위 함수들을 사용해보기 전에 일반적으로 사용되는 매개변수들에 대한 설명들을 하겠씁니다.

- img : 드로잉을 할 이미지(그림) 파일을 의미합니다.

- color : 색상 값을 BGR 형태로 입력해 줍니다.(명시하지 않으면 하나의 튜플, 즉 그레이스케일로 지정됩니다.)

     예를 들어 (255, 0, 0)을 하면 파란 색이나오고, 그레이 스케일을 사용한다면 스칼라 값 하나를 적어주면 되겠습니다

- thickness 두께 : 두께는 원이나 선의 두꼐를 의미합니다. 기본 값은 1

- lineType : 선의 특징을 지정하며, 8연결성이나 안티에일리어싱 같은게 있습니다. 기본 값은 8연결성으로,

                 cv2.LINE_AA를 줄 경우 곡선에서 더 보기 좋게 만들어 집니다.

 

* 안티 에일리어싱 : 계단현상 방지기능

https://namu.wiki/w/%EC%95%88%ED%8B%B0%EC%97%90%EC%9D%BC%EB%A6%AC%EC%96%B4%EC%8B%B1

 

 

3. 선 그리기

 

 선을 그리려면 시작점과 끝점을 지정해주면 됩니다.

1. 우선 검은색 영상을 생성해주고

2. 왼쪽 위에서 오른쪽 아래까지 파란 선을 그려주겠습니다.

 

import numpy as np
import cv2

# Create a black image
img = np.zeros((512,512,3), np.uint8)

# Draw a diagonal blue line with thickness of 5 px
img = cv2.line(img,(0,0),(511,511),(255,0,0),5)

cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

 파일 명 : 01_drawline.py

 

 

 

4. 사각형 그리기

import numpy as np
import cv2

# Create a black image
img = np.zeros((512,512,3), np.uint8)

img = cv2.rectangle(img,(384,0),(510,128),(0,255,0),3)

cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

파일명 : 02_drawrectangle.py

- 왼쪽 위 코너와 오른쪽 아래 코너, 색상과 두께를 지정해주면 만들어 집니다.

- 이번 예제는 녹색 상자로 두께가 3

 

 

 

5. 원을 그려보자

 

 원을 그리려면 원의 중심과 반지름을 명시해주면 됩니다. 추가로 색상과 두께를 지정해주면 그려지는데 이번 경우에는 두께자리에 -1을 주어 원안을 빨간색으로 채우겠습니다.(BGR 모델)

 

import numpy as np
import cv2

# Create a black image
img = np.zeros((512,512,3), np.uint8)

img = cv2.circle(img,(447,63), 63, (0,0,255), -1)

cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

파일명 : 03draw_circle.py

 

 

 

 

 

300x250
728x90

 

 

 

 

1. 목표

- 영상을 읽고, 돌려보고, 저장하는 방법을 배워봅시다.

- 카메라 영상(웹캠이나, 비디오)을 읽어들이고 출력하는 방법을 배웝보시다.

- 여기서 다음 함수를 배우겠습니다. : cv2.VideoCapture(), cv2.VideoWriter()

 

 

2. 카메라(혹은 웹캠)에서 읽어보기

 

 카메라로부터 실시간 스트리밍이 필요하다면 opencv에서 간단한 인터페이스(함수)를 제공하고 있습니다. 카메라로 부터 비디오 영상들을 캡처하여 이를 회색 영상으로 바꾸고 출력해보도록 하겠습니다.

 

 비디오를 캡처하려면, VideoCapture라고 부르는 객체를 만들어야 합니다. 여기서 매개변수는 읽어들일 비디오 파일 이름이나 카메라 장치의 번호를 주면 됩니다. 장치 번호는 어느 카메라를 선택할건지 명시하는 요소입니다(보통 내장 웹캠은 0, 추가 usb 웹캠은 1, 2, 3 순으로)  비디오 캡처로 읽어들이면 프레임 단위로 확인할수 있으나, 작업이 다끝난후 자원을 해제하는걸 잊지 말아주세요

 

 

 

import cv2

cap = cv2.VideoCapture("/Users/jdo/Documents/GitHub/opencv_python/02day/horangnabi.mp4")

while(True):
	# Capture frame-by-frame
	ret, frame = cap.read()
	print(frame)
	# Our operations on the frame come here
	gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

	# Display the resulting frame
	cv2.imshow('frame',gray)
	if cv2.waitKey(1) & 0xFF == ord('q'):
		break

# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()

 

파일명 : 01_videocapture.py

- cap.read() 함수는 반환 결과 ret와 영상 한 프레임 frame을 반환합니다(위코드에서)

 

* 맥북에서 웹캠 스트리밍이 안되는 관계로 호랑나비 영상으로 대체

 

 

 

 

3, 비디오 저장하기

 

 캡처한 비디오를 저장하는 방법은 간단하게도 cv2.imwrite()함수를 사용ㅎ가ㅣ만 하면 됩니다. 단지 여기서 추가적인 작업만 몇개 더함녀 되는데, videowrite 객체를 생성해 주면 됩니다. 여기서 출력할 파일 명을 명시해주고(ex. output.avi) FourCC를 정의하면 됩니다.

 

  FourCC는 비디오 코덱을 설정하기 위한 4바이트 암호화기(?)로 fourcc.org에서 상세한 정보를 확인하실수 있겠습니다.

 다음의 코덱들이 저의 경우에 사용가능 했었습니다.

 

 

  • In Fedora: DIVX, XVID, MJPG, X264, WMV1, WMV2. (XVID is more preferable. MJPG results in high size video. X264 gives very small size video)
  • In Windows: DIVX (More to be tested and added)
  • In OSX : (I don’t have access to OSX. Can some one fill this?)

 

 FourCC 암호화기는 MJPG로 비디오를 저장하고자 할때 다음과 같이 명시하시면 되겠습니다.

-> cv2.VideoWriter_fourcc('M','J','P','G')

-> cv2.VideoWriter_fourcc(*'MJPG) 

 

import numpy as np
import cv2

cap = cv2.VideoCapture("/Users/jdo/Documents/GitHub/opencv_python/02day/horangnabi.mp4")

# Define the codec and create VideoWriter object
fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')
out = cv2.VideoWriter('output.mp4',fourcc, 10.0, (492,360))

while(cap.isOpened()):
	ret, frame = cap.read()
	#print(frame.shape)
	if ret==True:
		frame = cv2.flip(frame,0)

		# write the flipped frame
		out.write(frame)

		cv2.imshow('frame',frame)
		if cv2.waitKey(1) & 0xFF == ord('q'):
			break
	else:
		break

# Release everything if job is finished
cap.release()
out.release()
cv2.destroyAllWindows()

파일명 ; 02_savingvideo.mp4

- cv2.videowriter()를 명시할떄, 원본 영상과 동일한 해상도를 지정해 주어야 합니다.

=> 안하면 영상 저장이 제대로 안됨

 

 

 

 

 

300x250
728x90

https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_gui/py_image_display/py_image_display.html#display-image

 

Getting Started with Images — OpenCV-Python Tutorials 1 documentation

Getting Started with Images Goals Here, you will learn how to read an image, how to display it and how to save it back You will learn these functions : cv2.imread(), cv2.imshow() , cv2.imwrite() Optionally, you will learn how to display images with Matplot

opencv-python-tutroals.readthedocs.io

 

이미지를 가지고 시작해보자

 

목표

 

- 이 과정을 통해서 이미지를 읽는 방법과 화면에 띄우고 어떻게 저장을하는지 배워봅시다.

- 여기서는 다음과 같은 함수들을 사용하겠습니다. => cv2.imread(), cv2.imshwo(), cv2.imwrite()

- 옵션으로, matplotlib으로 이미지들을 표시할수도 있겠습니다.

 

 

 

1, opencv를 사용하여 이미지를 읽어보자

 

kimheungkook.jpg

 

 cv2.imread() 함수로 이미지를 읽을수 있습니다. 여기서 첫번째 매개변수는 이 이미지들은 작업 공간에 존재하거나 아니면 전체 경로를 전달해주어야 합니다.

 

 두번째 매개변수는 플래그로 이 이미지를 어떻게 읽을지 명시하게 됩니다.

 

- cv2.IMREAD_COLOR : 색상 정보를 가진 이미지로 읽습니다. 대신 투명 성분은 무시(디폴트 플래그)

- cv2.IMREAD_GRAYSCALE : 이미지를 그레이 스케일 모드(명암 영상)으로 읽어들입니다.

- cv2.IMREAD_UNCHANGED : 알파 채널(투명도)를 포함해서 이미지를 로드합니다.

 

 

 

import numpy as np
import cv2

# 이미지를 흑백 영상( gray scale)로 읽어봅시다.
img = cv2.imread('/Users/jdo/git/python_vision/01day/kimheungkook.jpg',0)

print(img)

파일명 : 01_imread.py

- 상대경로시 작업 공간 경로를 기준으로 파일을 찾기때문에 그냥 절대 경로를 주었습니다.

 

- 읽은 img를 print로 출력했더니, 흑백 이미지 정보(2차원 배열- 명암)을 출력 합니다.

 

 

* Visual Studio Code(VS Code) pylint Module cv2 has no member - import cv2 에러 해결방법. 

 다음 링크를 참조하자

http://blog.naver.com/x21999/221254889848

 

 

 

2. 이미지를 출력해 보자

 

 

import numpy as np
import cv2

# 이미지를 흑백 영상( gray scale)로 읽어봅시다.
img = cv2.imread('/Users/jdo/git/python_vision/01day/kimheungkook.jpg',0)

cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

파일명 : 02_imshow.py

- imshow 함수로 image 라는 이름의 윈도우를 띄웁니다.

- waitKey(0)을 눌러 직접 키누를때까지 종료를 멈춥니다. 

- 이미지가 닫히면 존재하는 모든 윈도우 자원들을 해제합니다.

 

 

결과

 

 

 

3. 이미지 쓰기

 

 

import numpy as np
import cv2

# 이미지를 흑백 영상( gray scale)로 읽어봅시다.
img = cv2.imread('/Users/jdo/git/python_vision/01day/kimheungkook.jpg',0)

cv2.imwrite('kimheungkook.png',img)

파일명 : 03_imwrite.py

- 위 코드를 실행하면 김흥국.jpg를 읽어들인 후 png 파일로 저장합니다.

 

=> 작업 공간 루트에 저장됨..

 

 

 

4. 정리하기

 

import numpy as np
import cv2

img = cv2.imread('/Users/jdo/git/python_vision/01day/kimheungkook.jpg',0)
cv2.imshow('image',img)
k = cv2.waitKey(0) # 키 입력을 받을떄 까지 기다립니다.
if k == 27:         # ESC 키가 눌리면 모든 이미지 자원들을 해제 합니다.
    cv2.destroyAllWindows()
elif k == ord('s'): # s를 누르면 저장 후 저원들을 해제 합니다.
    cv2.imwrite('kimheungkook.png',img)
    cv2.destroyAllWindows()

파일명 : 04_sumup.py

- 키 입력을 받을떄까지 이미지 띄우고 대기

- esc 를 누르는 겨우 자원 해제 후 종료

- s를 누르는 경우 png로 저장후 자원 해제 후 종료

 

* 다른 키를 눌러도 화면은 꺼지지만 정상적으로 자원이 해제되지 않습니다.

 

 

 

* 다음 부터는 아래로 작업 공간이 변경됩니다.

/Users/jdo/Documents/GitHub/opencv_python

300x250

+ Recent posts