반응형

OpenCV 로고

1. OpenCV


OpenCV는 Open Source Computer Vision의 약자로 영상 처리에 사용할 수 있는 오픈 소스 라이브러리 입니다. 컴퓨터가 사람의 눈처럼 인식할 수 있게 처리해주는 역할을 하기도 하며, 우리가 많이 사용하는 카메라 어플에서도 OpenCV가 사용하기도 한다. (추가로 자율주행자동차에서 자동차의 눈이 되주는 것이 카메라와 OpenCV가 합작해서 해낸 일이다.) 추가로 사용되는 예로는 

  • 공장에서 제품 검사할 때
  • 의료 영상 처리 및 보정 그리고 판단
  • CCTV영상
  • 로보틱스

등 다양한 범위에서 사용되고 있다. 카메라로 찍어서 할 수 있는 모든 일은 OpenCV로 처리할 수 있다. 여기에 머신 러닝과 A.I를 활용해서 그 활용도를 더욱 넓혀가고 있는 중이다.

이런 느낌의 일을 할 수 있다.
사진을 보정

 

OpenCV가 더욱 인기있는 이유는 오픈소스이지만 BSD(Berkely Software Distribution)라이선스를 따르기 때문에, 상업적 목적으로 사용해도 좋다. 그리고 소스코드 공개 의무가 없다는 점에서 강점을 가지고 있다. OpenCV의 기원은 인텔에서부터 시작되는데, 컴퓨터 비전과 인공지능의 발달 시키고자 하는 바램으로 OpenCV를 출시한 것이다. (with Grary Bradski) 

 

OpenCV는 실시간 처리에 중점을 두고 설계되서 빠른 속도와 효율성을 자랑한다. 기반 언어는 C++로 멀티 코어 프로세서를 활용할 수 있다. 심지어 인텔IPP(Integrated Performance Primitives)를 통한 최적화 루틴을 활용함으로써 로우레벨에서 자동화된 최적화를 사용할 수 있다. 이전에는 유료로 구매해야 했지만, OpenCV 3.0 부터는 IPP의 일부를 무료로 제공해주고 있다. 

[사실 인텔은 OpenCV를 배포함으로써 OpenCV가 점차 발전함에 따라 빠른 프로세서가 필요시 되고 이는 인텔 프로세서의 수요가 늘어나 수입이 늘어나는 큰 그림을 그리고 있었다.]

그렇다면 여기서 가장 중요한 단어인 컴퓨터 비전이란 무엇인가?

 

2. 컴퓨터 비전?


컴퓨터 비전은 카메라로 얻은 일련의 영상들을 모두 컴퓨터 비전이라 한다. 사람은 눈을 통해 많은 정보를 받아들인다. 지금 이 글을 읽는 순간에도 눈을 통해서 읽고 있지 않은가? 프로그래밍에서 항상 생각해보아야 할 것 중 하나의 원칙은 '사람에게 쉬운 일은 컴퓨터에게 어려울 수 있다.'라는 말이다. 컴퓨터 비전 또한 마찬가지이다. 사람에게 너무나 쉬운 보는 일은 컴퓨터에게는 너무나도 어려운 일이다. 하나의 사진에서 사람을 가려내고, 그 속에서 지나는 여러 사물을 골라내는 일은 컴퓨터에게 어렵다. 사람은 이렇게 어려운 일을 자연스럽게 해낸다. 카메라의 역할을 하고 있는 눈은 빛을 자연스럽게 조절하며, 초점을 자동으로 조절한다. 정말 대단한 일인 것이다. 카메라는 이를 일일히 작업해서 맞춰줘야 한다. 카메라가 사진을 찍으면 컴퓨터는 이를 단순한 숫자로 인식할 뿐이다. 오로지 0과 1로 이루어져서 다시 나올 뿐이다. 

 

컴퓨터는 단순히 숫자로 이루어진 형태로 사진을 인식할 뿐이다.

