공학왕이될거야

face tracking 아두이노 코드

전공/Opencv
#include <Servo.h>
Servo myservo1;
Servo myservo2;
int pos1 =90;
int pos2 =90;
void setup(){
Serial.begin(9600);
myservo1.attach(9);
myservo2.attach(10);
}
void loop(){
if(Serial.available());
{
int a=(int)Serial.read();
if(a=='1')
{
pos1 = pos1 - 1;
pos2 = pos2 + 1;
myservo1.write(pos1);
myservo2.write(pos2);
Serial.println(a);
delay(10);
}
else if(a=='4')
{
pos1 = pos1;
pos2 = pos2 + 1;
myservo1.write(pos1);
myservo2.write(pos2);
Serial.println(a);
delay(10);
}
else if(a=='7')
{
pos1 = pos1 + 1;
pos2 = pos2 + 1;
myservo1.write(pos1);
myservo2.write(pos2);
Serial.println(a);
delay(10);
}
else if(a=='2')
{
pos1 = pos1 - 1;
pos2 = pos2;
myservo1.write(pos1);
myservo2.write(pos2);
Serial.println(a);
delay(10);
}
else if(a=='5')
{
pos1 = pos1;
pos2 = pos2;
myservo1.write(pos1);
myservo2.write(pos2);
Serial.println(a);
delay(10);
}
else if(a=='8')
{
pos1 = pos1 + 1;
pos2 = pos2;
myservo1.write(pos1);
myservo2.write(pos2);
Serial.println(a);
delay(10);
}
else if(a=='3')
{
pos1 = pos1 - 1 ;
pos2 = pos2 - 0.8;
myservo1.write(pos1);
myservo2.write(pos2);
Serial.println(a);
delay(10);
}
else if(a=='6')
{
pos1 = pos1;
pos2 = pos2 - 0.8;
myservo1.write(pos1);
myservo2.write(pos2);
Serial.println(a);
delay(10);
}
else if(a=='9')
{
pos1 = pos1 + 1;
pos2 = pos2 - 0.8;
myservo1.write(pos1);
myservo2.write(pos2);
Serial.println(a);
delay(10);
}
}
}

'전공 > Opencv' 카테고리의 다른 글

face tracking C 코드  (3) 2019.10.31
Face-tracking Robot 졸업작품  (18) 2018.01.29
저장된 사진 띄우기  (0) 2017.07.24
ubuntu 16.04 opencv 3.2.0 설치  (2) 2017.07.21
노트북 카메라 연동 얼굴 인식  (0) 2017.07.14

face tracking C 코드

전공/Opencv
#include "C:/Users/user/Desktop/opencv/build/include/opencv2/objdetect.hpp"
#include "C:/Users/user/Desktop/opencv/build/include/opencv2/videoio.hpp"
#include "C:/Users/user/Desktop/opencv/build/include/opencv2/highgui.hpp"
#include "C:/Users/user/Desktop/opencv/build/include/opencv2/imgproc.hpp"
#include "C:/Users/user/Desktop/opencv/build/include/opencv2/video/video.hpp"
#include "C:/Users/user/Desktop/opencv/build/include/opencv2/core/core.hpp"
#include "C:/Users/user/Desktop/opencv/build/include/opencv2/highgui/highgui.hpp"
#include <vector>
#include <iostream>
#include <stdio.h>
#include <string>
#include "serialcomm.h"
#include "Windows.h"
using namespace std;
using namespace cv;
/* Function Headers */
//void detectAndDisplay(Mat frame);
/* Global variables */
String window_name = "Capture - Face detection";
CSerialComm serialComm; //SerialComm 객체 생성
char detectStatus = '0';
char temp = '0';
int i;
/* @function main */
int main(int argc, char *argv[])
{
 cv::namedWindow("video", 1);
 cv::VideoCapture cap(0);
 if (!cap.isOpened())
 {
  std::cerr << "Could not open camera" << std::endl;
  return 0;
 }
 char buffer;
 if (!serialComm.connect("COM3")) //COM25번의 포트를 오픈한다. 실패할 경우 -1을 반환한다.
 {
  cout << "connect faliled" << endl;
  return -1;
 }
 else
  cout << "connect successed" << endl;
 const char* windowName = "Fingertip detection";
 while (true)
 {
  bool frame_valid = true;
  cv::Mat frame;
  try {
   cap >> frame;
  }
  catch (cv::Exception& e) {
   std::cerr << "Exception occurred. Ignoring frame... " << e.err << std::endl; frame_valid = false;
  }
  if (frame_valid) {
   try { // convert captured frame to gray scale & equalize
    //컬러 공간 변환 BGR->YCrCb
    //cv::Mat hsv;
    cv::Mat YCrCb;
    cvtColor(frame, YCrCb, CV_BGR2YCrCb);
    //각 채널별로 분리
    std::vector<cv::Mat> planes;
    cv::split(YCrCb, planes);
    cv::Mat mask = (128 < planes[1]) & (planes[1] < 170) & (73 < planes[2]) & (planes[2] < 158);
    erode(mask, mask, cv::Mat(3, 3, CV_8U, cv::Scalar(1)), cv::Point(-1, -1), 2);
    double radius;
    cv::Mat dst;
    distanceTransform(mask, dst, CV_DIST_L2, 5);
    //거리 변환 행렬에서 값(거리)이 가장 큰 픽셀의 좌표와, 값을 얻어온다.
    int maxIdx[2];
    minMaxIdx(dst, NULL, &radius, NULL, maxIdx, mask);
    cv::Point center = cv::Point(maxIdx[1], maxIdx[0]);
    cout << "중심점 좌표:" << center << ", 반지름:" << radius << endl;
    //손바닥 중심점 그리기
    cv::circle(frame, center, 2, cv::Scalar(0, 255, 0), -1);
    //손바닥 영역 그리기
    //cv::circle(frame, center, (int)(radius + 0.5), cv::Scalar(255, 0, 0), 2);
    //cv::imshow("windowName2", frame);
    //cv::Mat threshold_output;
    if (temp == '0') {
     //cout << "detect!!" << endl;
     if ((center.x > 0) && (center.x < 240))
     {
      
      for (int i = 0; i < 100000000; i++)
      {
      }
      if ((center.y > 0) && (center.y < 190))
      {
       serialComm.sendCommand('1');
      }
      else if ((center.y > 190) && (center.y < 310))
      {
       serialComm.sendCommand('4');
      }
      else if ((center.y > 310) && (center.y < 500))
      {
       serialComm.sendCommand('7');
      }
      
     }
     if ((center.x > 240) && (center.x < 360))
     {
      for (int i = 0; i < 100000000; i++)
      {
      }
      if ((center.y > 0) && (center.y < 190))
      {
       serialComm.sendCommand('2');
      }
      else if ((center.y > 190) && (center.y < 310))
      {
       serialComm.sendCommand('5');
      }
      else if ((center.y > 310) && (center.y < 500))
      {
       serialComm.sendCommand('8');
      }
      
     }
     if ((center.x > 360) && (center.x < 600))
     {
      for (int i = 0; i < 100000000; i++)
      {
      }
 if ((center.y > 0) && (center.y < 190))
      {
       serialComm.sendCommand('3');
      }
      else if ((center.y > 190) && (center.y < 310))
      {
       serialComm.sendCommand('6');
      }
      else if ((center.y > 310) && (center.y < 500))
      {
       serialComm.sendCommand('9');
      }
      
     }
    }
    else {
     detectStatus = '0';
     if (temp == '1') {
      //cout << "Unknown" << endl;
      serialComm.sendCommand('0');
      temp = '0';
     }
    }
    std::vector<std::vector<cv::Point> > contours;
    std::vector<cv::Vec4i> hierarchy;
    cv::findContours(mask, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE, cv::Point(0, 0));
    size_t largestContour = 0;
    for (size_t i = 1; i < contours.size(); i++)
    {
     if (cv::contourArea(contours[i]) > cv::contourArea(contours[largestContour]))
      largestContour = i;
    }
    cv::drawContours(frame, contours, largestContour, cv::Scalar(0, 0, 255), 1);
    // Convex hull
    if (!contours.empty())
    {
     std::vector<std::vector<cv::Point> > hull(1);
     cv::convexHull(cv::Mat(contours[largestContour]), hull[0], false);
     cv::drawContours(frame, hull, 0, cv::Scalar(0, 255, 0), 3);
    }
    cv::imshow("humancamera", mask);
    cv::imshow(windowName, frame);
   }
   catch (cv::Exception& e)
   {
    std::cerr << "Exception occurred. Ignoring frame... " << e.err << std::endl;
   }
  }
  if (cv::waitKey(30) >= 0) break;
 }
 // VideoCapture automatically deallocate camera object 
 return 0;
}

