article search result of '전체' : 363

  1. 2017.07.11 [메모][ANDROID] jar 를 만들기 위한 Gradle
  2. 2017.02.24 비연결형 소켓 OF (C++) 편
  3. 2017.02.24 Generic Singleton Base Class
  4. 2017.01.31 비연결형 UDP 소켓
  5. 2017.01.30 보다 심플한 C# 싱글턴 만들기
  6. 2017.01.30 개발을 해도 될 자
  7. 2016.11.19 상속된 Generic 타입 만들기, 타입의 제약 사항 선언 ( Generics Constraint )
  8. 2016.09.26 First look of [MS Hololens]
  9. 2016.09.01 중국어 , 한국어 완벽지원 addon , ofxFontStash
  10. 2016.08.27 Visual Studio 2015 에서 Icon 바꾸기
  11. 2016.08.27 WebClient 를 이용한 GET 과 POST 전송하기.
  12. 2016.08.19 sort 사용하기
  13. 2016.08.10 Cmd 명령으로 프로그램 실행 하기
  14. 2016.07.31 libVLC 를 이용한 캡처장치 수신
  15. 2016.07.29 보다 높은 퍼포먼스를 위한 LIBVLC 사용
  16. 2016.07.10 Poco 를 이용한 날짜 계산
  17. 2016.07.09 [of] LIB VLC 사용하기
  18. 2016.06.18 Blur쉐이더 , Desktop 용
  19. 2016.06.18 Desktop 과 IOS(openGLES2.0) 의 쉐이더 텍스처 기본 시작 코드
  20. 2016.04.16 [IOS] 아이폰의 카메라 기능을 모두 사용 하기
  21. 2016.04.14 CLM Framework with (TBB) on openFrameworks
  22. 2016.04.11 간단한 다각형의 HitTest
  23. 2016.04.06 [초간단] OF윈도우 리사이즈 막기
  24. 2016.04.02 OF로 만든 VR 비디오 뷰어.
  25. 2016.03.27 _memcpy(...) with start Index.
  26. 2016.03.27 char 와 unsigned char
  27. 2016.03.25 c++ memorystream
  28. 2016.03.25 istream(ofstream) 사용시 주의점 ios::binary
  29. 2016.03.20 ARToolkit5 새로운 패턴 적용 하기
  30. 2016.03.19 VisualStudio용 StaticLib 적용하기를 도와주는 헬퍼 유틸

[메모][ANDROID] jar 를 만들기 위한 Gradle

apply plugin: 'com.android.library'

android {
compileSdkVersion 25
buildToolsVersion "25.0.3"
defaultConfig {
//applicationId "com.example.jongun.jartest4"
minSdkVersion 15
targetSdkVersion 25
//versionCode 1
//versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}

dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.3.1'
testCompile 'junit:junit:4.12'
compile files('libs/classes.jar')
}

task jar(type: Jar, dependsOn: 'assembleRelease') {
from fileTree(dir: 'build/intermediates/classes/release')
}

task deleteOldJar(type: Delete) {
//delete 'libs/moduleName.jar'
delete 'release/moduleName.jar'
}

//task to export contents as jar
task exportJar(type: Copy) {
from('build/intermediates/bundles/release/')
//into('libs/')
into('release/')
include('classes.jar')
///Give whatever name you want to give
rename('classes.jar', 'moduleName.jar')
}

exportJar.dependsOn(deleteOldJar, build)


'ETC' 카테고리의 다른 글

[메모][ANDROID] jar 를 만들기 위한 Gradle  (0) 2017.07.11
개발을 해도 될 자  (0) 2017.01.30
[손 노트 ]QUAD 그리는 법 정리  (0) 2015.11.23
윈도우즈에서 Hap 코덱 사용하기  (0) 2015.08.29
SUR40 의 문제  (68) 2011.11.29
[VS2010] 테마 바꾸기  (71) 2011.04.22
Yamecoder 야매코더_
ETC 2017.07.11 12:19

비연결형 소켓 OF (C++) 편


총 3개의 Layer로 구성됨

16 byte    : 머신, 혹은 App 을 구별할 GUID(UUID)
1  byte     : 0 ~ 255 까지의 message type 분류
data bytes : 실제 데이터  



* c# 용 비연결형 udp 소켓은 ( http://yamecoder.tistory.com/367 )


Communicaotr.h 싱글톤 Singleton<T> 는 ( http://yamecoder.tistory.com/368 )

#pragma once

/**
* [ Udp Communicator ]
*
* @author  yamecoder
* @version 17/02/24
*/


#include "Singleton.h"
#include "ofxNetwork.h"
#include "ofMain.h"

class Communicator : public Singleton<Communicator> , ofThread
{
public:
    const static char data_type_json = 0;
    const static char data_type_vec2 = 1;
    const static char data_type_text = 2;

private:
    bool is_setup = false;
    char* byte_id;
    ofxUDPManager udp_listener;
    ofxUDPManager udp_sender;
    
    char* buf_received_data;
    int buf_received_data_len = 10000;
    int byte_position = 0;

public:
    Communicator();
    ~Communicator();

    void Setup();

    void Send(char message_type, string str);

private:
    char* GenGuid();
    void threadedFunction();
    char* readData(int size);
};




ㅁㅁㅁ

Communicaotr.cpp

/**
* [ Udp Communicator ]
* 
* @author  yamecoder 
* @version 17/02/24
*/


#include "Communicator.h"
#include <objbase.h>

Communicator::Communicator()
{
    
}

Communicator::~Communicator()
{
}

void Communicator::Setup()
{
    if (is_setup == true)
        return;
    is_setup = true;

    byte_id = GenGuid();
    buf_received_data = new char[buf_received_data_len];

    //setup udp
    udp_listener.Create();
    udp_listener.BindMcast("224.0.0.0", 9999);
    
    udp_sender.Create();
    udp_sender.ConnectMcast("224.0.0.0", 9999);


    startThread();
}

void Communicator::Send(char message_type , string str)
{
    vector<char> data;
    for (size_t i = 0; i < 16; i++)
    {
        data.push_back(byte_id[i]);                 // insert byte_id(guid) of this machine
    }

    data.push_back(message_type);                   // insert message type (0 ~ 255 , 1byte)

    for (size_t i = 0; i < str.length(); i++)
    {
        data.push_back(str.c_str()[i]);             // insert message bytes
    }
    
    udp_sender.Send(&data[0], data.size());
}

char* Communicator::GenGuid()
{
    char* n_id = new char[16];

    GUID newId;
    HRESULT hr = CoCreateGuid(&newId);
    char* re_id = reinterpret_cast<char*>(&newId.Data4[0]);

    if (SUCCEEDED(hr))
    {
        char raw_id[16]
        {
            (newId.Data1 >> 24) & 0xFF,
            (newId.Data1 >> 16) & 0xFF,
            (newId.Data1 >> 8) & 0xFF,
            (newId.Data1) & 0xff,

            (newId.Data2 >> 8) & 0xFF,
            (newId.Data2) & 0xff,

            (newId.Data3 >> 8) & 0xFF,
            (newId.Data3) & 0xFF,

            (char)newId.Data4[0],
            (char)newId.Data4[1],
            (char)newId.Data4[2],
            (char)newId.Data4[3],
            (char)newId.Data4[4],
            (char)newId.Data4[5],
            (char)newId.Data4[6],
            (char)newId.Data4[7]
        };
        memcpy(n_id, raw_id, 16);

    }
    else
    {
        n_id = new char[16];
        for (size_t i = 0; i < 16; i++)
        {
            n_id[i] = char(i);
        }
    }
    

    return n_id;
}


void Communicator::threadedFunction()
{
    cout << "started !" << endl;
    while (isThreadRunning())
    {
        //wait
        udp_listener.Receive(buf_received_data, buf_received_data_len);
        
        //start read
        byte_position = 0;

        //read 16 bytes for sender guid.
        char* sender_id = readData(16);

        // check reflection
        bool check_myself = memcmp(sender_id, byte_id, 16);

        //release mem
        delete[] sender_id;
        
        if (check_myself != false)
        {
            char* type = readData(1);
            char* str = readData(buf_received_data_len - byte_position);




            // your code.
            if (type[0] == data_type_text)
            {

            }
            else if (type[0] == data_type_json)
            {

            }
            else if (type[0] == data_type_vec2)
            {

            }
            cout << str << endl;
            // end your code





            //release mem
            delete[] type;
            delete[] str;

            //clear buffer mem
            fill_n(buf_received_data, buf_received_data_len, 0);
        }
        else {
            // cout << "relfected form this machine" << endl;
        }
        


    }
}

char* Communicator::readData(int size)
{
    char* data = new char[size];
    memcpy(data, buf_received_data + byte_position, size);
    byte_position += size;
    return data;
}




Yamecoder 야매코더_
C++(oF) 2017.02.24 11:13

Generic Singleton Base Class


출처 : http://vallista.tistory.com/entry/1-Singleton-Pattern-in-C



#pragma once

//http://vallista.tistory.com/entry/1-Singleton-Pattern-in-C

template < typename T >
class Singleton
{
protected:
    Singleton()
    {

    }
    virtual ~Singleton()
    {

    }

public:
    static T * GetInstance()
    {
        if (m_pInstance == nullptr)
        {
            m_pInstance = new T;
        }
        return m_pInstance;
    }

    static void DestoryInstance()
    {
        if (m_pInstance)
        {
            delete m_pInstance;
            m_pInstance = nullptr;
        }
    }

private:
    static T * m_pInstance;
};

template < typename T > T * Singleton<T>::m_pInstance;



간단 활용법

#include "Singleton.h" class Communicator : public Singleton<Communicator> { public: Communicator(); ~Communicator(); }



Yamecoder 야매코더_
C++(oF) 2017.02.24 11:04

비연결형 UDP 소켓


비연결형 UDP 소켓 (멀티캐스트)

 - 서버와 클라이언트를 나누어 작업 할 필요가 없다.

 - 프로그램이 켜진 모두가 동일한 코멘트를 받는다. 심지어 자기 자신도, 

 


///
/// superSc
/// 2014.10.7
///

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;

namespace UDPListerner.jsocket.udp
{
    public class SNUdpSocket
    {

        public enum UdpStatus
        {
            Initialize,
            READY_TO_READ,
            END_READ,
        }

        #region Events

        public event EventHandler<TraceEventArg> TraceEvent;
        public event EventHandler<StatusEventArg> StatusEvent;

        #endregion


        private UdpStatus _currentStatus = UdpStatus.Initialize;
        private IPAddress _multicastIp = MultiCastAddress.BASE;

        private UdpClient _udplistener;
        private Thread _listenThread;
        
        private IPEndPoint _localEp;
        private IPEndPoint _removeEp;
        
        private int _localPort = 18888;

        public SNUdpSocket(int localPort = 18888 , IPAddress multicastIp = null )
        {
            this._localPort = localPort;
            if(multicastIp != null) this._multicastIp = multicastIp;
            SetupUdpListener();
        }

        public void Dispose()
        {
            _listenThread.Abort();
        }




        #region Setup and Receive
        

        private void SetupUdpListener()
        {
            _udplistener = new UdpClient();
            _udplistener.Client.ExclusiveAddressUse = false;
            //option : http://msdn.microsoft.com/ko-kr/library/system.net.sockets.socketoptionname(v=vs.110).aspx
            _udplistener.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);

            _localEp = new IPEndPoint(IPAddress.Any , _localPort);
            _removeEp = new IPEndPoint(_multicastIp, _localPort);
            _udplistener.Client.Bind(_localEp);
            _udplistener.JoinMulticastGroup(_multicastIp);

            _listenThread = new Thread(new ThreadStart(Receive));
            _listenThread.IsBackground = true;
            _listenThread.Start();
        }

        private void Receive()
        {
            while (true)
            {
                StatusEventDispatch(UdpStatus.READY_TO_READ);

                byte[] data = _udplistener.Receive(ref _localEp);

                StatusEventDispatch(UdpStatus.END_READ , data);
            }
        }

        #endregion





        #region DispatchEvent

        private void TraceEventDispatch(string message)
        {
            if (TraceEvent != null)
                TraceEvent(this, new TraceEventArg() { message = message });
        }

        private void StatusEventDispatch(UdpStatus status , byte[] data = null)
        {
            _currentStatus = status;
            if (StatusEvent != null)
                StatusEvent(this, new StatusEventArg() { status = status , data = data });
        }

        #endregion




        #region Sender
        
        public void SendBroadCast(string message)
        {
            byte[] data = System.Text.Encoding.Default.GetBytes(message);
            _udplistener.Send(data, data.Length, _removeEp);
        }

        #endregion
    }



    #region Multicast address
    
    public class MultiCastAddress
    {
        // 필요에 따라 추가 할것
        //http://en.wikipedia.org/wiki/Multicast_address




        /// <summary>
        /// Base address (reserved)
        /// </summary>

        public static readonly IPAddress BASE = IPAddress.Parse("224.0.0.0");


        /// <summary>
        /// The All Hosts multicast group addresses all hosts on the same network segment.
        /// </summary>
        public static readonly IPAddress ALL_HOST_GROUP = IPAddress.Parse("224.0.0.1");



    }

    #endregion




    #region EventArgs

    public class TraceEventArg : EventArgs
    {
        public string message;
    }

    public class StatusEventArg : EventArgs
    {
        public SNUdpSocket.UdpStatus status;
        public byte[] data;
    }




    #endregion
}



활용

using JUtil;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using UDPListerner.jsocket.udp;

namespace UDPListerner
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            
        }

        private void Window_Loaded_1(object sender, RoutedEventArgs e)
        {
            this.Dispatcher.BeginInvoke(new Action(() =>
            {
                AppStart();
            }));
        }



        private SNUdpSocket udpListener;
        private void AppStart()
        {
            TraceBox.InitailizeTraceBOX(this._traceBox);

            udpListener = new SNUdpSocket();
            udpListener.StatusEvent += udpListener_StatusEvent;
            TraceBox.trace("App Start");
        }

        

        protected override void OnClosed(EventArgs e)
        {
            base.OnClosed(e);
            udpListener.Dispose();
        }

        void udpListener_StatusEvent(object sender, StatusEventArg e)
        {
            TraceBox.trace("status" , e.status);
            if (e.data != null)
            {
                var data = System.Text.Encoding.Default.GetString(e.data);
                TraceBox.trace("data receive > ", data);
            }
        }



        #region button handles

        private void Ck_OpenUDP(object sender, RoutedEventArgs e)
        {

        }

        private void Ck_SendMessage(object sender, RoutedEventArgs e)
        {
            udpListener.SendBroadCast(this._chattx.Text);
        }

        #endregion
    }
}