컴퓨터는 이러한 숫자의 행렬로 사진 및 여러 형태를 인식한다. 그렇다면 우리는 이러한 형태를 가지고 컴퓨터에게 유의미한 정보를 입력해줌으로써 사람이 보는 시선과 최대한 비슷하게 만들어야 하는 것이다. 하지만 여기에는 많은 문제가 도사리고 있다. 우리의 시각 정보는 왜곡이 많다. 예를 들어 우리가 보는 관점에 따라 사물이 왜곡될 확률이 있다. 다른 왜곡은 빛의 양에 따라 달라지기도 하며 비가 오는 경우에는 더욱 심각해진다. 심지어 카메라의 성능에 따라 계속 변한다. 전기적 노이즈도 생각해봐야 한다. 이러한 왜곡을 이겨내고서 우리는 정확한 이미지 처리가 필요한 것이다. (심지어 카메라는 3D 정보를 2D로 받아들이고 있다.) 

 

이 부분에 대한 해결책은 머신러닝 기술로 어느정도 보완하고 있다. 혹은 다른 추가적인 데이터를 활용해서, 예를 들어 라이다 센서 혹은 거리 센서를 활용해서 왜곡정보를 올바르게 해석하기 위한 노력을 하고 있다. 그리고 OpenCV는 이러한 다양한 문제들을 해결하기 위한 도구를 제공해주는 것을 목표로 한다. 지금도 많은 연구가 이루어지고 있으며, 다양한 자료들이 쏟아져 나오고 있다. 

 

OpenCV와 사용할 수 있는 언어로는 C/C++, 파이썬, Java등이 있다. 요새 많이 쓰이는 언어로는 파이썬이 많이 사용되고 있다. 빅데이터와 머신 러닝에서 강점을 보이고 있기에 파이썬이 많이 쓰인다. 하지만 이 블로그에서는 C++을 통해서 사용하도록 할 예정이다. 나중에 기회가 된다면 파이썬을 통한 머신러닝과 딥러닝 그리고 A.I를 사용할 때 파이썬을 사용하려 한다. 하나의 언어를 제대로 배워두면 다른 언어에 대한 장벽은 높지 않은 편이므로 일단은 C++로 진행하려 한다. 

 

3. 기본 구조


OpenCV의 기본 아키텍처는 다음과 같다.

기본 아키텍처

각 요소를 살펴보자면,

  • CV : Computer Vision으로 기본 구성 요소에서는 기본 이지미 처리와 고급 컴퓨터 비전 알고리즘을 포함하고 있다.
  • ML (Machine Learning) : 머신러닝이 주를 이루므로 이를 활용할 수 있는 기본적인 통계 분류기와 클러스터링 도구를 포함하고 있는 라이브러리들이 있다.
  • HighGUI : OpenCV에 기본으로 포함되어 있는 GUI이다. 여기에는 비디오와 이미지 저장 그리고 이를 로드하기 위한 I/O 루틴을 포함하고 있다. 이 모듈을 활용해서 사용자의 입력을 받고 그에 따른 출력하는 기능을 하는 유저 인터페이스 기능을 하고 있다. 기본 기능으로 지원하고 있지만 조금 더 범용적으로 Qt를 사용한다. (윈도우 GUI 툴킷 정도라 생각할 수 있다.)
  • CXCORE : 이곳에는 기본 데이터 구조와 여러 content가 구성되어 있다. 

OpenCV 아키텍처 (TBB는 Threading Building Blocks - 병렬처리를 위한 것이라 생각하면 된다.)

다른 관점에서 보자면 이러한 아키텍처 구조를 갖는다. 다양한 라이브러리의 모듈이다. 업데이트가 되면 달라지겠지만 현재 모듈 구성은 다음과 같다.

  • Core - 모든 객체 타입과 기본 연산자가 들어 있는 라이브러리 섹션

  • Imgproc - 이미지 처리 모듈로써 이미지 변환 등을 포함하고 있다.

  • highgui - 위에서 설명했다. ( 사용자의 입력을 받는 유저 인터페이스 기능 포함)

  • video - 비디오 라이브러리로써 비디오 스트림을 read/write하는 함수가 포함되어 있다.

  • calib3d - 캘리브레이션하는데 필요한 알고리즘이 포함된 모듈

  • features2d - 중요한 feature(특징)을 탐지하고 표현, 매칭하기 위한 알고리즘이 구현된 모듈

  • objdetect - 말 그대로 오브젝트 디텍트, 특정 오브젝트를 탐지하는 알고리즘이 들어있는 모듈이다. 이를 머신 러닝으로 기계 학습 시켜서 특정 물체들을 탐지할 수 있다.

  • ml - 머신러닝 라이브러리

  • flann - Fast Library for Approximate Nearest Neighbors 나중에 이야기하겠지만, 머신러닝에 사용되는 알고리즘이다. 자세한 내용은 

