node.js 용 opencv 와 camera 모듈 설치하기

|



노드에서 웹캡에 접근하여 캡쳐화면을 받거나 영상인식을 할수있도록 도와주는 opencv 모듈을 사용하는 방법에 대해서 알아보자

노드 카메라 모듈 아래 싸이트에서 찾을 수 있다.
https://github.com/wearefractal/camera/tree/master

카메라 모듈은 커피스크립트로 되어있다. 커피 스크립트에 잘모른다면 자료는 이것을 보도록하자
http://www.ibm.com/developerworks/kr/library/wa-coffee1/index.html

일단 카메라모듈을 설치하기 위해서 선행되어야할것이 opencv의 설치이다.


-맥용 설치법-


node camera 모듈 맥에서 세팅하기

1. 맥포트설치(첨부파일확인)


2. 맥포트 업글
sudo port selfupdate
sudo port install pkgconfig

3. opencv설치
sudo port install opencv

4. 카메라 모듈 설치
npm install opencv
npm install camera


참고자료:
http://blog.secmem.org/46



-윈도우즈용

준비중...

-리눅스용



And

node.js로 arduino board 제어하기 1강.Noduino 설치하기

|


1. node.js 확인


먼저 노드를 설치합니다.(노드에 대한 약간의 선행학습이 필요합니다.)


터미널창을 여시고 node 와 npm이 제데로 동작하는 확인합니다.


npm이라는것이 있는데요. 이것은 노드를설치하면 같이 깔립니다.

노드 플러그인을 설치해주는 유틸입니다. 


node 실행해서 간단하게 핼로월드 찍어보기



터미널에서 npm 실행화면




2. 노드위노설치하기


노드위노(noduino )는 듀이노(duino)를 사용한 서버 프레임웍입니다. 


터미널에서 다음을 입력해봅니다.

ls /dev | grep usb


아무것도 출력되지않으면 아두이노보드가 피씨와 연결이 안된겁니다. 연결설정을 확인하시고(리눅스, macosx 용)



  1. crw-rw-rw- 1 root wheel 18, 17 24 Feb 22:54 cu.usbmodem1d11
  2. crw-rw-rw- 1 root wheel 18, 16 24 Feb 22:00 tty.usbmodem1d11


가 출력되었다면 정상적으로 보드가 잡힌겁니다.( 윈도우는 설정에서 확인하세요.)


http://semu.github.com/noduino/ 에 접속하셔셔 파일을 다운 받거나..



git clone git://github.com/semu/noduino.git 으로 프로잭트저장소를 끌어 옵니다.


파일첨부합니다. 그러나 되도록 최신버전을 받아서 하시는것이 좋을듯^^;


noduino-master.zip



암튼 다운받은 파일의 압축을 푸시고 터미널창을 여신다음 cd 를 입력하시고 압축을 푼 폴더를 터미널창에 끌어다 놓습니다.







ls 로 폴더로 제데로 이동했는지 확인합니다.




그다음 npm으로 노드위노(nodeuino)에 필요한 노드확장플러그인들을 설치합니다.


npm install 을 쳐줍니다.






3. 노드위노 전용 듀이노(duino) 설치하기


듀이노는 노드위노와는 다른것입니다. 듀이노는 단순히 자바스크립트로 아두이노를 제어하는 프로잭트이고 여기에 노드를 붙이는것은 노드위노가 해주게됩니다. 

그래서 노드위노용 듀이노가 필요합니다. 그냥 듀이노를 설치하시면 안됩니다.

여러 버전의 듀이노가 있지만 꼭 여기서 듀이노를 다운받아서 해야합니다.

https://github.com/semu/duino



duino-master.zip



마찬가지로 압축을 풀어 듀이노(duino) 폴더에 넣어줍니다.

node_modules 폴더 안에 있는 듀이노와는 다르므로 이것을 카피하시면 안되고 새로 받으셔야 합니다.




duino/src/du.ino 파일을 아두이노 보드에 업로드합니다.






3. 예제 실행하기


텍스트 편집기로 다음과 같이 간단한 예제를 만들어봅니다.


var requirejs = require('requirejs');

requirejs.config({nodeRequire: require});


requirejs(['./public/scripts/libs/Noduino','./public/scripts/libs/Noduino.Serial','./public/scripts/libs/Logger'],

        function(NoduinoObj,NoduinoConnector,logger) {

            console.log('load success NoduinoObj module');

            var Noduino = new NoduinoObj({debug: true, host: 'http://localhost:8090'}, NoduinoConnector,logger);

            Noduino.connect(function(err, board) {

                if (err) {

                    console.log('************device not ready');

                    return console.log(err);

                }


                console.log('Connected to board');

            });



        });


그리고 1.js 저장합니다.



1.js






터미널에서 node 1.js 를 타이핑해줍니다.



다음과 같이 설정이 초기화되고 제데로 모듈이 동작하지만 아두이노 보드가 없기 때문에 디바이스 못찾는다고 나옵니다.

물론 아두이노 보드가 있으면 커넥트 됐다는 메쎄지가 나오겠죠

암튼 노드에 아두이노 제어모듈은 제데로 설치된것입니다. 이제 쇼핑몰로 가서 아두이노 구매 하시고 즐겨보시길 바람니다.