Yamecoder 야매코더_
분류없음 2017.01.31 14:09

보다 심플한 C# 싱글턴 만들기

// simple type of c# singleton pattern
public class Communicator
{
    private static Communicator _inst;
    public static Communicator GetInst
    {
        get
        {
            return _inst;
        }
    }
    
    static Communicator()
    {
        _inst = new Communicator();
    }
    
    private Communicator()
    {
        Console.WriteLine("NEW");
    }
}



static 생성자를 통한 싱글턴 만들기.

Yamecoder 야매코더_
C# 2017.01.30 17:43

개발을 해도 될 자

2016 블로그 결산 : 


http://www.tistory.com/thankyou/2016/tistory/682133





'ETC' 카테고리의 다른 글

[메모][ANDROID] jar 를 만들기 위한 Gradle  (0) 2017.07.11
개발을 해도 될 자  (0) 2017.01.30
[손 노트 ]QUAD 그리는 법 정리  (0) 2015.11.23
윈도우즈에서 Hap 코덱 사용하기  (0) 2015.08.29
SUR40 의 문제  (68) 2011.11.29
[VS2010] 테마 바꾸기  (71) 2011.04.22
Yamecoder 야매코더_
ETC 2017.01.30 17:42

상속된 Generic 타입 만들기, 타입의 제약 사항 선언 ( Generics Constraint )

출처 : 


http://www.csharpstudy.com/CSharp/CSharp-generics.aspx






Generics 타입 제약(constraint) 

C# Generics를 선언할 때, 타입 파라미터가 Value Type인지 Reference 타입인지, 또는 어떤 특정 베이스 클래스로부터 파생된 타입인지, 어떤 인터페이스를 구현한 타입인지 등등을 지정할 수 있는데, 이는 where T : 제약조건과 같은 식으로 where 뒤에 제약 조건을 붙이면 가능하다. 아래는 다양한 제약을 가한 예제들이다. 

예제

// T는 Value 타입
class MyClass<T> where T : struct 

// T는 Reference 타입
class MyClass<T> where T : class

// T는 디폴트 생성자를 가져야 함
class MyClass<T> where T : new() 

// T는 MyBase의 파생클래스이어야 함
class MyClass<T> where T : MyBase

// T는 IComparable 인터페이스를 가져야 함
class MyClass<T> where T : IComparable

// 좀 더 복잡한 제약들
class EmployeeList<T> where T : Employee,
   IEmployee, IComparable<T>, new()
{
}


Yamecoder 야매코더_
C# 2016.11.19 14:35

First look of [MS Hololens]


Yamecoder 야매코더_
분류없음 2016.09.26 20:18