졸업 시즌마다 코드 전문을 원하시는 분들이 계셔서 올려봅니다
팀원들과 공유했던 메일에 남아있던 코드이고 다시 돌려보진 않았어요
영상처리 오픈소스 서너 개를 짜깁이 해서 완성한 코드이기 때문에 사용된 함수들을 구글링하면 더 좋은 자료들 참고하실 수 있을 거예요
2017년 자료이니 그대로 배끼기보단 응용 시에 참고가 되길 바랍니다

'전공 > Opencv' 카테고리의 다른 글

face tracking 아두이노 코드  (1) 2019.11.07
Face-tracking Robot 졸업작품  (18) 2018.01.29
저장된 사진 띄우기  (0) 2017.07.24
ubuntu 16.04 opencv 3.2.0 설치  (2) 2017.07.21
노트북 카메라 연동 얼굴 인식  (0) 2017.07.14

Face-tracking Robot 졸업작품

전공/Opencv

졸업작품으로 아두이노와 웹캠을 활용한 얼굴추적로봇을 만들었어요.

 

MCU : Arduino UNO R3

Servo motor : MG996

Web Cam : Logitec

Interface : Visual Studio C++ 와 Arduino 시리얼통신 (Baud Rate 9600)

 

Hardware : 과학상자

 

 

 

 

 

영상처리는 OpenCV 3.1.0 버전을 사용하였고,

얼굴추적방식은 처음에는 Haar-Cascade 방식을 사용하였으나 좋은 사양의 컴퓨터를 사용하지 못하다보니까 버퍼링과 딜레이 문제가 발생해서 피부색인식 방식으로 수정하였어요.

 

1. 얼굴 후보영역(mask) 검출

2. 윤곽선 얻기

3. 얼굴영역 찾기

4. 얼굴 중심점 검출

 

 

이렇게 크게 4가지 순서로 진행됩니다.

 

그 후에 웹캠에서 얼굴이 인식되면 얼굴 중심점의 좌표에 따라 9개의 영역으로 분할하여 제어기로 전송합니다.

 

제어기에서는 9개의 영역마다 지정된 제어를 반복하여 얼굴 중심점이 화면의 중앙 영역인 5번 영역으로 들어오도록 합니다.

 

 

Visual Studio C++ 코드는 다음과 같습니다.

OpenCV Library 불러오기

Webcam 불러오기

ArduinoSerial 통신

피부색 mask 따기

mask contour 따기

ConvexHull 그리기

중심점 그리기

아두이노와 통신하는 제어기 알고리즘

 

Arduino 코드는 다음과 같습니다.

 

 

마지막으로 완성된 동영상입니다.

 

 

 

 

'전공 > Opencv' 카테고리의 다른 글

face tracking 아두이노 코드  (1) 2019.11.07
face tracking C 코드  (3) 2019.10.31
저장된 사진 띄우기  (0) 2017.07.24
ubuntu 16.04 opencv 3.2.0 설치  (2) 2017.07.21
노트북 카메라 연동 얼굴 인식  (0) 2017.07.14

서울대 반도체 공정 교육 2탄

전공/반도체

1탄에서는 가는방법과 가서 받는 물품 어떤 교육이 진행되었는지 봤다면

 

2탄에서는 교육을 받으며 느꼈던 생각이나 새로운 경험 위주로 포스팅 하겠습니다!

 

 

 

먼저 교육은 이론교육 후 실습교육으로 진행됩니다!

 

이론교육은 약 3시간 정도 진행됩니다. 각 파트마다 전반적인 내용 및 중요한 부분을 과외하듯 직접 하나하나 설명해주시기 때문에  저 처럼 반도체공정 수업을 듣지 않으신 분들도 유익한 수업이 될 거에요!!

 

 

먼저 반도체 교육은 이러한 CMOS를 만드는 과정의 수업을 진행합니다!!

 

 

 

 

 

CMOS를 만들기 위해서는 수업듣는 각각의 공정과정이 필수적이기 때문에  놓치지 않고 필기하며 수업을 따라갔습니다.

 

수업은 반도체공부를 5년이상 하신 석박사님들이 수업을 해주셔서 더욱 더 친근하게 수업을 들을 수 있었고 모르는 부분도 편하게 질문할 수 있었어요!

 

이번 공정교육을 듣기를 잘했다 생각한 부분은 지금 적을 Clean Room에서 각 공정에 진행과정을 볼 수 있었던 점 입니다!!

 

 

방진복을 입는 순서와 방법을 잘 알려주시고 인솔하에 클린룸에 들어가게 되는데요

 

방진복을 입은 모습입니다!!

 

포토공정이 진행되는 Yellow Room이 아니라면 휴대폰 사용이 가능해서 조교님의 허락을 구하고 사진을 찍어봤습니다.

 

실제로 대기업의 클린룸과는 다르겠지만 방진복을 입는과정과 에어샤워를 거쳐 HEPA Filter가 있는 클린룸으로 들어오기 까지 새로운 경험을 해볼 수 있었습니다!!

 

이곳이 에어샤워를 하는 장소입니다.

 

 

이곳은 클리룸 내부 통로입니다!! 분홍색 방진복을 입은 교육생들이 보이네요!!

 

 

조교님의 인솔하에 각 공정마다 웨이퍼가 어떤 과정을 거쳐 공정이 진행이 되는지 실시간으로 설명을 해주시기 때문에 더욱 더 이해가 잘 되었어요!!!

 