flann의 자세한 내용은 공식 깃헙 [github.com/mariusmuja/flann]에 있다.

  • gpu - 그래픽 카드를 이용한 연산을 사용한다. 일명 그래픽카드 연산을 위한 라이브러리이다. CUDA연산에 최적화 되어 있다. 당연히 머신러닝을 위한 설계이다. CUDA (Computed Unified Device Architecture)로써 NVIDIA에서 개발한 GPU 개발툴이다. 딥러닝에서 사용하기 위해서 만들어졌으며, 하드웨어에서는 얻을 수 없는 연산을 할 때 많이 사용된다. 비트코인 채굴할 때 사용하는 것이 CUDA이다. (tensorflow도 사용된다.)

  • photo - 사진을 활용할 수 있는 다양한 도구를 포함하고 있다.

  • stitching - 스티치 파이프라인을 구현하기 위한 모듈, Image stitching이란 이미지를 포갤 지점을 찾는 과정이라 생각하면 된다. 이를 빠르게 하는 파이프라인을 구현하기 위한 모듈이라 생각하면 된다.

  • nonfree - OpenCV에서 특허나 사용 제한이 걸려있는 알고리즘의 구현이 이곳에 있다. ( 예를 들어 SIFT알고리즘)

등이 존재한다.

 

4. 다운로드 및 설치


앞서 이야기했듯이 설치는 C++로 진행할 예정이다. 바인딩 용 언어는 Java, C++, Python 등을 많이 사용하지만 그 원론에 다가가고자 C++를 이용해서 설치하고 실습해볼 예정이다. 처음 배울 때는 역시 라이브러리가 만들어진 언어 혹은 권장하는 언어가 좋다. 필자는 그냥 C++가 빨라보여서 C++를 사용하고자 한다.

 

선행조건으로 Visual Studio가 설치되어 있어야 한다. 설치는 

visualstudio.microsoft.com/ko/downloads/ 이곳에서 할 수 있다. [커뮤니티]로 설치하면 된다. 공짜다

기본 설치 옵션으로 당연히 C++를 사용할 것이므로 "C++를 사용한 데스크톱 개발"을 체크해줘야 한다. 어차피 체크 못했어도 나중에 추가할 수 있으므로 상관이 없다. 

 

새 프로젝트 만들기 선택

먼저, 프로젝트를 만들어주고, 

 

 

Window 데스크톱 마법사 -> 다음을 눌러준다.

 

 

 

적당한 프로젝트 이름을 만들어준 뒤에, 만들기 버튼을 클릭!

 

 

빈프로젝트 체크박스에 체크해주고 확인 버튼을 누르자.

 

소스파일에서 오른쪽 클릭!

 

 

 

그러면 이렇게 나오는데, 여기서 추가 -> 새 항목을 클릭

 

 

이렇게 C++ 파일을 눌러주고 추가를 누르면 완성!

여기서 이름을 잘 보면 cpp는 C++(씨플플)으로 만들어지며, 확장명이 .c로 끝나면 C언어로 구성된다.

 


opencv.org/releases/

 

Releases - OpenCV

Become a Member Stay up to date on OpenCV and Computer Vision news Join our Newsletter  

opencv.org

OpenCV공식 홈페이지로 들어가면 다양한 버전이 나온다. 안정화 버전은 버전 3.4.13, 최신 버전은 4.5.1이다.

여기서는 4.5.1을 통해 진행해보도록 하자.

 

 

자신에게 맞는 운영체제를 선택하면 되지만, 대부분이 Windows이므로 선택!

소스포지에서 기다리면 알아서 다운로드가 시작된다. 적당한 곳에 다운로드를 받자.

211MB의 크기를 가진다. 배포 서버에 따라 속도가 천차만별 이므로 일단은 기다리자. 다운로드 받은 뒤에는 나머지 창은 꺼도 좋다. 