중국어 , 한국어 완벽지원 addon , ofxFontStash

ofxFontStash

https://github.com/armadillu/ofxFontStash



예제를 보면 직접 코드에 중국어 등을 입력 하여 출력 하였지만, 

Visual C++ 2015 에서의 cpp 안에 직접 작성한 문자열이 UTF8을 정확히 읽지 못하는것으로 예상, 그래서 외부의 Txt을 불러와 랜더링을 하였다.


#include "ofApp.h"

//--------------------------------------------------------------
void ofApp::setup() {

    //ofEnableAlphaBlending();
    ofSetVerticalSync(true);
    ofSetFrameRate(60);
    ofBackground(22, 22, 22, 255);

    unicodeFont.setup("Arial Unicode.ttf", //font file, ttf only
        1.0,                    //lineheight percent
        1024,                   //texture atlas dimension
        true,                   //create mipmaps of the font, useful to scale down the font at smaller sizes
        8,                  //texture atlas element padding, shouldbe >0 if using mipmaps otherwise
        4.0f                    //dpi scaleup, render textures @2x the reso
    );                  //lower res mipmaps wil bleed into each other

    unicodeFont.setLodBias(-1);

    ofFile f("text.txt" , ofFile::Mode::ReadOnly);
    ofBuffer buf = f.readToBuffer().getText();
    f.close();
    str = buf.getText();
}

void ofApp::update() {
}

//--------------------------------------------------------------
void ofApp::draw() {
    ofSetColor(255);
    unicodeFont.drawMultiLine(str, 30, 0, 30);
}




Hello.

한글테스트.

首先要拥有一个优酷帐号,

并申请加入视频云,点击这里注册优酷帐号

一个开发者帐号可以申请多个应用

(client_id),点击这里申请

应用自动生效,可作为开发和测试使用。

应用分为四个等级,普通、中级、

高级和合作级。升级后不同等级应用可

调用不同API。




영어, 한글, 중국어 모두 정상적으로 출력된다.


Yamecoder 야매코더_
C++(oF) 2016.09.01 22:13

Visual Studio 2015 에서 Icon 바꾸기



이미지 따라 하면 됨




1. http://icoconvert.com/image_to_icon_converter/




2.



3.



4.



5.



6.



7.



8.



9.



10.



11.



12.



13.



14.


Yamecoder 야매코더_
C++(oF) 2016.08.27 19:41

WebClient 를 이용한 GET 과 POST 전송하기.

GET 예제 


WebClient wc = new WebClient();
StringBuilder sb = new StringBuilder();
sb.Append("https://openapi.youku.com/v2/uploads/create.json?");
sb.AppendFormat("client_id={0}", client_id);
sb.AppendFormat("&access_token={0}", access_token);
sb.AppendFormat("&title={0}", "jjongun upload test " + time_str);
sb.AppendFormat("&tags={0}", "jjongun");
sb.AppendFormat("&file_md5={0}", hashString);
sb.AppendFormat("&file_name={0}", fileName);
sb.AppendFormat("&file_size={0}", video_data.Length.ToString());

string call_upload_cmd = sb.ToString();
string result = wc.DownloadString(call_upload_cmd);
Console.WriteLine(result);


보통 DownloadString (...) 으로 해결 가능 함.





POST 예제 , string 업로드


sb.Clear();
sb.AppendFormat("upload_token={0}", upload_token);
sb.AppendFormat("&file_size={0}", file_size);
sb.AppendFormat("&ext={0}", ext);
sb.AppendFormat("&slice_length={0}", 10240);
Console.WriteLine(sb.ToString());
result = wc.UploadString(host_addr, sb.ToString());



보통 UploadString 으로 해결 가능 하며 , 상황에 따라 Data 를 전송 할 것인지, Value 들만 전달 할 것인지 결정 할 수 있다.


sb.Clear();
sb.Append(host_addr);
sb.AppendFormat("upload_token={0}", upload_token);
sb.AppendFormat("&slice_task_id={0}", slice_task_id);
sb.AppendFormat("&offset={0}", offset);
sb.AppendFormat("&length={0}", length);

var result_bytes = wc.UploadData(sb.ToString(), "POST", video_data);
result = Encoding.Default.GetString(result_bytes);


위의 예제는 binary 를 전달 한 예제 이고, 결과 역시 byte[] 로 떨어지기 때문에 문자열로 인코딩을 하여 결과를 받아야 한다.



이때 오류 상황을 잘 볼 필요가 있는데, 만약 "400" 오류 가 난다면, 서버는 작동을 하나, 파라메터와 값들이 틀렸다는 것이다. 




//추가


System.Net.Json.dll


는 매우 편리한 JSON 라이브러리 이다.


보통 OAuth 들을 사용하는 서비들의 응답이 JSON 으로 오는 경우가 허다하다. 


JsonTextParser parser = new JsonTextParser();
JsonObject json_obj;
JsonObjectCollection collection;

json_obj = parser.Parse(result);
collection = json_obj as JsonObjectCollection;
collection["video_id"].GetValue();



처럼 직관적인 사용이 가능하다.

..


 



Yamecoder 야매코더_
C# 2016.08.27 18:19

sort 사용하기


아이템


class SubtitleItem { public: enum SUBTITLE_DIRECTION { LEFT, RIGHT }; float time; SUBTITLE_DIRECTION direction; ofImage* image; static bool comp(const SubtitleItem *t1, const SubtitleItem *t2) { // 중요! return (t1->time < t2->time); } };






활용


cout << "SORT TEST" << endl;
    cout << "=========== before =========" << endl;

    for (int i = 0; i < collection.size(); i++)
    {
        cout << collection[i]->time << endl;
    }

    
    //sort
    sort(collection.begin(), collection.end(), SubtitleItem::comp);