클린룸 내부 몇군데 더 보여드리겠습니다.

 

 

 

 

 

그러면 이제 실습간 조교님께서 다루었던 장비들에 대해서 보겠습니다!!

먼저 4 point probe 라는 장비입니다.

웨이퍼의 면저항을 통해 공정이 잘 이루어 졌는지 확인하는

 

 

 

다음은  ellipsometer 입니다!!

빛의 반사도를 측정해 잘 공정이 되었는지 확인하는 장비입니다

 

 

 

 

다음은 P-5000이라는 장비로 식각에 쓰이는 장비입니다!!!

이 장비로 식각을 할 때 플라즈마를 이용하기 때문에 잘 찍지는 못했지만 진공챔버를 확인하실 수 있습니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

다음은 이온주입기 입니다.

반도체 공학에서 배웠든 p-type 이냐 n-type이냐는 이 이온주입기에 주입가스로 결정나겠죠?????

 

 

 

 

 

 

 

 

 

 

 

 

이 장비는 광학현미경입니다!!

포토 공정을 할 때 빛에 민감해 옐로우룸에서 작업을 한다고 했는데 조명이 옐로우 주명인 것을 보니 아마도 포토공정하는 베이 안 어디인가 인 것 같습니다!!

 

 

 

 

 

 

 

이 장비는 alpha step 이라는 장비입니다!!

두께를 측정하는 장비로 약간의 진동에도 민감하여 테이블자체가 충격에 따라 움직이도록 만들어졌습니다

 

 

 

 

이 장비는 열처리 장비인 furnace 입니다!

굉장히 활용도가 높은 장비로 수평 furnace 와 수직 furnace가 있다고 하는데

지금 보시는 장비는 수평 furnace 입니다!

 

 

 

 

이 장비는 dry 식각을 하는 장비인데 플라즈마를 볼 수 있는 장비입니다!!

많이 옛날 장비라 직접 보실기회가 있을지 모르겠지만 수시로 플라즈마 기체가 다른색을 띄는 것을 확인 하실 수 있습니다.

 

 

 

 

이 장비는 wafer를 세척하는 세척배스인데 직접 세척을 해야해서 조금 위험한 것 같았어요.... 

 

 

 

 

 

 

 

 

 

 

 

이 장비는 세척된 웨이퍼를 회전을 이용해 물기를 제거하는 장비입니다!!

 

 

 

 

 

 

이 장비는 증착공정장비로 ALD 입니다 그나마 최신 장비라고 해요..하핳ㅎ 

 

 

 

 

 

 

 

 

매우 유익했던 교육기간이었습니다.

조교님들이 매우 친절하게 자세히 알려주시고 또 계속해서 궁금한점 있냐고 물어봐 주세요.

공정에 관심있으신분들은 직접 가서 공정과정도 눈으로 보시고 공부하시면서 궁금하셨던 것들도 물어보시면 좋을 것 같습니다,

 

 

 

 

끝으로 공학왕(블로그 주인)과 조교님들 고생많으셨어요

'전공 > 반도체' 카테고리의 다른 글

서울대 반도체 공정 교육 1탄  (0) 2018.01.08
Sp3 hybridization  (0) 2017.11.21
a-si:H / dangling bond  (0) 2017.11.21

서울대 반도체 공정 교육 1탄

전공/반도체

서울대 반도체 공정 교육에 다녀왔습니다!!

 

2017 . 11 . 06 ~  2017 . 11 . 09 4일간의 일정이었는데요

 

제가 포스팅을 너무 늦게 썼네요 ㅠ_ㅠ

 

 

그러면 지금 부터 시작 하겠습니다

 

 

먼저 교육을 받는 장소인 반도체 공동연수소 입구 사진입니다!!

 

혹시나 가시기 전 이 글을 읽으시는 분들을 위해 가는 방법 남겨드릴게요!!

 

 

 

 

 

먼저 입장하게 되면 참가인원인지 확인 후에 출입증과 책을 지급받게 됩니다!!

 

 

 

이 책입니다!! 교육회차마다 책 표지가 조금씩은 다른 것 같아요!! 하하 저희 회차는 보라색이네요!!

 

 

책을 펼쳐보면 첫 장에 일정에 관한 내용이 나와있습니다!!

저희는 E조였는데 금속 식각 이온 사진 CVD 산화 순으로 교육을 들었습니다.

 

 

 

아침 9시부터 저녁6시까지 정말 빡센 일정이 잡혀 있습니다......

 

하지만 힘듬 뒤에는 뭐든 보상이 있기 마련이죠.....

 

저와 공학왕(블로그 주인)은 반도체 공정 수업을 듣지 않은 상태로 가서

 

전반적인 공정 흐름과 개념을 머릿속에 넣어 무사히 집 까지 가져왔습니다....핳핳ㅎㅎ

 

마지막으로 공동연구소 안에 전시되어 있는 웨이버 소자들을 보여드리며 1탄을 마무리하겠습니다!!

 

 

 

 

 

 

 

 

 

아! 어떤 경험을 했는지는 구체적으로 2탄에서 적을게요!!

 

2탄에서 만나요~~

'전공 > 반도체' 카테고리의 다른 글

서울대 반도체 공정 교육 2탄  (0) 2018.01.08
Sp3 hybridization  (0) 2017.11.21
a-si:H / dangling bond  (0) 2017.11.21

Sp3 hybridization

전공/반도체

 

혼성화(hybridization)?

결합을 형성하기 위해 원래의 원자 궤도함수들 간에 일어나는 혼합이다.

 

 

 

 

[sp3 궤도함수와 원자궤도함수의 에너지준위 도표]

위의 에너지 준위 도표처럼 sp3 궤도함수는 p 궤도함수보다 에너지가 낮다. (더 안정하다)

따라서, 분자를 형성할 때에는 혼성화(Hybridization)를 통해서 더 안정한 궤도함수를 형성한다는 사실을 알 수 있다.

 

규소의 원자번호는 14

그래서 1s2 2s2 2p6 3s2 3p2 의 전자를 가지는데, 코어 일렉트론인 10개를 제외하면 3s2 3p2 4개의 원자가전가(valence electron)을 가지게 된다.

 

원자가전자 : 한 원자에 전자가 채워질 때 에너지 준위가 낮은 오비탈부터 차례로 채워 간다. 전자가 에너지 준위가 낮은 오비탈부터 차례로 채워져 있는 바닥 상태에서 가장 바깥 껍질에 있는 전자를 원자가전자라고 한다. 2, 3주기 원소에서 원자가전자 수가 1~2개인 원자들은 원자가전자를 잃고 양이온이 되려는 경향성을 갖는다. 이러한 경향성을 갖는 원소들을 금속이라고 한다. 또한 원자가전자 수가 6~7개인 원자들은 전자를 얻어 음이온이 되려는 경향성을 갖는다. 이러한 경향성을 갖는 원자들을 비금속이라고 한다. 원자가전자 수는 원자 번호의 증가에 따라 규칙적으로 변하며, 원자가전자 수가 같은 원소들의 화학적 성질은 비슷하다.

 