파일명은 opencv-4.5.1-vc14_vc15.exe 이다.

 

 

실행하면 별거 없다. Extract누르자. 이건 단순히 압축해제를 시켜주는 것이다. C:\나 D:\에다가 해두면 된다.

 


자 이제 비주얼 스튜디오로 가자.

파일을 하나 만들고 (파일명은 main.cpp로 하자)

프로젝트란에 있는 속성을 누르자.

 

구성 : 모든 구성, 플랫폼 : x64로 하자 (기본 운영체제 구성이 64비트면 x64, 32비트면 win32를 선택하면 된다.)

그리고서 좌측에 있는 C/C++ 란에 일반을 클릭한 뒤

추가 포함 디렉터리에 D:\opencv\build\include를 입력한다.

만약에 다른 곳에 저장되어 있으면 저장된 위치에 있는 [ 저장된위치\opencv\build\include ]를 입력해주면 된다.

 

이번에는 링커 탭에 있는 일반으로 간다.

거기에도 마찬가지로 추가 라이브러리 디렉터리 란에

D:\opencv\build\x64\vc15\lib 를 입력해준다. 

 

링커탭에 입력란으로 눌러준다.

그러면 추가 종속성이 있는데, 여기에 opencv_world451d.lib;를 입력해준다. 세미콜론 ;을 꼭 넣어줘야 한다. 컴퓨터가 인식할 때는 세미콜론으로 구분하기 때문에 반드시 넣어주자!

 

여기에 넣는 문장은 설치한 파일명을 명확히 입력해야 한다.

필자는 4.5.1 버전을 설치했으므로 opencv_world451d.lib가 나온것이다. 

일반적으로 [ 설치한 폴더\opencv\build\x64\vc15\lib ]에서 확인할 수 있으므로 확인해보고 가자! 

 

마지막으로

 

x64로 되어 있는지, 디버그 모드인지 확인하자.

 

자 이제 프로젝트 명을 오른쪽 클릭하면 여러 속성이 나오는데, 여기에서 파일 탐색기에서 폴더 열기를 눌러준다.

 

그리고서,

D:\opencv\build\x64\vc15\bin여기에 들어가면

 

파일 두 개가 있다. 이것을 아까 열어둔 파일 탐색기에서 폴더 열기 를 한 곳에다가 복사! 하면 된다.

 

 

프로젝트 폴더 안에 같이 나란히 존재하면 된다. 아까 사용했던 lib 파일이 아니다. 

dll 확장자를 가진 파일이다. 유의하자. 컴파일러에게 파일과 파일을 연결해주는 역할을 해준다. (동적 링크라고 하며, 실행파일에서 라이브러리 기능을 사용 시에, 라이브러리를 참조해서 기능을 호출해주는 역할을 하는 것이다.)

 


이제 프로젝트 파일에다가 코딩 테스트를 할 png 파일을 가져다 두자.

cat.PNG
0.39MB

프로젝트 폴더는 일반적으로 C:\Users\<사용자명>\source\repos\Project_OpenCV_1\Project_OpenCV_1

에 들어있다. 못 찾겠으면 위에 올라가서 탐색기에서 열기를 다시 활용하자.

 

아까 만들어 놓은 main.cpp에다가 입력하자.

#include<opencv2/imgcodecs.hpp>
#include<opencv2/video.hpp>
#include<opencv2/highgui.hpp>

#include<iostream>
#include<stdio.h>

using namespace std;

int main(int arg, char** argu) {
	cv::Mat img = cv::imread("cat.png");

	imshow("img", img);
	cv::waitKey(0);

	return 0;
}

확인할 용도이므로 나중에 설명하도록 하자.

 

타이핑이 완료되었다면, 

디버깅 시작을 누르고 잠시 기다리면 프로그램이 시작된다.

 

귀여운 고양이가 나온다면 완료! 

정말 고생했다. 이로써 우리는 OpenCV를 사용하기 위한 기본 셋팅을 완료한 것이다.

 

다음 시간에는 OpenCV에서 사용되는 기본적인 함수를 사용하면서 하나하나 이야기해보도록 하자.

 

 

참고 자료

docs.opencv.org/master/index.html

반응형
반응형