    cout << "============ after =========" << endl;
    for (int i = 0; i < collection.size(); i++)
    {
        cout << collection[i]->time << endl;
    }




결과 



'C++(일반)' 카테고리의 다른 글

sort 사용하기  (0) 2016.08.19
Cmd 명령으로 프로그램 실행 하기  (0) 2016.08.10
_memcpy(...) with start Index.  (0) 2016.03.27
char 와 unsigned char  (0) 2016.03.27
c++ memorystream  (0) 2016.03.25
istream(ofstream) 사용시 주의점 ios::binary  (0) 2016.03.25
Yamecoder 야매코더_
C++(일반) 2016.08.19 15:25

Cmd 명령으로 프로그램 실행 하기


C#의 Process.Start 처럼 , 

C++ 에서도 가능하다.


아래의 예제는 ffmpeg.exe 를 통해 웹에서 재생이 가능한 영상으로 변환 하는 옵션을 포함 하고 있다.

프로세스를 마칠때 까지 해당 쓰레드는 멈춘다.



LPWSTR ConvertToLPWSTR(const std::string& s) { LPWSTR ws = new wchar_t[s.size() + 1]; // +1 for zero at the end copy(s.begin(), s.end(), ws); ws[s.size()] = 0; // zero at the end return ws; } ... cout << "start" << endl; SHELLEXECUTEINFO processInfo; ZeroMemory(&processInfo , sizeof(processInfo)); processInfo.cbSize = sizeof(processInfo); processInfo.lpVerb = ConvertToLPWSTR("open"); processInfo.lpFile = ConvertToLPWSTR("ffmpeg.exe"); processInfo.lpParameters = ConvertToLPWSTR("-y -i capture.wmv -vcodec libx264 -f mp4 -b:v 2048k -r 30 x_wmv_win_mpeg.mp4"); processInfo.fMask = SEE_MASK_FLAG_NO_UI | SEE_MASK_NOCLOSEPROCESS; processInfo.nShow = SW_HIDE; // SW_SHOW int r = (int)ShellExecuteEx(&processInfo); WaitForSingleObject(processInfo.hProcess, INFINITE); // 프로세스가 끝날때까지 기다림 cout << "end : " << r << endl;






'C++(일반)' 카테고리의 다른 글

sort 사용하기  (0) 2016.08.19
Cmd 명령으로 프로그램 실행 하기  (0) 2016.08.10
_memcpy(...) with start Index.  (0) 2016.03.27
char 와 unsigned char  (0) 2016.03.27
c++ memorystream  (0) 2016.03.25
istream(ofstream) 사용시 주의점 ios::binary  (0) 2016.03.25
Yamecoder 야매코더_
C++(일반) 2016.08.10 13:38

libVLC 를 이용한 캡처장치 수신

이전글 참고 : 

http://scripter.co.kr/354



 

aaa

위에 것은 캡처 카드를 수신 한 것이고, 

아래 것은 웹캠을 수신 한 것이다. 


libVlc 를 이용 하여 캡처장치를 열때, 약간의 딜레이가 발생 할 수 있는데, 원인은 바로 사운드 이다. 

사운드 장치를 none 으로 바꾸도록 설정 한 다음 이용 하면 레퍼런스 프로그램 수준으로 딜레이가 없어진다. 


코드 : https://github.com/jjongun/ofxAddons/tree/master/work_addons/ofxVlcDShowGrabber


[문제점]

1) 간혹 play 할때 에러가 난다.

2) ( 어플리케이션을 종료 하거나 할때 ) 장치가 간혹 잘 종료 되지 않아 다음 회차에 사용을 못할 경우가 있다.

Yamecoder 야매코더_
C++(oF) 2016.07.31 20:29

보다 높은 퍼포먼스를 위한 LIBVLC 사용




이전글 참고 : 

http://scripter.co.kr/354


기존에 작성되었던  https://github.com/jnakanojp/ofxVLCVideoPlayer 약간의 문제를 포함 하고 있었다. 


1. 불필요 하게 class가 2개 였다.

2. 컬러포멧은 RGBA, 즉 4바이트를 할당하게 하여 퍼포먼스에 문제가 있었다.

3. 다소 불필요한 thread lock, unlock 으로 인한 퍼포먼스 저하가 있었다( 어떤 낮은 시스템에서는 필요 할 수 있다. )


이점들을 해결 하여 새롭게 작성 하였다. 


https://github.com/jjongun/ofxAddons/tree/master/work_addons/ofxVlcMediaPlayer/src


아울러 발견된 사실은, 


1. libvlc.dll 에 따라 vlc 초기화 옵션중 작동을 하지 못하는 경우가 있다.

2. 위와 같이 성능을 최적화 시키고 thread를 충분히 할당 하면 4K 30fps 는 무난히 돌아 가나, 60fps 에는 다소 무리가 있다. 

테스트 대상 [ https://kodi.tv/media-samples/ ]



Yamecoder 야매코더_
C++(oF) 2016.07.29 08:33

Poco 를 이용한 날짜 계산

#include "ofApp.h"
#include "Poco\Timespan.h"
#include "Poco\DateTime.h"
using namespace Poco;
//--------------------------------------------------------------
void ofApp::setup(){

    Timespan _fewDays(3, 0, 0, 0, 0); // 3일 
    DateTime _today(2016,1,1);
    DateTime _before = _today - _fewDays;
    DateTime _ago = _today + _fewDays;

    cout << "today is  : " << _today.year() << "/" << _today.month() << "/" << _today.day() << endl;
    cout << "- 3 days  : " << _before.year() << "/" << _before.month() << "/" << _before.day() << endl;
    cout << "+ 3 days  : " << _ago.year() << "/" << _ago.month() << "/" << _ago.day() << endl;

    
    // 오늘로 날짜 리셋
    _today = DateTime(ofGetYear(), ofGetMonth(), ofGetDay()); 
    DateTime _olyrimpicDay(2018, 2, 9);
    Timespan dday = _olyrimpicDay - _today + 1; // 오늘 부터 1일
    cout << dday.days()  << endl; // 평창 올림픽 까지 남은 날.
}



C# 만큼 편리한 계산이 가능함.

Yamecoder 야매코더_
C++(oF) 2016.07.10 21:24

[of] LIB VLC 사용하기

0. 왜 VLC 인가? 

우선 윈도우용 0.9.X(3)  까지 의 내장된 ofVideoPlayer는 극히 성능이 저질이다. 720P 정도도 온전한 재생이 힘들다.

물론 대안으로 HAP 이 있다. 퍼포먼스는 보장 하지만 HAP 영상파일 자체는 매우 파일이 거대? 하며 용량이 무압축에 가깝다. 퍼포먼스를 위해 감내해야 하는 비용이 상당하다. 또한 윈도우용 WMF 코덱을 이용하는 방법이 있다. 하지만 보다 범용적이고, 그래픽 성능을 모두 발휘 할 수 있는 VLC는 잘 다루면 스트리밍 서버/ 클라이언트 까지 구현이 가능 하며, 호환성이 좋기 때문에 응용하기에 따라 맥, 리눅스 에서도 무사히 사용이 가능 하다. 심지어 관련 정보도 많이 있다. 





1. vlc 를 다운 받는다. 대상 버전은, 현재 안정 버전인 2.0.5 이다.

1) http://www.videolan.org/vlc/#download




2. vlc 에드온 https://github.com/jnakanojp/ofxVLCVideoPlayer 을 다운받는다.

1) 설명에 적혀 있듯, 몇몇 파일들이 필요 하다. 필자의 경우 원본 훼손 우려를 피하기 위해 별도의 폴더에 필요한 파일을 옮기고 필요하다면 코드를 수정한다.

- 필요항목

* plugins 폴더

* sdk 폴더

* dll 들 : axvlc.dll , libvlc.dll , libvlccore.dll , npvlc.dll (사실 libvlc 와 libvlccore 만 있어도 됨)




3. ofxVLCVideoPlayer를 포함한 openframeworks 프로젝트를 생성 한다. 

1) 빌드를 한다음 bin 폴더에 이전에 따로 보관했던 [plugins 폴더]와 [  libvlc.dll , libvlccore.dll ] 을 복사한다.




4. 생성된 프로젝트에 Properties를 열어 VLC 라이브러리를 붙여 본다. 

(필자의 경우 [C:\CppLibs\vlc] 에 sdk 를 복사해서 사용 하였다. )


1) [C/C++] -> [Additional Include Directories] : 

* C:\CppLibs\vlc\sdk\include 추가

* C:\CppLibs\vlc\sdk\include\vlc\plugins 추가


2) [Linker] -> [Additional Library Directories] 

* C:\CppLibs\vlc\sdk\lib


3) [Linker] -> [Additional Library Directories] -> [input] -> [Additional Dependencies]

* libvlc.dll 기입

* libvlccore.dll 기입




5. 빌드를 해보자. 

ofApp.h 에 [ #include "ofxVLCVideoPlayer.h" ] 를 기록 하고 빌드를 해보자. 아마 수 많은 에러로 인하여 빌드가 되지 않을 것이다.




6. 이 문제를 해결하여 보자. 

아마 다른 플랫폼 혹은, 예전 컴파일러와 개발환경에 맞추어 져 있는 몇몇 코드들 때문에 원활히 빌드가 안되는것으로 예상한다. sdk 중 몇몇 코드를 수정 해야 한다.  (OF .0.9.3 기준, VisualStudio 2015 기준)


1) plugins/vlc_meta.h , plugins/vlc_epg.h , vlc_input_item.h , 

* #include <vlc_common.h> 추가


2) plugins/vlc_arrays.h

* strdup 을 -> _strdup 으로 수정한다. 

- Line 515 , 532 



7. ofxVLCVideoPlayer 의 일부 코드도 변경이 필요 하다. 

1) 94 ~ 97 줄 주석(//) 처리

2) 115 ~ 126 줄 주석(//) 처리



8. 마지막으로 SAFESSH 를 비활성화 한다.

1) [Linker] -> [Advanced] -> [Image Has Safe Exception Handlers] -> No 




9. 예제 코드 


ofApp.h

#include "ofMain.h"
#include "ofxVLCVideoPlayer.h"

class ofApp: public ofBaseApp{
    
    public:
        
        void setup();
        void update();
        void draw();
        
        void keyPressed(int key);   
        
        float   counter;
        bool    bSmooth;

        ofVideoPlayer player2;
        ofxVLCVideoPlayer player;

        ofImage testImage;
};



ofApp.cpp


#include "testApp.h"


//--------------------------------------------------------------
void ofApp::setup(){
player.loadMovie("test.mp4"); } //-------------------------------------------------------------- void ofApp::update(){
player.update(); } //-------------------------------------------------------------- void ofApp::draw(){
player.draw(0,0); } //-------------------------------------------------------------- void ofApp::keyPressed (int key){
if (key == ' ') { player.play(); } }






10. 성능과 마무리 

ofxVLCVideoPlayer 는 아직 정리가 덜된듯 하다. 그러나 1920x1080 영상은 매우 매끄럽게 돌아간다. 하지만 QHD , 4K 는 vlc 의 온전한 성능을 못내는것 같다.

아마 vlc 에서 콜백으로 픽셀을 받고 치환 하는 과정에서 무언가 비효율이 발생 하는듯 한데 조만간 ofxVLCVideoPlayer 를 참고하여 온전한 vlc 성능을 내는 에드온을 만들어야 하겠음.



참고로 원래 vlc 플레이어는 4K 영상이 온전히 돌아간다. 



(7/25) 만들었음 : http://scripter.co.kr/356



Yamecoder 야매코더_
C++(oF) 2016.07.09 22:53