4개의 전자가 sp3 하이브리드 오비탈을 형성하는데 탄소와 아주 유사하다.

 

탄소 : 탄소가 가지는 s와 p 궤도함수는 혼성화를 통해서, 4개의 새로운 sp3 궤도함수를 만들게 된다. 이들 4개의 sp3 궤도함수는 정사면체 배열이 되도록 공간적으로 배향된다.

 

4개의 sp3 궤도함수는 수소의 s 궤도함수와 전자쌍을 공유하여 4개의 C-H 결합을 형성하고, 정사면체형의 구조를 갖는다.

 

원자가 분자를 이룰 때에는 '최저'의 에너지 상태에 도달하기 위해서 원자 궤도함수와는 다른 형태의 궤도함수를 사용하는 것은 당연하다고 볼 수 있다.

그래서 혼성화 모형은 분자 형성 시 개별 원자들은 최저 에너지가 되게끔 대응한다고 가정하고 있다.

2주기와 달리 3주기는 측면으로 하는 결합인  π결합을 하기가 어렵습니다. 원자의 크기가 커지면 원자간 거리가 멀어지면서 오비탈이 측면으로는 효과적으로 겹쳐지지 않습니다.

이 때문에 Si는 C에 비해 이중결합이나 삼중결합을 잘 형성하지 않습니다. 마찬가지 이유로 3주기 이상의 원소들도 이중결합이나 삼중결합은 잘 형성하지 않습니다.

 

Si 원자를 치환하여 결정 안으로 들어가는 혼입된 원자는 SI처럼 sp3-hybridization된다. 이때 Si보다 원자가전자가 하나 적은 13 원자가 혼입되면, 혼입된 원자의 sp3-hybridization 궤도 함수들 전자-비어 있는 궤도함수는 원자가-띠보다 위에 놓이게 된다.

 

화학자들은 이런 에너지 준위를 doping level이라고 부른다. doping level 원자가-띠보다 아주 조금 높은 에너지를 갖는다. 따라서 상온의 에너지만으로도 원자가-띠의 전자가 이들 혼입 준위로 들뜨게 된다.

 

전하 운반체가 (+) 전하를 갖는 정공이므로, 이런 유형의 반도체를 양의 값을 나타내는 positive 글자를 따서 p 반도체라고 부른다.

 

고유 반도체 Si 상온에서 Si 원자 하나 전자와 정공을 10^(-10)개씩 갖고 있다.

흔히 사용되는 doping 농도는 10^(-7)정도이고, 농도의 혼입제가 거의 농도에 해당하는 정공을 만들어내므로, Si 전도도가 100 정도 증가한다.

 

 

1개의 s orbital 3개의 p orbitals 함께 hybridize하여 4개의 동등한 orbitals 형상할 있다.

이렇게 형성되어 4면체의 모서리 쪽으로 향하고 있는 orbitals 1개의 s orbital 3개의 p orbitals 결합하여 생겼기 때문에 sp3 hybrids 한다.

 

이런 hybridization 개념은 탄소가 어떻게 4개의 동등한 결합을 형성하는지를 설명하지만, 그런 지는 설명이 되지 않는다.

이렇게 되는 이유는 hybrid orbital 모양에서 찾을 있다.

1개의 s orbital 3개의 p orbitals 합쳐질 결과물인 hybrid orbitals 핵을 중심으로 대칭이 아니다.

마치 오뚜기 모양처럼 쪽이 모양을 갖게 된다.

그렇게 함으로써 결합을 , 다른 orbitals 겹쳐지게 되는데 결과 sp3 hybrid orbitals 전의 s p orbitals 보다 강하게 결합할 있다.

결국, 자연상태의 s, p orbitals 보다 hybridize되어 변형된 모양으로 강한 결합을 있기 때문이다.

'전공 > 반도체' 카테고리의 다른 글

서울대 반도체 공정 교육 2탄  (0) 2018.01.08
서울대 반도체 공정 교육 1탄  (0) 2018.01.08
a-si:H / dangling bond  (0) 2017.11.21

a-si:H / dangling bond

전공/반도체

 

a-si:H (Hydrogenated Amorphous Silicon) = 수소화 비정질 실리콘

 

TV가 대형화가 됨에 따라 화소(Pixel) 수는 증가하는 반면, TFT에 할당되는 스캔 시간은 점점 짧아져 TFT의 전류 구동 능력이 중요해짐

전류 구동 능력 = TFT가 할당된 시간 안에 전류를 얼마나 흘리느냐

 

TFT의 빠른 속도가 요구되는 상황 -> TFT의 속도를 결정짓는 것은 Active layer를 구성하는 재료

Active layer = 전하 운반자(전자 or 정공)가 이동하는 길

 

 

Active layer의 재료가 무엇인지에 따라 전하 운반자의 이동도가 결정

이동도 증가 -> 전도도 증가 -> 전류를 더 많이 흘릴 수 있음 -> TFT의 속도 빨라짐

 

 

a-si:H : 댕글링 본드에 수소 원자를 결합시킨 실리콘

 

=> 댕글링 본드의 밀도를 낮추어 도핑으로 전도도를 향상시킬 수 있다.

 

 

댕글링 본드의 존재 : 에너지 밴드 내에 결함 준위 만듦 

 

이 결함 준위는 실리콘의 전도도를 향상시키기 위해서 3가나 5가의 불순물을 도핑 할 때,

도핑을 상쇄시키는 역할을 함

donor level이나 acceptor level이 형성되지 못하도록 하기 때문에 전도도의 향상을 기대할 수가 없음

 

a-si:H은 a-si보다 적은 수의 댕글링 본드를 갖음 => 에너지 밴드 내에 적은 수의 결함 준위를 갖는다는 것

 

Ex) a-si는 10^20cm-3 개 정도의 결함 준위를 갖기 때문에 10^18~10^19cm-3 개의 불순물을 도핑 하여도

donor level과 acceptor level을 형성할 수 없음

 

But a-si:H은 10^15cm-3개의 결함 준위를 갖기 때문에 10^18~10^19cm-3 개의 불순물을 도핑 하여

10^3~10^4cm-3만큼의 donor level과 acceptor level을 형성할 수 있음

 

즉, 가전자 제어가 가능하므로 실리콘의 전도도를 향상시킬 수 있다!

 

 

TFT의 a-si:H 박막은 빛에 민감하게 반응하여 다시 댕글링 본드를 형성시키기 때문에

초기 제작 후와 UV 광이 조사된 후에 물성 특성이 변할 수 있음

 

하지만, 대면적 증착이 잘되고

도핑이 된 상태에서 좋은 전도성을 가지며

다른 물질과 좋은 경계 성질을 유지할 수 있는

여러 장점들을 갖기 때문에

 

상용화된 Active layer 중 가장 많은 비율을 차지하고 있다.

'전공 > 반도체' 카테고리의 다른 글