보드구입 하고 다시 실행해보면...

다음과 같이 나옵니다.


















And

도플광어의 Backbone.js 강좌 1. 모델

|


1. 모델 클래스 만들기


Model 객체로부터 상속받아서 새로운 클래스를정의 할수있다.


var Person = Backbone.Model.extend({

        initialize: function(data) {

            console.log('welcome backbone');

            console.log('hello ' + data.name);

        }

    });



스크립트언어에 익숙하지않다면 약간 이상해보일수도있지만 이것은 스크립트언어이기때문에 가능한 문법이다. 컴파일러형언어에서는 클래스와 객체가 명확히 나누어져있다. 클래스는 붕어빵틀역역활을 하고 인스턴스 객체는 그틀로 만들어진 붕어빠같은것이지만

스크립트언어에서는 붕어빵틀과 붕어빵의 구분이 명확하지않다. 스크립트언어에서는 인스턴스만 객체 있을뿐이다. 왜냐하면 컴파일과 실행이 따로 분리되어있지않고 항상실행상태로 간주되기때문이다. 코딩을 하는중간에도 실행중인것이다. 그래서 틀이라는 개념이 컴파일러형언어처럼 경직되어있지않다.


그래서 위와같이 어떤 함수 객체가 새로운 함수 객체를 만들어 반환할수도있고 이미만들어진 객체에 새로운 멤버데이터가 추가 될수도있는것이다.

Person은 인스턴스객체 이면서 동시에 클래스가 될수도있다.(c++ 프로그래머만 알아들을수있는 말?)


Peroson이 새로운 인스턴스를 만들려면 다음과 같이한다.


var somebody = new Person({name:'tommy'});


{name:'tommy'} 은 생성자에 넘겨주는 인자와 같은 역활을한다. 이 인자는 그대로 initialize함수의 인자로 전달된다.


2. 멤버 다루기


멤버 변수에 접근하는 방법은


내부에서는 

this.attributes.name

this.get('name'); 두가지로 가능하다.


외부에서접근은 

somebody.attributes.name; 

somebody.get('name');


역시 두가지 모두 가능하다.


somebody.toJSON();

json형태로 모델데이터를 내보낼수도 있다.


3. initialize 함수


생성자에서 넣어준값이 파라메터로 넘어올수있고 또는 함수내에서 this.attributes 형태로 받아볼수있다.

4. defaults 구조체


초기 값들을 설정해주는 일종의 초기화 객체이다. 단순히 객체만 값을 초기화 해줄목적이면 initialize에서보다 defaults에서 단순하게 정의만 해주는게 낫다.


Person = Backbone.Model.extend(

 initialize: function() { console.log('wellcome' + this.get('name')); }, 

 defaults: { name: 'lsz', age: 42, children: [] }

 });


이렇게 하면 name의 기본값은 'lsz가된다.


5. 리스너


값이 바뀌면 연결해서 함수가 자동으로 호출되게 하는 개념이다.


function start() {

    Person = Backbone.Model.extend({

        initialize: function() {

            console.log('wellcome' + this.get('name'));

            /*

             * 리스너 설정 예 

             */

            this.bind("change:name", function() {

                console.log('change : ' + this.get('name'));

            });

            this.bind('error',function(model,error) {

                console.log('error occur~');

                console.log(model);

                console.log(error);

            })


        },

        defaults: {

            name: 'lsz',

            age: 42,

            children: []

        },

        replaceNameAttr: function(_name) {

            this.set({name:_name});

        },

        validate : function(attributes) {

          if(attributes.age < 0) {

              return 'u cant have negative age!';

          }  

        }

    });

    var person = new Person();

    person.set({name: 'tommy'});

    console.log(person.get('name'));

    person.set({age:-2});


}


bind 함수를 통해서 값과 변화가 있을때 연결할 함수를 정한다. 예제에서는 name값이 바뀌면 자동으로 인자로 연결해준 함수가 호출된다.


validate 함수를 이용해서 멤버변수값들의 범위를 지정할수있다. 만약 적절하지못한 범위의 값이 들어오면 해당 메시지를 보내거나 특정한 작업을 수행할수있다. 여기서는 age가 음수값이 나오면 오류 메씨지를 리턴하도록 했다.


bind 에서 'error'로 묶어진 함수에서 처리가된다. 묶어진 함수의 첫번째 인자로는 에러가 유발된 객체가 오고 두번째에는 validate에서 넘어온 메씨지나 오브잭트가 온다.


6. 상속


Person = Backbone.Model.extend({

        initialize: function(data) {

            console.log('init person');


        },

        test: function() {

            console.log('test!' + this.attributes.name);

        },

        test2: function() {

            console.log('person test!' + this.attributes.name);

        }

    });


    Soldier = Person.extend({

        initialize: function(data) {

            console.log('init soldier');

        },

        test2: function() {

            console.log('Soldier test!' + this.attributes.name);

        }


    });

    

    var soldier = new Soldier({name: 'tom', age: 27});


    soldier.test();

    soldier.test2();

    

    var person = new Person({name: 'jery', age: 27});

    person.test2();



Solider 를 Person을 상속받아서 만들었다. 이렇게 만들어진 soldier 는 test함수를 정의 하지 않았더라도 부모의 test 함수를 호출하게된다.






And