Blur쉐이더 , Desktop 용






원본은 https://www.shadertoy.com/view/4lXXWn 이다.

하지만 OF용으로 몇몇것들이 맞지 않아 수정을 해야 했다.



결과물 상세 이미지





쉐이더 1번에 최대한 효과적인 블러를 만들어야 겠다는 목표로.. 






#define STRINGIFY(A) #A

ofImage image1;
ofImage boy;
ofShader shader1;

//--------------------------------------------------------------
void ofApp::setup(){

//원본 : https://www.shadertoy.com/view/4lXXWn
string shaderProgram = STRINGIFY(

uniform sampler2DRect iChannel0;
uniform vec3 iResolution;

uniform float repeats;
uniform float amount; // 범위 0.0 ~ 0.1

vec4 texture(vec2 uv) {
return texture2DRect(iChannel0,vec2(uv.x * iResolution.x ,uv.y * iResolution.y));//.rgb;
}


//랜덤 이용
float rand(vec2 co){
return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);
}

void mainImage( out vec4 fragColor, vec2 fragCoord )
{

vec2 uv = (fragCoord.xy / iResolution.xy);

vec4 blurred_image = vec4(0.);
for (float i = 0.0; i < repeats; i++) {
vec2 q = vec2(cos(degrees((i/repeats)*360.)),sin(degrees((i/repeats)*360.))) * (rand(vec2(i*uv.x ,i*uv.y ))+amount);
vec2 uv2 = uv+(q*amount);
blurred_image += texture(uv2)/2.;
q = vec2(cos(degrees((i/repeats)*360.)),sin(degrees((i/repeats)*360.))) * (rand(vec2(i*uv.x ,i*uv.y ))+amount);
uv2 = uv+(q*amount);
blurred_image += texture(uv2)/2.;
}
blurred_image /= repeats;
fragColor = blurred_image;
}


void main(void)
{
vec2 pos = gl_TexCoord[0].st;
vec4 color = vec4(0.0 , 0.0 , 0.0 , 0.0);
mainImage(color , pos);
gl_FragColor = color;
}

);

shader1.setupShaderFromSource(GL_FRAGMENT_SHADER , shaderProgram);
shader1.linkProgram();

boy.load("images/boy.png");
image1.load("images/scenery.png");
}

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

float elapsed_time = 0.0;
void ofApp::draw(){

elapsed_time += ofGetLastFrameTime();

int repeats = ofMap(ofGetMouseX() ,0 , ofGetWidth() , 1 , 240);
float amount = ofMap(ofGetMouseY() , 0 , ofGetHeight() , 0.0 , 0.1);

boy.draw(0 , 0 , ofGetWidth() , ofGetHeight());

shader1.begin();
shader1.setUniform3f("iResolution" , image1.getWidth() , image1.getHeight() , 0.0f);
shader1.setUniform1f("repeats" , repeats);
shader1.setUniform1f("amount" , ofMap(ofGetMouseY() , 0 , ofGetHeight() , 0.0 , 0.1));
image1.draw(0,0);
shader1.end();

ofDrawBitmapStringHighlight(ofToString(ofGetFrameRate()) , 30,30);
ofDrawBitmapStringHighlight("repeats : " + ofToString(repeats) , 30 , 60);
ofDrawBitmapStringHighlight("amount : " + ofToString(amount) , 30 , 75);

boy.draw(30 , 90 , 50 , 50);

}

//--------------------------------------------------------------
void ofApp::update(){

}



//--------------------------------------------------------------
void ofApp::keyPressed(int key){

if(key == '1')
{
image1 = ofImage("images/scenery.png");

}
else if(key == '2')
{
image1 = ofImage("images/CircleAndRect1.png");
}

} 

저장저장


Yamecoder 야매코더_
C++(oF) 2016.06.18 21:28

Desktop 과 IOS(openGLES2.0) 의 쉐이더 텍스처 기본 시작 코드

Desktop 코드


#define STRINGIFY(A) #A

ofImage image1;
ofShader shader1;
//--------------------------------------------------------------
void ofApp::setup(){


string shaderProgram = STRINGIFY(

uniform sampler2DRect tex0;
void main(void)
{
vec2 pos = gl_TexCoord[0].st;
gl_FragColor = texture2DRect(tex0 , pos);
}

);

shader1.setupShaderFromSource(GL_FRAGMENT_SHADER , shaderProgram);
shader1.linkProgram();

image1.load("images/image1.jpg");

}

//--------------------------------------------------------------
void ofApp::draw(){
shader1.begin();
image1.draw(0,0);
shader1.end();

} 









IOS 코드 (아래 중요(important!)부분이 반드시 들어가야 setupShaderFromSource(...) 를 이용 할 수 있다)

#define STRINGIFY(A) #A

ofImage image1;
ofShader shader1;
//--------------------------------------------------------------
void ofApp::setup(){


ofxiPhoneSetOrientation(OF_ORIENTATION_90_LEFT);

string shaderProgram_vert = STRINGIFY(
uniform mat4 modelViewProjectionMatrix;
attribute vec4 position;
attribute vec2 texcoord;
varying vec2 texCoordVarying;

void main(void)
{
texCoordVarying = texcoord;
gl_Position = modelViewProjectionMatrix * position;
}
);

string shaderProgram_frag = STRINGIFY(

precision highp float;
uniform sampler2D tex0;
varying vec2 texCoordVarying;
void main(void)
{
gl_FragColor = texture2D(tex0 , texCoordVarying);
}

);

shader1.setupShaderFromSource(GL_VERTEX_SHADER , shaderProgram_vert );
shader1.setupShaderFromSource(GL_FRAGMENT_SHADER , shaderProgram_frag);

// important!
if( ofIsGLProgrammableRenderer())
{
shader1.bindDefaults();
}
shader1.linkProgram();

image1.load("images/image1.jpg");

}

void ofApp::draw(){

shader1.begin();
image1.draw(0,0);
shader1.end();

}


Yamecoder 야매코더_
C++(oF) 2016.06.18 02:41

[IOS] 아이폰의 카메라 기능을 모두 사용 하기



아이폰에서 OF 를 통하여 카메라를 사용 할때 ofVideoGrabber 를 사용하면 fps 가 현저히 떨어진다 (0.9.3 의 경우)


따라서 이건 사용 하지 못하고 [ AVFoundationVideoGrabber ] 를 사용 하여야 한다. 


아쉽게도 직접 그리는 방법은 제공 되지 않고 ofImage로 픽셀을 복사 하여 draw 하면 된다. 



그런데 아쉽게도 of에서 제공하는 [ AVFoundationVideoGrabber ]  는 아이폰 카메라의 focus , torch , white balance 의 기능을 제어하지 못하게 되어 있다. 


하지만 objective-c 를 호출 하여 해결 할 수 있다.



또한 아이폰 카메라 뷰의 "사진" 모드와 다소 비율이 다른데 이것은 


AVFoundationVideoGrabber.mm 에서 해상도 설정을 강제로 4:3 으로 맞추면 된다. (1024 x 768)

그렇게 하면 아래위로 보다 넓은 해상도를 얻을수 있다.

이때 preset 을 16:9 가 명시되어 있는 것으로 지정 하면 종횡비가 맞지 않는다. (AVCaptureSessionPreset1280x720 와 같은것은 안된다.)