서울대 반도체 공정 교육 2탄  (0) 2018.01.08
서울대 반도체 공정 교육 1탄  (0) 2018.01.08
Sp3 hybridization  (0) 2017.11.21

저장된 사진 띄우기

전공/Opencv

사진을 저장하는데 어느 디렉토리에 해야하는 지 몰라서 그냥 home에 저장해봤는데 그때도 잘 출력되더라고요

 

#include <opencv2/opencv.hpp>


int main(void)

{

cv::Mat img = cv::imread("Lena.jpg", CV_LOAD_IMAGE_COLOR);

cv::namedWindow("Image", cv::WINDOW_AUTOSIZE);

cv::imshow("Image", img);

cv::waitKey(0);


return 0;

}

 

이렇게 코딩을 합니다.

 

코드에서 보이는 것처럼 저장할 그림 파일은 Lena.jpg 라는 파일명을 가져야 합니다.

 

 

 

저 코드를 imgview.cpp로 새 도큐먼트를 만들어서 저장합니다.

 

$ g++ -o imgview imgview.cpp $(pkg-config --libs --cflags opencv)

 

터미널창에 위와 같이 빌드해주고

 

$ ./imgview

 

컴파일해줍니다.

 

 

 

 

'전공 > Opencv' 카테고리의 다른 글

face tracking C 코드  (3) 2019.10.31
Face-tracking Robot 졸업작품  (18) 2018.01.29
ubuntu 16.04 opencv 3.2.0 설치  (2) 2017.07.21
노트북 카메라 연동 얼굴 인식  (0) 2017.07.14
Opencv 설치하기 / 우분투  (0) 2017.07.11

웹캠 연결

전공/Linux - VMware

웹캠을 연결하는데 코드 내에서는 자꾸 오류가 나고

 

(python:24577): GStreamer-CRITICAL **: gst_element_make_from_uri: assertion 'gst_uri_is_valid (uri)' failed
GStreamer: Error opening bin: no source element for URI "/dev/video0"
Warning: unable to open video source: /dev/video0
Warning: unable to open video source: synth
Traceback (most recent call last):
File "/usr/local/share/OpenCV/samples/python/facedetect.py", line 52, in <module>
ret, img = cam.read()
AttributeError: 'NoneType' object has no attribute 'read'

 

이런 오류가 나는데 웹캠이 제대로 연결되어있는 것 같지 않아 제대로 연결을 해보았습니다.

 

우분투를 처음 켜면 저런 화면이 나옵니다.

 

제가 usb 연결을 2개 했는데 둘 다 연결할 수 없다는 말인 것 같아요

 

 

확인해주고 진입을 해서 다음과 같이 웹캠을 연결시켜줍니다.

 

player - removable devices - 웹캠 - connect

 

 

'전공 > Linux - VMware' 카테고리의 다른 글

파이썬 종료  (0) 2017.07.21
VMware Workstation 12 Player Ubuntu 16.04 vmware tools 설치  (0) 2017.07.20
우분투 설치하기  (0) 2017.07.05

ubuntu 16.04 opencv 3.2.0 설치

전공/Opencv

먼저

 

sudo apt-get install g++
sudo apt-get install cmake


 

OpenCV 2.4대 버전이 설치되어 있으면 새로 설치하는 OpenCV 3.2 버전이 제대로 동작하지 않기 때문에 제거해주어야 합니다.

 

 

 

아래처럼 보이면 OpenCV 2.4대 버전이 설치안되어 있는 상태입니다.

다음 단계로 넘어가도  됩니다.


