공학왕이될거야

'ALL'에 해당되는 글 57건

  1. 피부색 인식
  2. 노트북 카메라 연동 얼굴 인식
  3. ARDrone 영상 받아오기
  4. Opencv 설치하기 / 우분투
  5. Opencv 설치하기 1
  6. 오버액션토끼 편지지 11
  7. 우분투 설치하기
  8. 칼만필터 - (3)
  9. 칼만필터 - (2)
  10. 칼만필터 - (1)

피부색 인식

전공/ARDrone2.0




#include "ardrone/ardrone.h"


#include <vector>

#include <iostream>


// --------------------------------------------------------------------------

// main(Number of arguments, Argument values)

// Description  : This is the entry point of the program.

// Return value : SUCCESS:0  ERROR:-1

// --------------------------------------------------------------------------

int main(int argc, char *argv[])

{

// AR.Drone class

ARDrone ardrone;


// Initialize

if (!ardrone.open()) {

std::cout << "Failed to initialize." << std::endl;

return -1;

}


// Battery

std::cout << "Battery = " << ardrone.getBatteryPercentage() << "[%]" << std::endl;


// Instructions

std::cout << "***************************************" << std::endl;

std::cout << "*       CV Drone sample program       *" << std::endl;

std::cout << "*           - How to play -           *" << std::endl;

std::cout << "***************************************" << std::endl;

std::cout << "*                                     *" << std::endl;

std::cout << "* - Controls -                        *" << std::endl;

std::cout << "*    'Space' -- Takeoff/Landing       *" << std::endl;

std::cout << "*    'Up'    -- Move forward          *" << std::endl;

std::cout << "*    'Down'  -- Move backward         *" << std::endl;

std::cout << "*    'Left'  -- Turn left             *" << std::endl;

std::cout << "*    'Right' -- Turn right            *" << std::endl;

std::cout << "*    'Q'     -- Move upward           *" << std::endl;

std::cout << "*    'A'     -- Move downward         *" << std::endl;

std::cout << "*                                     *" << std::endl;

std::cout << "* - Others -                          *" << std::endl;

std::cout << "*    'C'     -- Change camera         *" << std::endl;

std::cout << "*    'Esc'   -- Exit                  *" << std::endl;

std::cout << "*                                     *" << std::endl;

std::cout << "***************************************" << std::endl;


while (1) {

// Key input

int key = cv::waitKey(33);

if (key == 0x1b) break;


// Get an image

cv::Mat image = ardrone.getImage();


cv::Mat frame = image.clone();


//방법1.

//반복문으로 각 화소 모두 비교하는 방법


//컬러 공간 변환 BGR->YCrCb

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);



// Take off / Landing 

if (key == ' ') {

if (ardrone.onGround()) ardrone.takeoff();

else                    ardrone.landing();

}


// Move

double vx = 0.0, vy = 0.0, vz = 0.0, vr = 0.0;

if (key == 'i' || key == CV_VK_UP)    vx = 1.0;

if (key == 'k' || key == CV_VK_DOWN)  vx = -1.0;

if (key == 'u' || key == CV_VK_LEFT)  vr = 1.0;

if (key == 'o' || key == CV_VK_RIGHT) vr = -1.0;

if (key == 'j') vy = 1.0;

if (key == 'l') vy = -1.0;

if (key == 'q') vz = 1.0;

if (key == 'a') vz = -1.0;

ardrone.move3D(vx, vy, vz, vr);


// Change camera

static int mode = 0;

if (key == 'c') ardrone.setCamera(++mode % 4);


// Display the image

cv::imshow("camera", image);

cv::imshow("humancamera", mask);

}


// See you

ardrone.close();


return 0;

}

'전공 > ARDrone2.0' 카테고리의 다른 글

얼굴 중심점 찾기  (0) 2017.07.19
ARDrone 영상 받아오기  (0) 2017.07.12

노트북 카메라 연동 얼굴 인식

전공/Opencv



#include <iostream>

#include <opencv2/opencv.hpp>


#include <stdlib.h>

#include <stdio.h>