(원문 출처 : : :https://github.com/armadillu/openFrameworks/blob/7c6d4e28802a9bbfd47ed27651e7df10c1b78a1f/addons/ofxiPhone/src/AVFoundationVideoGrabber.h)

 : 

AVFoundationVideoGrabber.h 중 일부 


... (생략) ...

-(void)lockExposureAndFocus;
-(vector <string>)listDevices;
-(void)setDevice:(int)_device;
-(void)eraseGrabberPtr;

-(CGImageRef)getCurrentFrame;


//add jjongun

// focus
-(bool)setContinuousAutoFocus;
-(bool)focusOnce;
-(bool)lockFocus; //at curent focus
-(bool)touchFocusAt:(CGPoint)focusPoint; // (0,0) bottom left, (1,1) top right, calls focusOnce



// Exposure
-(bool)setContinuousAutoExposure;
-(bool)lockExposure;
-(bool)autoExposureOnce;
-(bool)touchExposeAt:(CGPoint)autoExposeHere; // (0,0) bottom left, (1,1) top right, calls autoExposreOnce



// Torch
-(float)currentTorchLevel; // [0..1]
-(bool)startTorch;
-(bool)setAutoTorch; //adjust torch intensity depending on scene darkness
-(bool)stopTorch;



//white balance
-(bool)setContinuousAutoWhiteBalance;
-(bool)lockWhiteBalance;
-(bool)autoWhiteBalanceOnce;



@end

class AVFoundationVideoGrabber{

    public:     
        AVFoundationVideoGrabber();
        ~AVFoundationVideoGrabber();

 ... (생략) ...

//jjongun c++ 로 링킹 iOSVideoGrabber* getiOSVideoGrabber() const; //focus bool setContinuousAutoFocus(); bool focusOnce(); bool lockFocus(); bool touchFocusAt(ofVec2f point); //Exposure bool setContinuousAutoExposure(); bool lockExposure(); bool autoExposureOnce(); bool touchExposeAt(ofVec2f point); // Torch float currentTorchLevel(); // [0..1] bool startTorch(); bool setAutoTorch(); //adjust torch intensity depending on scene darkness bool stopTorch(); //white balance bool setContinuousAutoWhiteBalance(); bool lockWhiteBalance(); bool autoWhiteBalanceOnce();


 ... (생략) ...



이하 mm 파일은 아래에 


AVFoundationVideoGrabber.h


AVFoundationVideoGrabber.mm



..



 

Yamecoder 야매코더_
C++(oF) 2016.04.16 16:22

CLM Framework with (TBB) on openFrameworks

..(아직 포스팅 안됨)..

Yamecoder 야매코더_
C++(oF) 2016.04.14 00:42

간단한 다각형의 HitTest

...

Yamecoder 야매코더_
C++(oF) 2016.04.11 23:37

[초간단] OF윈도우 리사이즈 막기

#include "ofMain.h"
#include "ofApp.h"

//========================================================================
int main( ){
    ofGLFWWindowSettings settings;
    settings.width = 1024;
    settings.height = 1024;
    settings.windowMode = OF_WINDOW;
    settings.resizable = false; // 리사이즈 셋팅
    ofCreateWindow(settings);
    //ofSetupOpenGL(&window , 600,768,OF_WINDOW);           // <-------- setup the GL context

    // this kicks off the running of my app
    // can be OF_WINDOW or OF_FULLSCREEN
    // pass in width and height too:
    ofRunApp(new ofApp());

}



ofSetupOpenGL 대신 푸른색 부분으로 치환 

Yamecoder 야매코더_
C++(oF) 2016.04.06 18:45

OF로 만든 VR 비디오 뷰어.

와... 배경음악 저작권 찾아내는게 기술이다.. 



Yamecoder 야매코더_
C++(oF) 2016.04.02 19:32

_memcpy(...) with start Index.

int len = 10;
    int dst[] = { -1,-1,-1,-1,-1,-1,-1,-1,-1,-1 };
    int src[] = {  0 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 };

    int sp = 5; // 시작 인덱스
    int read_count = len - sp; // 카운트
    _memccpy(&dst[sp], &src[sp], 1 , read_count * sizeof(int));


    for (int i = 0; i < 10; i++)
    {
        cout << i << " : " << dst[i] << endl; // 검산
    }


'C++(일반)' 카테고리의 다른 글

sort 사용하기  (0) 2016.08.19
Cmd 명령으로 프로그램 실행 하기  (0) 2016.08.10
_memcpy(...) with start Index.  (0) 2016.03.27
char 와 unsigned char  (0) 2016.03.27
c++ memorystream  (0) 2016.03.25
istream(ofstream) 사용시 주의점 ios::binary  (0) 2016.03.25
Yamecoder 야매코더_
C++(일반) 2016.03.27 19:59

char 와 unsigned char



char : -128 ~ 127 

unsigned char : 0 ~ 255


흔히 아는 byte 는 unsigned char 이다. 

특히 byte(char*)에서 변환시에 주의 해야 한다. 그냥 char 로 변환되는 숫자 영역대가 존재 하기 때문. 


 stringstream ss;
    ss << "=== char* ===========================" << "\r\n";

    int src = 2685;
    int tmp = 0;
    int r = 0;
    for (size_t i = 0; i < 10; i++)
    {
        
        tmp = 2685 + i;
        char* bytes = (char*)&(tmp); // int 를 byte array 로 변환
        r = (bytes[3] << 24) | (bytes[2] << 16) | (bytes[1] << 8) | bytes[0]; // byte arrayint 로 변환
        ss << tmp << " : " << r << "\r\n";
    }
    ss << "\r\n";
    ss << "=== unsigned char* ==================" << "\r\n";

    for (size_t i = 0; i < 10; i++)
    {

        tmp = 2685 + i;
        unsigned char* bytes = (unsigned char*)&(tmp); // int 를 byte array 로 변환
        r = (bytes[3] << 24) | (bytes[2] << 16) | (bytes[1] << 8) | bytes[0]; // byte arrayint 로 변환
        ss << tmp << " : " << r << "\r\n";
    }

    cout << ss << endl;
    ofFile f("char_test.txt" , ofFile::WriteOnly);
    f << ss.str();
    f.close();


의 결과는 ...


char 는 비정상 변환이 있다.


=== char* ===========================

2685 : 2685

2686 : 2686

2687 : 2687

2688 : -128

2689 : -127

2690 : -126

2691 : -125

2692 : -124

2693 : -123

2694 : -122


=== unsigned char* ==================

2685 : 2685

2686 : 2686

2687 : 2687

2688 : 2688

2689 : 2689

2690 : 2690

2691 : 2691

2692 : 2692

2693 : 2693

2694 : 2694



추가: char* 를 unsigned char* 로 바꾸어 변환 하기

int bytesToInt(char* nbytes) { unsigned char* bytes = reinterpret_cast<unsigned char*>(nbytes); return (bytes[3] << 24) | (bytes[2] << 16) | (bytes[1] << 8) | (bytes[0]); }



(당연한것이지만, 가끔 망각 할때가 있어 기록함.)


Yamecoder 야매코더_
C++(일반) 2016.03.27 14:33

c++ memorystream


ByteUtils.h


사용법

   //
    //write
    //
    byte_utils::mem_ostream out;
    out << "this is header";
    out << png_data.size();
    for (int i = 0; i < png_data.size(); i++)
    {
        out << png_data.getBinaryBuffer()[i];
    }

    

    //
    //read
    //
    int read_size = out.get_internal_vec().size();
    byte_utils::mem_istream in(out.get_ptr() , read_size);
    cout << " out.get_internal_vec() :  " << out.get_internal_vec().size() << endl;
    cout << " in size " << in.get_internal_vec().size() << endl;


    string header;
    in >> header;
    cout << "header : " << header << endl;
    int len = 0;
    in >> len;
    char* _real_data = new char[len];
    for (int i = 0; i < len; i++)
    {
        in >> _real_data[i];
    }


ㅁㅁ

장점 << 와 >> 로 손쉽게 순서에 맞추어 사용이 가능 하다.


출처 : http://www.codeproject.com/Tips/808776/Cplusplus-Simplistic-Binary-Streams

Yamecoder 야매코더_
C++(일반) 2016.03.25 22:01

istream(ofstream) 사용시 주의점 ios::binary

//len = 62303
    //in 은 간단한 메모리 스트림 입니다.
    char* _real_data = new char[len];
    for (int i = 0; i < len; i++)
    {
        in >> _real_data[i];
    }

    char* _fake_data = new char[len];

    ofstream save_fake_data("save_fake_data.fake");
    ofstream save_real_data("save_real_data.data" , ios::binary);
    for (int i = 0; i < len; i++)
    {
        save_fake_data << _fake_data[i];
        save_real_data << _real_data[i];
    }
    save_fake_data.close();
    save_real_data.close();
ave_real_data.data 는 62,563 (비정상)
save_fake_data.fake 는 62.303 (정상)



해결 방법은 ofstream 에 모드를 지정 해야 한다.

ofstream save_real_data("save_real_data.data" , ios::binary);



Yamecoder 야매코더_
C++(일반) 2016.03.25 17:18

ARToolkit5 새로운 패턴 적용 하기


[Windows]


1. 사용 버전과 동일한 패키지 다운로드 하기 : http://artoolkit.org/download-artoolkit-sdk


2.. 다운로드 후 설치 


3. bin 위치로 이동 [기본) C:\Program Files (x86)\ARToolKit5\bin ]


4. mk_patt.exe 실행 


5. 카메라세팅은 디폴트로 (보통 웹캠의 경우... ) 한다면 그냥 엔터. 


6. 간단한 카메라 프리셋 


7. 카메라를 통해 마커 노출 




영역이 잡힌다면, 영역을 마우스 좌클릭,


8. 콘솔창으로 이동 하여 세이브 경로 지정 

- 만약 에러(error) 가 난다면, 절대 경로 부터 입력

 예) c:/temp/ex.pat


9. 세이브 파일을 황용.

Yamecoder 야매코더_
C++(oF) 2016.03.20 02:55