node를 사용하다보면 나오는 npm과 npx 두 가지가 존재한다.

npm은 Node Package Manager의 약자이다. (노드 패키지 매니저)

npx 는 Node Package eXecute의 약자이다. 조금 더 정확하게는 [A tool for executing Node Packages]

npx의 경우 노드 패키지 실행이라는 의미이다.

 

말에서부터 알 수 있듯이 npm은 패지키 매니저를 담당하고 있으며

npx는 실행을 담당하고 있음을 알 수 있다. 

 

우리는 npm 버전 5.2.0 이상부터는 npx를 사용할 수 있다. npx는 npm 사용시에 발생하는 발생할 수 있는 여러 문제점을 해결하기 위해 설계되었으며, 사용법은 npm과 비슷하게 사용된다. (그래서 사용하기 편하다!)

 

 

npm 대신해서 npx를 사용하는 방법은 너무나도 간단하다. 

npm을 쓰는 것 처럼 npx를 사용하면 된다.

 

지난 몇 년 동안은 npm은 의존성 문제로부터 우리를 편하게 해주었다. 다양한 프로젝트 별 패키지를 package.json으로 관리함으로써 프로젝트마다 설치될 패키지를 한번에 설치할 수 있는 편안함을 제공되어졌다. 이는 사실 npm기반 프로젝트를 실행하려면 단순히 node와 npm이 설치되어 있는지 확인하고 gitrepo를 복제한 뒤에 npm install만 해주고 프로젝트가 잘 실행되는지 테스트하면 바로 끝인 것이다. (npm 스크립트가 경로를 자동으로 추가해주기 때문에 npm install 만으로도 모든 작업이 완료되는 것이다.)

 

이렇게 편리한 npm이지만 설치하는 공간이 항상 node_modules 에 설치되기 때문에 문제가 될 수 있다.

npm -g install

로 global로 설치하게 되면 항상 node_moduls를 찾아서 설치한다. 없으면 만들어서 설치하는 구조로 되어 있다.

그래서 우리가 원하는 곳에만 설치가 하기가 힘들다. (npm 스크립트가 알아서 지정해주기 때문에 대화식으로 설치할 수가 없다.) 

물론 수동으로 지정해서 경로 지정이 가능하지만 이는 일일이 타이핑해야 하므로 자동화를 업으로 삼는 프로그래머에게는 이상적인 해결책이 아니다.

alias npmx=PATH=$(npm bin):$PATH

혹은 

./node_modules/.bin/mocha

이러한 형태로 타이핑 해야하므로 옳지 못하다. 

 

그래서 npx는 이를 간단하게 해결해준다!

 

위와 같은 코드를 사용하려 할 때, 

npx mocha

를 사용하게 되면 동일한 결과를 얻을 수 있으며, 실행이 끝난 뒤에는 자동으로 fallback 시켜준다. (auto-fallback)

여기에 추가로 이미 설치된 바이너리를 불러올 경우, 실행 중인 노드 프로세스에 직접 로드할 수 있다. 이렇게 npx는 다양한 장점을 가지고 있다. 

 

Auto-fallback

 

그렇다면 우리는 위에서 이야기한 상황을 말고 추가로 npx를 사용해야 하는 상황을 알아보도록 하자.

 

1번만 실행되어야 하는 명령


which create-react-app은 create-react-app이 존재하는가를 묻는 명령어이다.

create-react-app을 사용거나 express-generator를 사용해야 하는 상황이라면 1번만 사용된 뒤에는 사용되지 않는다. 우리가 원하는 건 프레임워크가 한번에 한해 설정하는 것이지 지속적으로 이 파일이 남아있는 상황을 원치는 않는다. (필요한 것만 빼가자!)

npx 명령어를 사용하게 되면 $PATH에 관련 <command>가 없다면 npx <command>를 호출하게 되면 npm 레지스트리에서 해당 이름을 찾고서 자동으로 설치하고 호출한다. 호출이 끝나고 난 뒤 패키지는 fallback되어 사라진다. npm 설치로 인해 생기는 오염에 대해 걱정할 필요가 없다! 

 

위와 같은 1회성 설치는 항상 최신 패키지를 가져다 써야 하므로 매번 최신화된 버전으로 업데이트할 필요가 없다. (알아서 최신 버전을 1회용으로 가져와서 설치함으로!) 