using namespace std;

using namespace cv;



/* @ function main */

int main(int argc, char *argv[])

{


   // open the default camera

   cv::VideoCapture cap(0);


   // check if we succeeded

   if (!cap.isOpened()) {

      std::cerr << "Could not open camera" << std::endl;

      return -1;

   }


   // create a window

   cv::namedWindow("webcam", 1);


   // face detection configuration

   cv::CascadeClassifier face_classifier;


   face_classifier.load("C:/opencv/sources/data/haarcascades/haarcascade_frontalface_alt.xml");


   cv::Mat frame;


   while(1) {

      bool frame_valid = true;


      try {


         // get a new frame from webcam

         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

            cv::Mat grayframe;

            cv::cvtColor(frame, grayframe, CV_BGR2GRAY);

            cv::equalizeHist(grayframe, grayframe);


            // -------------------------------------------------------------

            // face detection routine


            // a vector array to store the face found

            std::vector<cv::Rect> faces;


            face_classifier.detectMultiScale(grayframe, faces,

               1.1, // increase search scale by 10% each pass

               3,   // merge groups of three detections

               CV_HAAR_FIND_BIGGEST_OBJECT | CV_HAAR_SCALE_IMAGE,

               cv::Size(30, 30)

            );


            // -------------------------------------------------------------

            // draw the results

            for (int i = 0; i < faces.size(); i++) {

               cv::Point lb(faces[i].x + faces[i].width, faces[i].y + faces[i].height);

               cv::Point tr(faces[i].x, faces[i].y);


               cv::rectangle(frame, lb, tr, cv::Scalar(0, 255, 0), 3, 4, 0);

            }


            // print the output

            cv::imshow("webcam", frame);


         }

         catch (cv::Exception& e) {

            std::cerr << "Exception occurred. Ignoring frame... " << e.err << std::endl;

         }

      }


      if (cv::waitKey(30) == 10) break;

   }


   // VideoCapture automatically deallocate camera object

   return 0;


}



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

Face-tracking Robot 졸업작품  (18) 2018.01.29
저장된 사진 띄우기  (0) 2017.07.24
ubuntu 16.04 opencv 3.2.0 설치  (2) 2017.07.21
Opencv 설치하기 / 우분투  (0) 2017.07.11
Opencv 설치하기  (1) 2017.07.07

ARDrone 영상 받아오기

전공/ARDrone2.0

드론 카메라의 영상을 받아오는 데 있어서 많은 시도를 해보았습니다.

1. Linux 기반의 Python 코드 이용

2. Linux 기반의 SDK 응용

3. Windows 기반의 C++ 코드 이용

4. Windows 기반의 자바스크립트 이용

2일 동안 여러 가지 시도를 해보았고 3. Windows 기반의 C++ 코드로 영상을 받아오는 데 성공하였습니다.

 

https://github.com/puku0x/cvdrone

 

위 사이트에서 Clone or download를 클릭해서 Download ZIP을 해줍니다.

 

 다운로드한 ZIP 파일을 압축 해제해서 /build/vs20xx/test.sln(솔루션파일) 을 열어줍니다.

 

vs20xx는 PC의 비주얼 버전을 말합니다. 저는 2013을 사용하였습니다.

 

F7 키로 build를 해주고, F5키로 컴파일을 해주면 드론의 영상을 받아올 수 있습니다.

 

 

드론 제어 또한 가능한 코드입니다.

 

'전공 > ARDrone2.0' 카테고리의 다른 글

얼굴 중심점 찾기  (0) 2017.07.19
피부색 인식  (0) 2017.07.14

Opencv 설치하기 / 우분투

전공/Opencv

OpenCV 설치


일단 기본 라이브러리 설치


$ sudo apt-get update


$ sudo apt-get install libopencv-dev build-essential checkinstall cmake pkg-config yasm libtiff4-dev libjpeg-dev libjasper-dev libavcodec-dev libavformat-dev libswscale-dev libdc1394-22-dev libxine-dev libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev libv4l-dev python-dev python-numpy libtbb-dev libqt4-dev libgtk2.0-dev libfaac-dev libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev libvorbis-dev libxvidcore-dev x264 v4l-utils ffmpeg 