webnautes@webnautes-note:~$ pkg-config --modversion opencv
Package opencv was not found in the pkg-config search path.
Perhaps you should add the directory containing `opencv.pc'
to the PKG_CONFIG_PATH environment variable
No package 'opencv' found

 

 

 

OpenCV 2.4대 버전이 설치되어 있는 경우에는 OpenCV  2.4 버전이 출력됩니다.

 

webnautes@webnautes-note:~$ pkg-config --modversion opencv
2.4.9.1

 

 

 

다음 명령으로 OpenCV 라이브러리 설정 파일을 포함해서 기존에 설치된 OpenCV 패키지를 삭제하고 진행해야 합니다.

 

$ sudo apt-get purge  libopencv* python-opencv
$ sudo apt-get autoremove

 

 

2. 기존 설치된 패키지 업그레이드

OpenCV 3.2를 설치해주기 전에 기존에 설치된 패키지들을 업그레이드 해주기 위한 작업입니다.

오래 걸리더라도 해주는 것이 좋습니다.

 

 

Ubuntu 저장소(repository)로부터 패키지 리스트를 업데이트합니다.

기존에 설치된 패키지들의 새로운 버전이 저장소에 있다면 리스트를 업데이트 하기위해 실행합니다.

 

$ sudo apt-get update

 

 

 

기존에 설치된 패키지의 새로운 버전이 있으면 업그레이드를 진행합니다.

 

$ sudo apt-get upgrade

 

 

 

3. OpenCV 컴파일 전 필요한 패키지 설치

 

OpenCV를 컴파일하는데 사용하는 것들이 포함된 패키지들을 설치합니다.

build-essential 패키지에는 C/C++ 컴파일러와 관련 라이브러리, make 같은 도구들이 포함되어 있습니다.

cmake는 컴파일 옵션이나 빌드된 라이브러리에 포함시킬 OpenCV 모듈 설정등을 위해 필요합니다.

 

$ sudo apt-get install build-essential cmake

 

 

 

pkg-config는 프로그램 컴파일 및 링크시 필요한 라이브러리에 대한 정보를 메타파일(확장자가 .pc 인 파일)로부터 가져오는데 사용됩니다.

터미널에서 특정 라이브러리를 사용한 소스코드를 컴파일시 필요한 컴파일러 및 링커 플래그를 추가하는데 도움이 됩니다.  

 

$ sudo apt-get install pkg-config

 



특정 포맷의 이미지 파일을 불러오거나 기록하기 위해 필요한 패키지들입니다.

 

$ sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev

 

 

 

특정 코덱의 비디오 파일을 읽어오거나 기록하기 위해 필요한 패키지들입니다.

 

$ sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev
$ sudo apt-get install libxvidcore-dev libx264-dev libxine2-dev

 

 

 

Video4Linux 패키지는 리눅스에서 실시간 비디오 캡처를 지원하기 위한 디바이스 드라이버와 API를 포함하고 있습니다.

 

$ sudo apt-get install libv4l-dev v4l-utils

 

 

 

GStreamer는 비디오 스트리밍을 위한 라이브러리입니다.

$ sudo apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev

 

 

 

OpenCV에서는 highgui 모듈을 사용하여 자체적으로 윈도우 생성하여 이미지나 비디오들을 보여줄 수 있습니다.

윈도우 생성 등의 GUI를 위해 gtk 또는 qt를 선택해서 사용가능합니다.  

여기서는 qt4를 지정해주었습니다. QImage와 Mat 간의 변환에는 영향을 주지 않습니다.

 

$ sudo apt-get install libqt4-dev

 

 

그외 선택 가능한 패키지는 다음과 같습니다.

libgtk2.0-dev
libgtk-3-dev

libqt5-dev

 

 

 

OpenGL 지원하기 위해 필요한 라이브러리입니다.

$ sudo apt-get install mesa-utils libgl1-mesa-dri libqt4-opengl-dev

 

 

 

OpenCV 최적화를 위해 사용되는 라이브러리들입니다.

$ sudo apt-get install libatlas-base-dev gfortran libeigen3-dev

 



python2.7-dev와 python3-dev 패키지는 OpenCV-Python 바인딩을 위해 필요한 패키지들입니다.

Numpy는 매트릭스 연산등을 빠르게 처리할 수 있어서 OpenCV에서 사용됩니다.

 

$ sudo apt-get install python2.7-dev python3-dev
$ sudo apt-get install python-numpy python3-numpy

 

 

4. OpenCV 설정과 컴파일 및 설치

 

소스 코드를 저장할 임시 디렉토리를 생성하여 이동 후.. 진행합니다.

 

webnautes@webnautes-note:~$ mkdir opencv
webnautes@webnautes-note:~$ cd opencv
webnautes@webnautes-note:~/opencv$

 

 

 

OpenCV 3.2.0 소스코드를 다운로드 받아 압축을 풀어줍니다.

$ wget -O opencv.zip https://github.com/Itseez/opencv/archive/3.2.0.zip
$ unzip opencv.zip

 

 

 

opencv_contrib(extra modules) 소스코드를 다운로드 받아 압축을 풀어줍니다.

SIFT, SURF 등을 사용하기 위해 필요합니다.

 

$ wget -O opencv_contrib.zip https://github.com/Itseez/opencv_contrib/archive/3.2.0.zip
$ unzip opencv_contrib.zip

 

 

 

다음처럼 두 개의 디렉토리가 생성됩니다.

 

webnautes@webnautes-note:~/opencv$ ls -d */
opencv-3.2.0/  opencv_contrib-3.2.0/

 

 

 

opencv-3.2.0 디렉토리로 이동하여 build 디렉토리를 생성하고 build 디렉토리로 이동합니다.

컴파일은 build 디렉토리에서 이루어집니다.

 

webnautes@webnautes-note:~/opencv$ cd opencv-3.2.0/
webnautes@webnautes-note:~/opencv/opencv-3.2.0$ mkdir build
webnautes@webnautes-note:~/opencv/opencv-3.2.0$ cd build
webnautes@webnautes-note:~/opencv/opencv-3.2.0/build$

 

 

 

cmake를 사용하여 OpenCV 컴파일 설정을 해줍니다.

 

$ cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D WITH_TBB=OFF \
-D WITH_IPP=OFF \
-D WITH_1394=OFF \
-D BUILD_WITH_DEBUG_INFO=OFF \
-D BUILD_DOCS=OFF \
-D INSTALL_C_EXAMPLES=ON \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D BUILD_EXAMPLES=OFF \
-D BUILD_TESTS=OFF \
-D BUILD_PERF_TESTS=OFF \
-D ENABLE_NEON=ON \
-D WITH_QT=ON \
-D WITH_OPENGL=ON \
-D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-3.2.0/modules \
-D WITH_V4L=ON  \
-D WITH_FFMPEG=ON \
-D WITH_XINE=ON \
-D BUILD_NEW_PYTHON_SUPPORT=ON \
../

 

 

 

다음과 같은 메시지가 보이면 정상적으로 된 것입니다.

 

-- Configuring done
-- Generating done
-- Build files have been written to: /home/webnautes/opencv/opencv-3.2.0/build

 

 

 

설정한 결과입니다.

 

-- General configuration for OpenCV 3.2.0 =====================================
--   Version control:               unknown
--
--   Extra modules:
--     Location (extra):            /home/webnautes/opencv/opencv_contrib-3.2.0/modules
--     Version control (extra):     unknown
--
--   Platform:
--     Timestamp:                   2017-06-09T14:35:28Z
--     Host:                        Linux 4.8.0-53-generic x86_64
--     CMake:                       3.5.1
--     CMake generator:             Unix Makefiles
--     CMake build tool:            /usr/bin/make
--     Configuration:               RELEASE
--
--   C/C++:
--     Built as dynamic libs?:      YES
--     C++ Compiler:                /usr/bin/c++  (ver 5.4.0)
--     C++ flags (Release):         -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wno-narrowing -Wno-delete-non-virtual-dtor -Wno-comment -fdiagnostics-show-option -Wno-long-long -pthread -fomit-frame-pointer -msse -msse2 -mno-avx -msse3 -mno-ssse3 -mno-sse4.1 -mno-sse4.2 -ffunction-sections -fvisibility=hidden -fvisibility-inlines-hidden -O3 -DNDEBUG  -DNDEBUG
--     C++ flags (Debug):           -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wno-narrowing -Wno-delete-non-virtual-dtor -Wno-comment -fdiagnostics-show-option -Wno-long-long -pthread -fomit-frame-pointer -msse -msse2 -mno-avx -msse3 -mno-ssse3 -mno-sse4.1 -mno-sse4.2 -ffunction-sections -fvisibility=hidden -fvisibility-inlines-hidden -g  -O0 -DDEBUG -D_DEBUG
--     C Compiler:                  /usr/bin/cc
--     C flags (Release):           -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wno-narrowing -Wno-comment -fdiagnostics-show-option -Wno-long-long -pthread -fomit-frame-pointer -msse -msse2 -mno-avx -msse3 -mno-ssse3 -mno-sse4.1 -mno-sse4.2 -ffunction-sections -fvisibility=hidden -O3 -DNDEBUG  -DNDEBUG
--     C flags (Debug):             -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wno-narrowing -Wno-comment -fdiagnostics-show-option -Wno-long-long -pthread -fomit-frame-pointer -msse -msse2 -mno-avx -msse3 -mno-ssse3 -mno-sse4.1 -mno-sse4.2 -ffunction-sections -fvisibility=hidden -g  -O0 -DDEBUG -D_DEBUG
--     Linker flags (Release):
--     Linker flags (Debug):
--     ccache:                      NO
--     Precompiled headers:         YES
--     Extra dependencies:          /usr/lib/x86_64-linux-gnu/libQtOpenGL.so /usr/lib/x86_64-linux-gnu/libQtGui.so /usr/lib/x86_64-linux-gnu/libQtTest.so /usr/lib/x86_64-linux-gnu/libQtCore.so /usr/lib/x86_64-linux-gnu/libpng.so /usr/lib/x86_64-linux-gnu/libz.so /usr/lib/x86_64-linux-gnu/libtiff.so /usr/lib/x86_64-linux-gnu/libjasper.so /usr/lib/x86_64-linux-gnu/libjpeg.so gstbase-1.0 gstreamer-1.0 gobject-2.0 glib-2.0 gstvideo-1.0 gstapp-1.0 gstriff-1.0 gstpbutils-1.0 xine avcodec-ffmpeg avformat-ffmpeg avutil-ffmpeg swscale-ffmpeg dl m pthread rt /usr/lib/x86_64-linux-gnu/libGLU.so /usr/lib/x86_64-linux-gnu/libGL.so
--     3rdparty dependencies:       libwebp IlmImf libprotobuf
--
--   OpenCV modules:
--     To be built:                 core flann imgproc ml photo reg surface_matching video dnn fuzzy imgcodecs shape videoio highgui objdetect plot superres xobjdetect xphoto bgsegm bioinspired dpm face features2d line_descriptor saliency text calib3d ccalib datasets rgbd stereo tracking videostab xfeatures2d ximgproc aruco optflow phase_unwrapping stitching structured_light python2 python3
--     Disabled:                    world contrib_world
--     Disabled by dependency:      -
--     Unavailable:                 cudaarithm cudabgsegm cudacodec cudafeatures2d cudafilters cudaimgproc cudalegacy cudaobjdetect cudaoptflow cudastereo cudawarping cudev java ts viz cnn_3dobj cvv freetype hdf matlab sfm
--
--   GUI:
--     QT 4.x:                      YES (ver 4.8.7 EDITION = OpenSource)
--     QT OpenGL support:           YES (/usr/lib/x86_64-linux-gnu/libQtOpenGL.so)
--     OpenGL support:              YES (/usr/lib/x86_64-linux-gnu/libGLU.so /usr/lib/x86_64-linux-gnu/libGL.so)
--     VTK support:                 NO
--
--   Media I/O:
--     ZLib:                        /usr/lib/x86_64-linux-gnu/libz.so (ver 1.2.8)
--     JPEG:                        /usr/lib/x86_64-linux-gnu/libjpeg.so (ver )
--     WEBP:                        build (ver 0.3.1)
--     PNG:                         /usr/lib/x86_64-linux-gnu/libpng.so (ver 1.2.54)
--     TIFF:                        /usr/lib/x86_64-linux-gnu/libtiff.so (ver 42 - 4.0.6)
--     JPEG 2000:                   /usr/lib/x86_64-linux-gnu/libjasper.so (ver 1.900.1)
--     OpenEXR:                     build (ver 1.7.1)
--     GDAL:                        NO
--     GDCM:                        NO
--
--   Video I/O:
--     DC1394 1.x:                  NO
--     DC1394 2.x:                  NO
--     FFMPEG:                      YES
--       avcodec:                   YES (ver 56.60.100)
--       avformat:                  YES (ver 56.40.101)
--       avutil:                    YES (ver 54.31.100)
--       swscale:                   YES (ver 3.1.101)
--       avresample:                NO
--     GStreamer:                   
--       base:                      YES (ver 1.8.3)
--       video:                     YES (ver 1.8.3)
--       app:                       YES (ver 1.8.3)
--       riff:                      YES (ver 1.8.3)
--       pbutils:                   YES (ver 1.8.3)
--     OpenNI:                      NO
--     OpenNI PrimeSensor Modules:  NO
--     OpenNI2:                     NO
--     PvAPI:                       NO
--     GigEVisionSDK:               NO
--     Aravis SDK:                  NO
--     UniCap:                      NO
--     UniCap ucil:                 NO
--     V4L/V4L2:                    NO/YES
--     XIMEA:                       NO
--     Xine:                        YES (ver 1.2.6)
--     gPhoto2:                     NO
--
--   Parallel framework:            pthreads
--
--   Other third-party libraries:
--     Use IPP:                     NO
--     Use IPP Async:               NO
--     Use VA:                      NO
--     Use Intel VA-API/OpenCL:     NO
--     Use Lapack:                  NO
--     Use Eigen:                   YES (ver 3.2.92)
--     Use Cuda:                    NO
--     Use OpenCL:                  YES
--     Use OpenVX:                  NO
--     Use custom HAL:              NO
--
--   OpenCL:                        <Dynamic loading of OpenCL library>
--     Include path:                /home/webnautes/opencv/opencv-3.2.0/3rdparty/include/opencl/1.2
--     Use AMDFFT:                  NO
--     Use AMDBLAS:                 NO
--
--   Python 2:
--     Interpreter:                 /usr/bin/python2.7 (ver 2.7.12)
--     Libraries:                   /usr/lib/x86_64-linux-gnu/libpython2.7.so (ver 2.7.12)
--     numpy:                       /usr/lib/python2.7/dist-packages/numpy/core/include (ver 1.11.0)
--     packages path:               lib/python2.7/dist-packages
--
--   Python 3:
--     Interpreter:                 /usr/bin/python3 (ver 3.5.2)
--     Libraries:                   /usr/lib/x86_64-linux-gnu/libpython3.5m.so (ver 3.5.2)
--     numpy:                       /usr/lib/python3/dist-packages/numpy/core/include (ver 1.11.0)
--     packages path:               lib/python3.5/dist-packages
--
--   Python (for build):            /usr/bin/python2.7
--
--   Java:
--     ant:                         NO
--     JNI:                         NO
--     Java wrappers:               NO
--     Java tests:                  NO
--
--   Matlab:                        Matlab not found or implicitly disabled
--
--   Tests and samples:
--     Tests:                       NO
--     Performance tests:           NO
--     C/C++ Examples:              NO
--
--   Install path:                  /usr/local
--
--   cvconfig.h is in:              /home/webnautes/opencv/opencv-3.2.0/build
-- -----------------------------------------------------------------
--
-- Configuring done
-- Generating done
-- Build files have been written to: /home/webnautes/opencv/opencv-3.2.0/build

 

 

 

Python 2 라이브러리 항목이 보이지 않는 경우에는   

다음 붉은색 줄처럼 해당 경로들을 직접 적어줘야 합니다.

 

$ cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D WITH_TBB=OFF \
-D WITH_IPP=OFF \
-D WITH_1394=OFF \
-D BUILD_WITH_DEBUG_INFO=OFF \
-D BUILD_DOCS=OFF \
-D INSTALL_C_EXAMPLES=ON \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D BUILD_EXAMPLES=OFF \
-D BUILD_TESTS=OFF \
-D BUILD_PERF_TESTS=OFF \
-D ENABLE_NEON=ON \
-D WITH_QT=ON \
-D WITH_OPENGL=ON \
-D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-3.2.0/modules \
-D WITH_V4L=ON  \
-D WITH_FFMPEG=ON \
-D WITH_XINE=ON \
-D BUILD_NEW_PYTHON_SUPPORT=ON \
-D PYTHON_INCLUDE_DIR=/usr/include/python2.7 \
-D PYTHON_INCLUDE_DIR2=/usr/include/x86_64-linux-gnu/python2.7 \
-D PYTHON_LIBRARY=/usr/lib/x86_64-linux-gnu/libpython2.7.so \
../

 

 

 

컴파일을 시작하기 전에 사용 중인 컴퓨터의 CPU 코어수를 확인합니다.

$ cat /proc/cpuinfo | grep processor | wc -l
4

 

 //저는 1이 나와서 -j1로 했어요

 

make 명령을 사용하여 컴파일을 시작합니다.

-j 다음에 위에서 확인한 숫자를 붙여서 실행해줍니다.

컴파일시 걸리는 시간을 확인하기 위해 명령 앞에 time을 붙여주어 실행했습니다.

webnautes@webnautes-note:~/opencv/opencv-3.2.0/build$ time make -j4

 

 

i5-7200U CPU에서 OpenCV 컴파일 완료까지 7분정도 걸렸습니다.

 



컴파일 결과물을 설치합니다.

webnautes@webnautes-note:~/opencv/opencv-3.2.0/build$ sudo make install

 

 

 

/etc/ld.so.conf.d/ 디렉토리에 /usr/local/lib를 포함하는 설정파일이 있는지 확인합니다.

 

webnautes@webnautes-note:~/opencv/opencv-3.2.0/build$ cat /etc/ld.so.conf.d/*
/usr/lib/x86_64-linux-gnu/libfakeroot
# libc default configuration
/usr/local/lib
# Multiarch support
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu/mesa-egl
/usr/lib/x86_64-linux-gnu/mesa
# Legacy biarch compatibility support
/lib32
/usr/lib32

 

 

 

/usr/local/lib이 출력되지 않았다면 다음 명령을 추가로 실행해야합니다.

 

webnautes@webnautes-note:~/opencv/opencv-3.2.0/build$ sudo echo '/usr/local/lib' > /etc/ld.so.conf.d/opencv.conf

 

 

/usr/local/lib을 찾은 경우나 못찾아서 추가한 작업을 한 경우 모두 컴파일시 opencv  라이브러리를 찾을 수 있도록 다음 명령을 실행합니다.

 

webnautes@webnautes-note:~/opencv/opencv-3.2.0/build$ sudo ldconfig

 



5. OpenCV 설치 결과 확인

5.1. C/C++

C/C++를 위해 OpenCV 라이브러리 사용가능 여부를 확인합니다.

문제 없으면 설치된 OpenCV 라이브러리의 버전이 출력됩니다.

 

webnautes@webnautes-note:~/opencv/opencv-3.2.0/build$ pkg-config --modversion opencv

3.2.0

 

 

 

아래처럼 opencv를 찾을 수 없다고 나오면  추가 작업이 필요합니다.

 

webnautes@webnautes-note:~/opencv/opencv-3.2.0/build$ pkg-config --modversion opencv
Package opencv was not found in the pkg-config search path.
Perhaps you should add the directory containing `opencv.pc'
to the PKG_CONFIG_PATH environment variable
No package 'opencv' found

 

 

 