npx는 이러한 기능만으로도 다양한 고민거리를 해결해준다. 

 

 

Node.js를 버전 별로 실행할 수 있다!


여기서 -p 옵션은 $PATH 를 추가하는 command이다.

npx로 설치된 node는 각각 버전이 다름을 확인할 수 있다. 그리고 로컬에 설치된 node는 8.1.2로 나머지 1회성 설치로 인해 기존의 로컬 버전은 전혀 오염되지 않았다. 이렇게 버전을 다양하게 사용함으로써 프로젝트 별로 버전을 다르게 적용할 수 있다.

 

gist 기반 스크립트를 공유하기 위해서


모든 유틸리티 스크립트를 gist.github.com을 사용해서 공유하는 것이 보편화되었다. npx를 활용하면 하나의 명령어를 통해 직접적인 호출을 할 수 있다. 

npx https://gist.github.com/zkat/4bc19503fe9e9309e2bfaa2c58074d32

를 입력해보면 위와 같은 화면을 볼 수 있다.

 

 

참조


 

blog.npmjs.org/post/162869356040/introducing-npx-an-npm-package-runner

 

npm Blog Archive: Introducing npx: an npm package runner

npm Blog (Archive); updates from the npm team are now published on the GitHub Blog and the GitHub Changelog

blog.npmjs.org

stackoverflow.com/questions/50605219/difference-between-npx-and-npm

 

Difference between npx and npm?

I have just started learning React, and Facebook helps in simplifying the initial setup by providing the following ready-made project. If I have to install the skeleton project I have to type npx

stackoverflow.com

 

반응형
반응형

이전 시간에는 

[중학영어]09강. 보어로 쓰이는 to부정사, 동명사, 동사원형, 분사

를 배웠었다. 

품사에서 명사를 꾸며주는 역할을 하는 것은 형용사이다. 그렇다면 형용사적 역할을 하고 있는 to부정사와 분사에 대해 살펴보도록 하자.

to부정사와 분사 외에도

  • 품사 자체가 형용사인 것
  • 관계사(관계대명사, 관계부사)
  • 전치사구( 전치사 + 명사 ) [전명구]

가 있다. 일단 이번에는 to부정사와, 분사(현재분사, 과거분사)에 대해 살펴보도록 한다.

 

명사를 꾸며준다는 의미는 명사를 화려하게 만들어주는 의미가 아니다. 이는 명사의 의미를 조금 더 명확하게 만들어준다는데 의의가 있다.

예를 들어, 

a dog  → 강아지

a big dog  → 큰 강아지

두 의미에서 큰 강아지는 강아지를 조금 더 자세히 설명해주고 있다.

그래서 수식의 의미를 시력이 안 좋은 사람이 안경을 쓰면서 점점 초점이 맞아가는 과정을 이미지화해서 받아들이면 좋겠다.

 


1. 명사를 꾸며주는 to부정사

명사를 꾸며주는 to부정사는 명사 뒤에 위치하며 '~하는 명사', '~할 명사'의 형태로 해석한다.

 

time to go  →  갈 시간

time to study  →  공부할 시간

 

이런 형태로 해석된다. 

 

I bought some books to help me study hard → 나는 내가 공부를 열심히 할 수 있도록 돕는 책을 샀다.

 

I bought some books to help me study hard

some books(책들은)는 나의 공부를 열심히 하게끔 도와주는(to help) 해주는 행위를 하는 것으로 해석되므로 some books가 to부정사의 의미상 주어가 된다.

 

※ 수식을 받는 명사가, to부정사가 나타내는 동작이나 행위를 하는 것으로 해석이 되어진다면, 이 수식을 받는 명사는 to부정사의 의미상 주어가 된다.

 


I'd like some books to study. → 공부할 책이 몇 권 있었으면 좋겠습니다. 

some books를 통해 to study를 할 것이므로, 즉 공부할 책이라는 행위의 대상이 되고 있으므로 some books가 의미상 목적어가 되는 것이다.

※ 수식을 받는 명사가 to부정사가 나타내는 행위의 대상이 되면, 명사는 to부정사의 의미상 목적어가 된다.

 