ffmpeg이 설치가 안되면 


$ sudo add-apt-repository ppa:mc3man/trusty-media

$ sudo apt-get update

$ sudo apt-get dist-upgrade

$ sudo apt-get install ffmpeg


차례대로 해준다.


지금은 3.1 까지 나와있지만

나는 2.x 대로 작업하기 때문에 2.4.13 을 설치한다.


git으로 다운받으면 항상 최신버전이기 때문에 나는 직접 다운을 받는다. 


git clone 다운 시

$ git clone https://github.com/Itseez/opencv/



https://github.com/Itseez/opencv/archive/2.4.13.zip


링크로 다운받을 수 있다.


다운받으면 보통은 ~/Downloads 에 저장된다.


$ cd ~/Downloads

$ unzip opencv-2.4.13.zip 


cmake 가 없는 경우

$ sudo apt-get install cmake


$ cd opencv-2.4.13

$ mkdir release

$ cd release

$ cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_TBB=ON -D BUILD_NEW_PYTHON_SUPPORT=ON -D WITH_V4L=ON -D INSTALL_C_EXAMPLES=ON -D INSTALL_PYTHON_EXAMPLES=ON -D BUILD_EXAMPLES=ON -D WITH_QT=ON -D WITH_OPENGL=ON -D ENABLE_FAST_MATH=1 -D CUDA_FAST_MATH=1 -D WITH_CUBLAS=1  -DBUILD_TIFF=ON ..


를 한다.

QT가 없는 경우 QT옵션은 뺀다. (WITH_QT=ON 제외)

//저는 여기서 계속 에러가 났는데 버전 에러인 것 같기도 하고, 옵션 에러인 것 같기도 하고..

이것 저것 해보면서 성공했기때문에

뭐 때문에 에러가 풀렸는지는 잘 모르겠습니다 ㅠㅠ

1. qmake 에러가 발생해서 sudo apt-get install qt4-qmake 이렇게 해결해주었습니다.
2. sudo apt-get install qt5-default
이렇게 qt를 설치해주었는데 이때 오히려 에러가 더 많이 발생하였습니다.

3. release 폴더에 있는 CMakeCache.txt 를 삭제해주고 qt가 없는 옵션으로 다시 설치해주었습니다.
//

$ make

-j 옵션을 써서 속도를 향상시킬 수 있다.


make에 사용될 코어의 수이다.


ex) make -j4 => cpu 코어 4개 사용

ex) make -j8 => cpu 코어 8개 사용


저는 -j8을 해주었습니다. 시간이 꽤 오래 걸려요


// pkg-config --modversion opencv opencv 버전 확인하기//

$ sudo make install


anaconda를 사용하는 경우

$ cd ~/anaconda/lib/python2.7/site-packages/

$ ln -s /usr/local/lib/python2.7/site-packages/cv2.so cv2.so


를 추가로 해준다.



출처: http://hanmaruj.tistory.com/13 [하늘마루 이야기]

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

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
Opencv 설치하기  (1) 2017.07.07

Opencv 설치하기

전공/Opencv

opencv 설치하기에 앞서 visual studio는 2013버전으로 설치해주었습니다.

 

C에서와 마찬가지로 프로젝트를 실행시켜주는데 .c가 아닌 원래의 .cpp로 프로젝트를 열어줍니다.

 

 

 

C에서 하듯이 source에 new item을 추가해주고, 프로젝트의 property를 열어줍니다.

 

 

C/C++ - General - Additional Included Directories에 opencv 폴더들을 추가해줍니다.

 

(opencv 파일이 필요하신 분은 댓글 남겨주세요)

 

 

Linker - General - Additional Library Directories 에 opencv 폴더의 x64 - lib를 추가해줍니다.

 

 

Linker - Input - Additional Dependencies에 필요한 opencv library들을 추가해줍니다.

 

 

debug를 해줍니다.

 