VisualStudio용 StaticLib 적용하기를 도와주는 헬퍼 유틸

#include "ofApp.h"
#include "ofFileUtils.h"

//========================================================================

vector<string> each_lib_infos;
vector<string> include_dirs;
vector<string> lib_dirs;
const string ENDL = "\r\n";

string GetAllFileInDir(ofDirectory dir)
{
    stringstream ss;
    vector<ofFile> files = dir.getFiles();

    ss << ENDL;

    int found_include_count = 0;
    vector<string> lib_files;

    for (ofFile f : files)
    {
        if (f.isDirectory() == true)
        {
            GetAllFileInDir(ofDirectory(f.path()));
        }

        if (f.getExtension() == "lib")
        {
            lib_files.push_back(f.getFileName());
        }
        else if (f.getExtension() == "h" || f.getExtension() == "hpp" || f.getExtension() == "cpp")
        {
            found_include_count++;
        }
    }

    if (lib_files.size() > 0)
    {
        ss << "[ LIB LIST ] : " << ENDL;
        ss << "dir : " << dir.getAbsolutePath() << ENDL;
        ss << "=============================================" << ENDL;
        ss << ENDL;
        for (string str : lib_files)
        {
            ss << str << ENDL;
        }
        ss << ENDL;
        ss << "- short_cuts -" << ENDL;
        for (string str : lib_files)
        {
            ss << str << ";";
        }
        ss << ENDL;
        ss << ENDL;
        ss << ENDL;
        ss << ENDL;
        each_lib_infos.push_back(ss.str());

        lib_dirs.push_back(dir.getAbsolutePath());
    }

    if (found_include_count > 0)
    {
        include_dirs.push_back(dir.getAbsolutePath());
    }

    return ss.str();
}


int main() {
    of::priv::initutils(); // 중요
    ofDirectory dir(ofFilePath::getCurrentExeDir());

    GetAllFileInDir(dir);

    ofFile output_file("../output.txt", ofFile::WriteOnly);
    stringstream ss;


    //
    // short_cur_prints
    //
    ss.clear();
    ss << ENDL;
    ss << ENDL;
    ss << "★★★[ for Visual Studio Project Properites ]★★★" << ENDL;;
    ss << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" << ENDL;
    ss << ENDL;
    output_file << ss << ENDL;

    if (include_dirs.size() > 0)
    {
        ss.clear();
        ss << "< Additional Include Directories > " << ENDL;
        for (string str : include_dirs)
        {
            ss << str << ";";
        }
        ss << ENDL;
        ss << ENDL;
        output_file << ss << ENDL;

    }



    if (lib_dirs.size() > 0)
    {
        ss.clear();
        ss << " < Additional Library Directories > " << ENDL;
        for (string str : lib_dirs)
        {
            ss << str << ";";
        }
        ss << ENDL;
        ss << ENDL;
        output_file << ss << ENDL;
    }

    ss.clear();
    ss << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" << ENDL;
    output_file << ss << ENDL;



    //
    // actual paths and file list
    //

    ss.clear();
    ss << ENDL << ENDL << ENDL << ENDL << ENDL << ENDL;
    ss << "[ INCLUDE DIR LIST ]" << ENDL;
    ss << "------------------------------------------" << ENDL;
    ss << ENDL;
    for (string str : include_dirs)
    {
        ss << str << ENDL;
    }
    ss << ENDL;
    ss << ENDL;
    ss << "------------------------------------------" << ENDL;
    ss << ENDL;
    ss << ENDL;
    ss << ENDL;
    ss << ENDL;

    output_file << ss << ENDL;

    ss << ENDL << ENDL << ENDL;
    for (string str : each_lib_infos)
    {
        output_file << str << ENDL;
    }


    //output_file << "A" << "\r\n" << "B";
    output_file.close();
    return 0;
}



StaticLibSettingHelper.exe





 


결과 예제 


★★★[ for Visual Studio Project Properites ]★★★

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~



< Additional Include Directories > 

I:/Work\OFWork\of_v0.9_vs_release\apps\myApps\Work\StaticLibSettingUtil\bin\opencv\include\opencv;I:/Work\OFWork\of_v0.9_vs_release\apps\myApps\Work\StaticLibSettingUtil\bin\opencv\include\opencv2\calib3d;I:/Work\OFWork\of_v0.9_vs_release\apps\myApps\Work\StaticLibSettingUtil\bin\opencv\include\opencv2\contrib;I:/Work\OFWork\of_v0.9_vs_release\apps\myApps\Work\StaticLibSettingUtil\bin\opencv\include\opencv2\core;I:/Work\OFWork\of_v0.9_vs_release\apps\myApps\Work\StaticLibSettingUtil\bin\opencv\include\opencv2\features2d;I:/Work\OFWork\of_v0.9_vs_release\apps\myApps\Work\StaticLibSettingUtil\bin\opencv\include\opencv2\flann;I:/Work\OFWork\of_v0.9_vs_release\apps\myApps\Work\StaticLibSettingUtil\bin\opencv\include\opencv2\gpu\device\detail;I:/Work\OFWork\of_v0.9_vs_release\apps\myApps\Work\StaticLibSettingUtil\bin\opencv\include\opencv2\gpu\device;I:/Work\OFWork\of_v0.9_vs_release\apps\myApps\Work\StaticLibSettingUtil\bin\opencv\include\opencv2\gpu;I:/Work\OFWork\of_v0.9_vs_release\apps\myApps\Work\StaticLibSettingUtil\bin\opencv\include\opencv2\highgui;I:/Work\OFWork\of_v0.9_vs_release\apps\myApps\Work\StaticLibSettingUtil\bin\opencv\include\opencv2\imgproc;I:/Work\OFWork\of_v0.9_vs_release\apps\myApps\Work\StaticLibSettingUtil\bin\opencv\include\opencv2\legacy;I:/Work\OFWork\of_v0.9_vs_release\apps\myApps\Work\StaticLibSettingUtil\bin\opencv\include\opencv2\ml;I:/Work\OFWork\of_v0.9_vs_release\apps\myApps\Work\StaticLibSettingUtil\bin\opencv\include\opencv2\nonfree;I:/Work\OFWork\of_v0.9_vs_release\apps\myApps\Work\StaticLibSettingUtil\bin\opencv\include\opencv2\objdetect;I:/Work\OFWork\of_v0.9_vs_release\apps\myApps\Work\StaticLibSettingUtil\bin\opencv\include\opencv2\photo;I:/Work\OFWork\of_v0.9_vs_release\apps\myApps\Work\StaticLibSettingUtil\bin\opencv\include\opencv2\stitching\detail;I:/Work\OFWork\of_v0.9_vs_release\apps\myApps\Work\StaticLibSettingUtil\bin\opencv\include\opencv2\stitching;I:/Work\OFWork\of_v0.9_vs_release\apps\myApps\Work\StaticLibSettingUtil\bin\opencv\include\opencv2\superres;I:/Work\OFWork\of_v0.9_vs_release\apps\myApps\Work\StaticLibSettingUtil\bin\opencv\include\opencv2\ts;I:/Work\OFWork\of_v0.9_vs_release\apps\myApps\Work\StaticLibSettingUtil\bin\opencv\include\opencv2\video;I:/Work\OFWork\of_v0.9_vs_release\apps\myApps\Work\StaticLibSettingUtil\bin\opencv\include\opencv2\videostab;I:/Work\OFWork\of_v0.9_vs_release\apps\myApps\Work\StaticLibSettingUtil\bin\opencv\include\opencv2;



 < Additional Library Directories > 

I:/Work\OFWork\of_v0.9_vs_release\apps\myApps\Work\StaticLibSettingUtil\bin\opencv\lib\vs\Win32\Debug;I:/Work\OFWork\of_v0.9_vs_release\apps\myApps\Work\StaticLibSettingUtil\bin\opencv\lib\vs\Win32\Release;I:/Work\OFWork\of_v0.9_vs_release\apps\myApps\Work\StaticLibSettingUtil\bin\opencv\lib\vs\x64\Debug;I:/Work\OFWork\of_v0.9_vs_release\apps\myApps\Work\StaticLibSettingUtil\bin\opencv\lib\vs\x64\Release;



~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~








[ INCLUDE DIR LIST ]

------------------------------------------


I:/Work\OFWork\of_v0.9_vs_release\apps\myApps\Work\StaticLibSettingUtil\bin\opencv\include\opencv

I:/Work\OFWork\of_v0.9_vs_release\apps\myApps\Work\StaticLibSettingUtil\bin\opencv\include\opencv2\calib3d

I:/Work\OFWork\of_v0.9_vs_release\apps\myApps\Work\StaticLibSettingUtil\bin\opencv\include\opencv2\contrib