pkg-config 명령이 /usr/local/lib/pkgconfig 경로에 있는 opencv.pc 파일을 찾을 수 있도록 해줘야 합니다.

 

$ sudo echo 'PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig' >> '/etc/bash.bashrc'
$ sudo echo 'export PKG_CONFIG_PATH' >> '/etc/bash.bashrc'
$ source ~/.bashrc

 

 

 

다시 확인했을 때,  OpenCV 버전이 출력되야 합니다.

 

webnautes@webnautes-note:~/opencv/opencv-3.2.0/build$ pkg-config --modversion opencv

3.2.0

 

 

 

pkg-config --libs --cflags opencv 명령을 실행했을 때 다음처럼 나오면 문제없이 설치가 완료된 것입니다.

 

 

 

 

/usr/local/share/OpenCV/samples/  경로에 OpenCV 예제코드들이 설치됩니다.

 

 

 

예제 코드를 하나 가져와서 컴파일 해보겠습니다.

 

$ cp /usr/local/share/OpenCV/samples/cpp/facedetect.cpp ./

 

 

 

컴파일 후, 실행시켜 봅니다.

 

$ g++ -o facedetect facedetect.cpp $(pkg-config --libs --cflags opencv)  

$ ./facedetect --cascade="/usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_alt.xml" --nested-cascade="/usr/local/share/OpenCV/haarcascades/haarcascade_eye_tree_eyeglasses.xml " --scale=1.3

 

 //저는 왜 안될까요...

 