(코드가 필요하신 분은 댓글 남겨주세요)

 

 

dll 에러가 발생합니다.

 

 

Visual Studio 2013 - Projects - (프로젝트 명) 의 Source 파일이 있는 폴더에 opencv의 dll 파일들을 추가해줍니다.

 

다시 debug를 해주면 노트북의 영상을 따올 수 있습니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

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
Opencv 설치하기 / 우분투  (0) 2017.07.11

오버액션토끼 편지지

카테고리 없음

 

일본에 있는 친구한테 편지를 쓰기 위해 오버액션토끼 이미지를 넣어서 편지지를 만들어봤어요 ㅋㅋㅋ

 

줄간격도 너무 크고 토끼들도 점잖지만 귀여워 ㅠㅠ

 

오버액션토끼편지지.pdf

 

우분투 설치하기

전공/Linux - VMware

 

먼저 윈도우 상에 우분투를 설치하기 위해 필요한 파일들 입니다.

같이 팀블로그를 운영하는 지훈님이 올려주실 거예요.ㅋㅋㅋ

vmware workstation 12 player를 실행시켜서 다음과 같이 다운로드 해줍니다.

 

 

이렇게 하고나면 vmware workstation이 생성됩니다.

실행을 시켜주면 다음과 같은 화면이 뜹니다.

 

 

처음 실행시키시면 Home만 있고 우분투가 없을텐데요.

이때 create a new virtual machine을 클릭한 뒤 다음과 같이 진행해줍니다.

 

 

2~3분뒤에 설치가 완료됩니다!

 

비밀번호를 치고 들어가면 아직 터미널창이 없는데요.

제일 위에 아이콘을 눌러서 terminal을 검색해줍니다.

 

 

그리고 Terminal 아이콘을 끌어다 왼쪽 탭에 고정시키면 됩니다.

 

 

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

웹캠 연결  (0) 2017.07.24
파이썬 종료  (0) 2017.07.21
VMware Workstation 12 Player Ubuntu 16.04 vmware tools 설치  (0) 2017.07.20

칼만필터 - (3)

전공/Arduino

저주파 통과 필터를 적용하게 되면 이전의 데이터 평균 값에 비해

최근의 데이터에 더 높은 가중치를 둘 수 있습니다.

 

const int ECHO=9;
const int TRIG=10;

#define SIZE 50

int buffer[SIZE];

float duration, Cm;
float sum;
float distance;
float preDistance;
float Cm1, duration1;
float alpha=0.7;

void setup() {
  Serial.begin(9600);
  Serial.flush();
  pinMode(TRIG,OUTPUT);
  pinMode(ECHO,INPUT);
  digitalWrite(TRIG,LOW);

  Cm=duration/(29.1*2);
  sum=0;

  for(int i=0; i<=SIZE-1; i++)
  {
    digitalWrite(TRIG,HIGH);
    delayMicroseconds(10);
    digitalWrite(TRIG,LOW);
    duration=pulseIn(ECHO,HIGH);
    buffer[i]=Cm;
    if(Cm>400) Cm=400;
    else if(Cm<2) Cm=2;
    sum+=buffer[i];
  }
  preDistance=sum/SIZE;
}

void loop() {
  digitalWrite(TRIG,HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG,LOW);
  duration1=pulseIn(ECHO,HIGH);
  Cm1=duration1/58.8;

  distance=alpha*preDistance+(1-alpha)*Cm1;

  if(distance>400) distance=400;
  else if(distance<2) distance=2;

  Serial.println((int)distance);
  delay(5);

  preDistance=distance;
}

 

업로드 한 후 결과를 살펴보면 중간에 생기던 잡음이 제거되며 또한 물체와 센서 사이의 거리가 갑자기 바뀌더라도 정확하게 측정될 것입니다.

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

칼만필터 - (2)  (0) 2017.07.04
칼만필터 - (1)  (0) 2017.07.04

칼만필터 - (2)

전공/Arduino

'칼만필터의 이해'라는 책에서 제시하고 있는 '이동평균 필터'의 개념과 Matlab 코드를 응용하여 아두이노 방식으로 적용해보았습니다.

 