I:/Work\OFWork\of_v0.9_vs_release\apps\myApps\Work\StaticLibSettingUtil\bin\opencv\include\opencv2\core

I:/Work\OFWork\of_v0.9_vs_release\apps\myApps\Work\StaticLibSettingUtil\bin\opencv\include\opencv2\features2d

I:/Work\OFWork\of_v0.9_vs_release\apps\myApps\Work\StaticLibSettingUtil\bin\opencv\include\opencv2\flann

I:/Work\OFWork\of_v0.9_vs_release\apps\myApps\Work\StaticLibSettingUtil\bin\opencv\include\opencv2\gpu\device\detail

I:/Work\OFWork\of_v0.9_vs_release\apps\myApps\Work\StaticLibSettingUtil\bin\opencv\include\opencv2\gpu\device

I:/Work\OFWork\of_v0.9_vs_release\apps\myApps\Work\StaticLibSettingUtil\bin\opencv\include\opencv2\gpu

I:/Work\OFWork\of_v0.9_vs_release\apps\myApps\Work\StaticLibSettingUtil\bin\opencv\include\opencv2\highgui

I:/Work\OFWork\of_v0.9_vs_release\apps\myApps\Work\StaticLibSettingUtil\bin\opencv\include\opencv2\imgproc

I:/Work\OFWork\of_v0.9_vs_release\apps\myApps\Work\StaticLibSettingUtil\bin\opencv\include\opencv2\legacy

I:/Work\OFWork\of_v0.9_vs_release\apps\myApps\Work\StaticLibSettingUtil\bin\opencv\include\opencv2\ml

I:/Work\OFWork\of_v0.9_vs_release\apps\myApps\Work\StaticLibSettingUtil\bin\opencv\include\opencv2\nonfree

I:/Work\OFWork\of_v0.9_vs_release\apps\myApps\Work\StaticLibSettingUtil\bin\opencv\include\opencv2\objdetect

I:/Work\OFWork\of_v0.9_vs_release\apps\myApps\Work\StaticLibSettingUtil\bin\opencv\include\opencv2\photo

I:/Work\OFWork\of_v0.9_vs_release\apps\myApps\Work\StaticLibSettingUtil\bin\opencv\include\opencv2\stitching\detail

I:/Work\OFWork\of_v0.9_vs_release\apps\myApps\Work\StaticLibSettingUtil\bin\opencv\include\opencv2\stitching

I:/Work\OFWork\of_v0.9_vs_release\apps\myApps\Work\StaticLibSettingUtil\bin\opencv\include\opencv2\superres

I:/Work\OFWork\of_v0.9_vs_release\apps\myApps\Work\StaticLibSettingUtil\bin\opencv\include\opencv2\ts

I:/Work\OFWork\of_v0.9_vs_release\apps\myApps\Work\StaticLibSettingUtil\bin\opencv\include\opencv2\video

I:/Work\OFWork\of_v0.9_vs_release\apps\myApps\Work\StaticLibSettingUtil\bin\opencv\include\opencv2\videostab

I:/Work\OFWork\of_v0.9_vs_release\apps\myApps\Work\StaticLibSettingUtil\bin\opencv\include\opencv2



------------------------------------------







[ LIB LIST ] : 

dir : I:/Work\OFWork\of_v0.9_vs_release\apps\myApps\Work\StaticLibSettingUtil\bin\opencv\lib\vs\Win32\Debug

=============================================


opencv_calib3d249d.lib

opencv_contrib249d.lib

opencv_core249d.lib

opencv_features2d249d.lib

opencv_flann249d.lib

opencv_gpu249d.lib

opencv_highgui249d.lib

opencv_imgproc249d.lib

opencv_legacy249d.lib

opencv_ml249d.lib

opencv_nonfree249d.lib

opencv_objdetect249d.lib

opencv_photo249d.lib

opencv_stitching249d.lib

opencv_superres249d.lib

opencv_ts249d.lib

opencv_video249d.lib

opencv_videostab249d.lib

zlibd.lib


- short_cuts -

opencv_calib3d249d.lib;opencv_contrib249d.lib;opencv_core249d.lib;opencv_features2d249d.lib;opencv_flann249d.lib;opencv_gpu249d.lib;opencv_highgui249d.lib;opencv_imgproc249d.lib;opencv_legacy249d.lib;opencv_ml249d.lib;opencv_nonfree249d.lib;opencv_objdetect249d.lib;opencv_photo249d.lib;opencv_stitching249d.lib;opencv_superres249d.lib;opencv_ts249d.lib;opencv_video249d.lib;opencv_videostab249d.lib;zlibd.lib;






[ LIB LIST ] : 

dir : I:/Work\OFWork\of_v0.9_vs_release\apps\myApps\Work\StaticLibSettingUtil\bin\opencv\lib\vs\Win32\Release

=============================================


opencv_calib3d249.lib

opencv_contrib249.lib

opencv_core249.lib

opencv_features2d249.lib

opencv_flann249.lib

opencv_gpu249.lib

opencv_highgui249.lib

opencv_imgproc249.lib

opencv_legacy249.lib

opencv_ml249.lib

opencv_nonfree249.lib

opencv_objdetect249.lib

opencv_photo249.lib

opencv_stitching249.lib

opencv_superres249.lib

opencv_ts249.lib

opencv_video249.lib

opencv_videostab249.lib

zlib.lib


- short_cuts -

opencv_calib3d249.lib;opencv_contrib249.lib;opencv_core249.lib;opencv_features2d249.lib;opencv_flann249.lib;opencv_gpu249.lib;opencv_highgui249.lib;opencv_imgproc249.lib;opencv_legacy249.lib;opencv_ml249.lib;opencv_nonfree249.lib;opencv_objdetect249.lib;opencv_photo249.lib;opencv_stitching249.lib;opencv_superres249.lib;opencv_ts249.lib;opencv_video249.lib;opencv_videostab249.lib;zlib.lib;






[ LIB LIST ] : 

dir : I:/Work\OFWork\of_v0.9_vs_release\apps\myApps\Work\StaticLibSettingUtil\bin\opencv\lib\vs\x64\Debug

=============================================


opencv_calib3d249d.lib

opencv_contrib249d.lib

opencv_core249d.lib

opencv_features2d249d.lib

opencv_flann249d.lib

opencv_gpu249d.lib

opencv_highgui249d.lib

opencv_imgproc249d.lib

opencv_legacy249d.lib

opencv_ml249d.lib

opencv_nonfree249d.lib

opencv_objdetect249d.lib

opencv_photo249d.lib

opencv_stitching249d.lib

opencv_superres249d.lib

opencv_ts249d.lib

opencv_video249d.lib

opencv_videostab249d.lib

zlibd.lib


- short_cuts -

opencv_calib3d249d.lib;opencv_contrib249d.lib;opencv_core249d.lib;opencv_features2d249d.lib;opencv_flann249d.lib;opencv_gpu249d.lib;opencv_highgui249d.lib;opencv_imgproc249d.lib;opencv_legacy249d.lib;opencv_ml249d.lib;opencv_nonfree249d.lib;opencv_objdetect249d.lib;opencv_photo249d.lib;opencv_stitching249d.lib;opencv_superres249d.lib;opencv_ts249d.lib;opencv_video249d.lib;opencv_videostab249d.lib;zlibd.lib;






[ LIB LIST ] : 

dir : I:/Work\OFWork\of_v0.9_vs_release\apps\myApps\Work\StaticLibSettingUtil\bin\opencv\lib\vs\x64\Release

=============================================


opencv_calib3d249.lib

opencv_contrib249.lib

opencv_core249.lib

opencv_features2d249.lib

opencv_flann249.lib

opencv_gpu249.lib

opencv_highgui249.lib

opencv_imgproc249.lib

opencv_legacy249.lib

opencv_ml249.lib

opencv_nonfree249.lib

opencv_objdetect249.lib

opencv_photo249.lib

opencv_stitching249.lib

opencv_superres249.lib

opencv_ts249.lib

opencv_video249.lib

opencv_videostab249.lib

zlib.lib


- short_cuts -

opencv_calib3d249.lib;opencv_contrib249.lib;opencv_core249.lib;opencv_features2d249.lib;opencv_flann249.lib;opencv_gpu249.lib;opencv_highgui249.lib;opencv_imgproc249.lib;opencv_legacy249.lib;opencv_ml249.lib;opencv_nonfree249.lib;opencv_objdetect249.lib;opencv_photo249.lib;opencv_stitching249.lib;opencv_superres249.lib;opencv_ts249.lib;opencv_video249.lib;opencv_videostab249.lib;zlib.lib;






Yamecoder 야매코더_
C++(일반) 2016.03.19 01:36
Powerd by Tistory, designed by criuce
rss