다음처럼 검출시간이 표시되면서 카메라 영상에 얼굴이 검출된 결과를 얻을 수 있습니다.

 

webnautes@webnautes-note:~/opencv/opencv-3.2.0/build$ ./facedetect --cascade="/usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_alt.xml" --nested-cascade="/usr/local/share/OpenCV/haarcascades/haarcascade_eye_tree_eyeglasses.xml " --scale=1.3
Video capturing has been started ...
detection time = 61.4535 ms
init done
opengl support available
detection time = 51.8766 ms
detection time = 41.1699 ms
detection time = 46.1556 ms
detection time = 35.5041 ms

 

 

5.2. Python

python 2.x와 python 3x에서 opencv 라이브러리를 사용가능한지는 다음처럼 확인합니다.

각각 OpenCV 버전이 출력되어야 합니다.

webnautes@webnautes-note:~/opencv/opencv-3.2.0/build$ python
Python 2.7.12 (default, Nov 19 2016, 06:48:10)
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.__version__
'3.2.0'
>>>

 

 

webnautes@webnautes-note:~/opencv/opencv-3.2.0/build$ python3
Python 3.5.2 (default, Nov 17 2016, 17:05:23)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.__version__
'3.2.0'
>>>

 

 

 

예제 코드를 실행해봅니다.

 

$  python /usr/local/share/OpenCV/samples/python/facedetect.py --cascade "/usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_alt.xml" --nested-cascade "/usr/local/share/OpenCV/haarcascades/haarcascade_eye_tree_eyeglasses.xml" /dev/video0

 

 

다음처럼  터미널에 표시되면서 카메라 영상에 얼굴이 검출된 결과를 얻을 수 있습니다.

 

webnautes@webnautes-note:~/opencv/opencv-3.2.0/build$  python /usr/local/share/OpenCV/samples/python/facedetect.py --cascade "/usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_alt.xml" --nested-cascade "/usr/local/share/OpenCV/haarcascades/haarcascade_eye_tree_eyeglasses.xml" /dev/video0

face detection using haar cascades

USAGE:
   facedetect.py [--cascade <cascade_fn>] [--nested-cascade <cascade_fn>] [<video_source>]

init done
opengl support available

 

 

 

이제 필요 없어진 컴파일에 사용했던 opencv 소스코드 디렉토리를 삭제합니다.

 

webnautes@webnautes-note:~/opencv/opencv-3.2.0/build$ cd
webnautes@webnautes-note:~$ rm -rf opencv

 

//삭제했을때 전부 다 삭제되어서 opencv 가 깔린건 확인했는데 예제 파일들 때문에 다시 설치했어요.. 다른 방법이 있을 것 같긴 한데 뭐 암것도 모르니까 ㅠㅠ

'전공 > Opencv' 카테고리의 다른 글

Face-tracking Robot 졸업작품  (18) 2018.01.29
저장된 사진 띄우기  (0) 2017.07.24
노트북 카메라 연동 얼굴 인식  (0) 2017.07.14
Opencv 설치하기 / 우분투  (0) 2017.07.11
Opencv 설치하기  (1) 2017.07.07