for Robot Artificial Inteligence

static_cast<>이란 무엇일까.

|

static_cast<>

static_cast<바꾸려고 하는="" 타입="">(대상); static_cast(expression)

특징 (논리적으로 변환 가능한 타입을 변환한다)

compile 타임에 형변환에 대한 타입 오류를 잡아줍니다.

실수와 정수, 열거형과 정수형, 실수와 실수 사이의 변환 등을 허용한다. arr -> point로 변경 가능합니다.

function -> function pointer로 변경 가능합니다.

포인터 타입을 다른것으로 변환 하는 것을 허용하지 않습니다. (compile error)

그러나, 상속 관계에 있는 포인터 끼리 변환이 가능합니다.

downcast (static_cast<자식클래스>(부모클래스))시에는 unsafe 하게 동작할 수 있습니다. (safe 하게 사용하려면 dynamic_cast사용)

바꾸려고 하는 타입(new_type)에는 void 타입이 올 수 있지만 계산 후 제거 합니다. (return 이 없다 -> discard expression)

일반 변수 타입

#include<iostream>
using namespace std;
int main(void){
    double d = 13.24;
    float f = 10.12f;

    double tmp_double;
    int tmp_int;
    float tmp_float;

    tmp_int = static_cast<int>(d);    //double -> int 로 형변환
    cout << "static_cast<int>(double) : " << tmp_int << endl;

    tmp_float = static_cast<float>(d); //double -> float 로 형변환
    cout << "static_cast<float>(double) : " << tmp_float << endl;

    tmp_double = static_cast<double>(f); //float -> double 로 형변환
    cout << "static_cast<double>(float) : " << tmp_double << endl;

    return 0;
}

포인터 타입

#include<iostream>
#include<cstdio>
using namespace std;
int main(void){
    //1. array->point//
    int arr[10] = {11,13,15,17,19,21,23,25,27,29};
    int * ptr;
    ptr = static_cast<int *>(arr);
    cout << "1. int array -> int * : ";
    for(int i=0; i<10; i++){
        cout <<  ptr[i] << " ";
    }
    printf("\n");

    //2. char * -> int *//
    char str[] = "BlockDMask";
    int * ptr2;
    //ptr2 = static_cast<int *>(str); //Compile error
    //cout << *ptr2 << endl;


    //3. int * -> char *//
    int tmp = 10;
    int * ptr3 = &tmp;
    //char * c = static_cast<char *>(ptr3); //Compile error
    //cout << "3. int* -> char* : " << *c << endl;

    return 0;
}

Comment  Read more

changing code history tracking 방법

|

만약 VSCODE를 쓰고 있다면 쉽게 이전에 작성되었던 코드를 볼 수 있다.

line history 기능을 추가를 하여서 언제 작성이 되었고 어떤 내용이 작성이 되었는지 쉽게 볼수있다.

추천!

Comment  Read more

STD::SET 특성 및 이용 이유

|

STD::SET 특성

std::set은 std::map과 상당히 비슷한 연관 컨테이너이다. 다른 점이 있다면 value 없이 key만으로 이뤄졌다는 것 정도이다. std::set은 노드 기반 컨테이너이며 균형 이진 트리로 구현 되므로 균형 이진 트리의 모든 특징을 갖는다. std::set은 std::map과 마찬가지로 중복된 key를 저장할 수 없으므로, 중복 저장하고 싶다면 std::multiset을 사용해야 한다. 동일 타입 집합이라는 점에서는 std::vector와 같지만 요소가 정렬된 위치에 삽입 된다는 점이 다르다.

STD::SET 특징

  • std::set은 std::map과 상당히 비슷하다. 차이점이라면 std::map과 다르게 value 없이 key만 저장한다는 것 정도다.
  • std::set의 key는 중복될 수 없다. 중복 저장해야 한다면 std::multiset을 사용한다.
  • 데이터 삽입과 동시에 정렬이 일어난다.
  • 정렬은 key를 기준으로 정렬되며 기본 정렬 기준은 less(오름차순) 정렬이다.
  • 검색 또한 key를 기준으로 검색(이분검색)한다.
  • 검색시 균형 이진 트리를 이용한 로그 시간 검색 복잡도를 보장한다.

STD::SET 사용하는 이유

  • 삽입과 동시에 정렬해야 할때
  • key가 있는지 없는지 알아야 할때
  • 많은 데이터를 보관해야 하고, 동시에 검색이 빨라야 할때
  • 많은 데이터가 중복 되어서는 안 되며 빠른 검색으로 존재 여부를 신속하게 알고 싶을때!

Comment  Read more

Yolov3 간단 메카니즘

|

yolov3 -> object detection

간단 설명

feature extractor : Resnet 101 and Darknetd 을 통해 이미지 claasification.

Data Set : coco Data set

메카니즘 :

이미지를 N그리드로 나누고,이에 Feature Extractor + 데이터 셋을 통해 그리그 안에 이미지를 classified함. 얻어진 classified 된 이미지 특징은 Achorbox로 각그리드에 2개의 바운더리 박스로 표현하고, Non-Maxium Suppression을 통해 작은 가중치를 가지고 있는 Box는 제거한다. 이를 통해 한 이미지에 객체들을 그리드 수에 초과되지 않는 물체들을 표현하게 된다.

자세한 이해는 워낙 유명한 알고리즘이라 인터넷에 검색을 하면 얻게 된다.

추가적으로

Achor boxes는 객체에 대한 바운더리 박스를 만드는데 많이 쓰인다.

Comment  Read more

Bag of word를 통한 loop closure

|

  1. 이미지에서 특징점들과 디스크립터를 얻게 되는데 얻어지는 디스크립터에 대해 word를 만듬(디스크립터 벡터의 성향을 통해 word를 만듬)
  2. 만들어진 word는 Bag of word에 담게 됨
  3. 이미지당 words(vocabulary)를 가지고 있음.
  4. unorder_map 함수를 통해 각 Bag of word에서의 word id를 가지고 있는 이미지 이름들을 저장을 함.
  5. 비교를 할 새로운 이미지가 있다고 할 때 vocabulary를 만들고 Bag of words에 word id에서 가장 많이 share하고 있는 이미지 이름을 불러옴
  6. bag들간에 비교를 통해 퍼센테이지가 일정 이상 만족을 하면, 이전에 보았던 씬으로 간주하고 loop closure시작
  7. loop closure은 Full Bundle Adjustment를 통해 카메라 포즈(각 카메라)에 보이는 landmark들을 투영하여서 error 최소화

Comment  Read more