가끔 to부정사와 전치사가 조합된 형태가 나오기도 하는데 우리의 해석을 방해한다.

[명사 + to부정사 + 전치사]의 형태는 의미상 [ to를 제외한 to부정사 + 전치사 + 명사 ]의 형태로 이해하면 편하다.

예를 들어, 

The student need somebody to study with. 의 문장을 보자.

somebody to study with [명사 + to v + 전치사] 의 형태로 쓰여져 있다.

study with somebody [v + 전치사 + 명사] 로 생각하면서 해석하면 훨씬 자연스러워진다.

→ 최종 문장은 The student need (study with somebody) 처럼 생각하자는 의미이다.

'학생은 필요하다. 함께 공부할 누군가가' 로 해석된다.

 


2. 명사를 수식하는 분사

분사는 두 가지가 존재한다. 현재분사와 과거분사가 있다.

  • 같이 쓰이는 어구가 있을 때는 명사 앞에 쓴다.
  • 같이 쓰이는 어구가 없을 때는 명사 뒤에 쓴다.

v-ing (현재분사)

수식 받는 명사가 동작을 직접하는 능동의 의미를 갖거나, 지금 진행의 의미를 지닌다. 

보통 해석은 '~하는', '~하고 있는' 으로 해석된다.

The man studying in front of me at the cafe was smeared with blood

여기서 The man studying이므로 공부를 하고 있는 남자이다.

[The man studying in front of me at the cafe] [was] [smeared with blood]

→ 카페 안에서 내 앞에 앉아 있는 공부하는 남자는 피투성이였다.

 

I gave my mother a letter saying thanks after hers birthday.

a letter saying 이므로 a letter(편지)가 saying하는 것이다. 

그래서 뜻은 → 나는 어머니 생신 후에 감사하다나는 편지를 드렸다.

편지가 말을 한 것처럼 쓴 것이다. '감사하다는 의미를 지닌 편지' 의 의미를 갖고 있다.

 

과거분사(p.p)

과거분사는 수식 받는 명사가 동작을 받거나 (수동적 의미), 동작이 이미 끝난 상태(완료)의 의미를 지니고 있다.

해석은 '~된' , '~해진' , '~한 (상태)'으로 해석된다. → 구매된, 깨끗해진, 가격 당한 으로 쓰여진다.

 

The slapped person hurt his face.

The slapped person은 뺨을 맞은 사람이다. ~한 상태를 나타내고 있다.

→ 뺨을 맞은 사람은 얼굴을 다쳤다.

 

The electronics purchased cannot be exchanged. 

The electronics purchased이 구매되어진 전자제품이다.

→ 구매되어진 전자제품은 교환될 수 없습니다.

 

I can sleep well in the cleaned bedroom

→ 깨끗하게 치워진 bedroom이다. 

→ 깨끗하게 치워진 침실에서 나는 잘 잘 수 있었다.

 


감정을 나타내는 동사는 현재분사와 과거분사 형태로 쓰이게 되면 명사를 꾸며주는 형용사 역할을 한다.

  • 현재 분사의 경우 '~한 감정을 느끼게 만드는' 이라는 의미로 쓰인다. (능동)
  • 과거 분사의 경우 '~한 감정을 느끼는' 이라고 쓰인다. (수동)

감정을 나타내는 동사는 다음과 같다.

 

excite 신나다.

amaze 놀라게 하다

interest 흥미를 불러 일으키다

disappoint 실망시키다.

frighten 겁먹게 만들다.

등이 있으며 현재분사와 과거분사로 만들어서 사용된다.

 

현재분사 과거분사
exciting 신나는 excited 신난
amazing 놀라게 하는 amazed 놀란
interesting 흥미를 불러일으키는 interested 흥미 있어 하는
satisfying 만족하게 하는 satisfied 만족한

Amazed father fallen onto the floor

→ 놀란 아버지가 바닥에 쓰러졌다.  [놀란 감정을 느끼는 아버지이다]

 

The magic show I saw today was an amazing show.

→ 오늘 본 마술쇼는 놀라운 쇼였다. [이 쇼가 우리를 놀라운 감정을 느끼게 만든다.]

반응형

+ Recent posts