이동평균 필터는 일정한 갯수의 데이터를 모아서 평균을 낸 값을 출력하는 방식입니다.

 

const int ECHO=9;
const int TRIG=10;

#define SIZE 50

int buffer[SIZE];
int Cm1, duration1;

long duration, Cm;

float sum;
float distance;

void setup() {
  Serial.begin(9600);
  Serial.flush();
  pinMode(TRIG,OUTPUT);
  pinMode(ECHO,INPUT);
  digitalWrite(TRIG,LOW);

  Cm=duration/(29.1*2);
  sum=0;

  for(int i=0; i<=SIZE-1; i++)
  {
    digitalWrite(TRIG,HIGH);
    delayMicroseconds(10);
    digitalWrite(TRIG,LOW);
    duration=pulseIn(ECHO,HIGH);
    buffer[i]=Cm;
    if(Cm>400) Cm=400;
    else if(Cm<2) Cm=2;
    sum+=buffer[i];
  }
}

void loop() {
  digitalWrite(TRIG,HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG,LOW);
  duration1=pulseIn(ECHO,HIGH);
  Cm1=duration1/58.8;
  sum-=buffer[0];

  for(int i=0; i<SIZE-1; i++)
  {
    buffer[i]=buffer[i+1];
  }

  buffer[SIZE-1]=Cm1;
  sum+=buffer[SIZE-1];
  distance=sum/SIZE;

  if(distance>400) distance=400;
  else if(distance<2) distance=2;

  Serial.println((int)distance);
  delay(10);
}

 

위 코드의 setup 부분에서 배열을 채워놓고 loop로 들어가는 이유는 배열을 모두 0으로 채워놓고 시작하게 되면 초기에 오차가 크게 나타나는 현상을 피할 수 있기 때문입니다.

이동평균 필터는 배열에 저장되는 모든 데이터를 동일한 가중치를 놓고 평균을 구하기 때문에 최근 값이랑 이전 값이 차이가 나더라도 출력되는 값에서 이를 민첩하게 반영하지 못합니다. 따라서 이동평균필터는 데이터 간의 변화가 클 때에는 사용하기에 적합하지 않습니다.


이러한 이동평균 필터의 한계를 극복하기 위해서 '칼만필터의 이해' 라는 책에서는
저주파 통과 필터를 제시합니다.

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

칼만필터 - (3)  (0) 2017.07.04
칼만필터 - (1)  (0) 2017.07.04

칼만필터 - (1)

전공/Arduino

아두이노를 이용해서 가장 손쉽게 사용해볼 수 있는 센서는 초음파센서(HC-SR04)라고 생각합니다.

 

이 센서는 초음파를 보내고 받을 때 까지의 시간을 측정합니다.

따라서 이 센서의 기본적인 반환값은 측정물체에 의해 반사된 초음파가 다시 센서까지 도달하는데 걸리는 시간이라고 할 수 있습니다.

 

​그러므로 초음파 센서를 사용하여 물체까지 거리를 구하기 위해서는 반환값을 적절히 변형해야 합니다.

 

 

데이터 시트에서 제시한 초음파의 속도는 340m/s이므로 1cm이동하는데 대략 29.4microsec가 걸린다는 것을 알 수 있습니다.

 

그러므로 초음파센서의 기본 반환 값에  2cm이동​하는데 걸리는 시간을 나누어 주면(duration/(29.4*2)) 원하는 cm단위의 물체간의 거리를 구할 수 있다.
 

그렇다면 기본적인 반환값은 아두이노의 pulseIn이라는 함수를 사용할 수 있습니다.

 

이대로 인터넷에서 쉽게 구할 수 있는 예제를 돌려서 시리얼창으로 값을 확인해보면 갑자기 값이 변할 때 튀는 값이 발생하게 됩니다.

 

그런 값들을 없애주기 위하여 여러 필터들을 사용할 수 있습니다.

 

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

칼만필터 - (3)  (0) 2017.07.04
칼만필터 - (2)  (0) 2017.07.04