ON THE HAND

引っ越しました http://tech.andhandworks.com

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

このエントリーをはてなブックマークに追加

  1. --/--/--(--) --:--:--|
  2. スポンサー広告

iOS swift で OpenCV を使う

最近は Apple に Developer 登録しなくても自作 iOS アプリを実機で動かせるようになっています。
しかも、どうやら Xcode で OpenCV が使えるようです。

という訳で、ふと思い立ったので OpenCV を使った顔検出アプリを作ってみます。
・・・と思ったけど、顔認識の説明が長くなるのでとりあえずソーベルエッジ。

使う機材

  • Mac
    ご家庭で余っているMacを使います。
  • iPhone または iPad
    どこのご家庭にも2,3台あると思います。
  • Xcode
    iOS アプリの開発環境です。
    開発だけなら無料です。凄いです。
    AppStore からインストール。
  • OpenCV
    画像処理界のグローバルスタンダード。 今回の方法だといまのところ 3.0.0 が入るようです。

Cocoapods をインストール

OpenCV 単独であればライブラリを直接放り込んでも使えるようですが、
せっかく Cocoapods というパッケージ管理ツールがあるので使ってみます。
まずはターミナルを起動。
これ。
WS000000.jpg
インストールしようとすると依存関係で何やら大量に入りますが
エラーが出ていないなら気にしないことにします。
iMac:~ $ sudo gem install cocoapods
Fetching: i18n-0.7.0gem (100%)
Successfully installed i18n-0.7.0
   : (中略)
Parsing documentation for cocoapods-1.0.1
Installing ri documentation for cocoapods-1.0.1
23 gems installed
iMac:~ $ pod setup

Project を作成

Xcode 上でアプリを開発する際、各アプリのソースコード等が入ったデータ一式を Project と言います。
OpenCV は Project 毎にインストールするので先に Project を作成します。

このアイコンから Xcode を起動して
Create a new Xcode Project を選択します。
WS000001.jpg

とりあえず Single View Application で。
WS000002.jpg

アプリ名などは適当に。
WS000004.jpg

Projectが出来ました。
アプリを公開するときは細かく設定する必要がありますが今回は試しに動かすだけなのでデフォルトのままで。
WS000005.jpg

OpenCV のインストール

一旦 Xcode の Project を閉じます。
再びターミナルに戻って Project の xcodeproj が入っているディレクトリ内で Podfile を作り、OpenCV をインストールします。
対応する iOS のバージョンは 7.0 以上にしました。
6.x 以下に対応させようとすると泥沼化します。
iMac: ~ $ cd FaceRecogApp
iMac:FaceRecogApp $ vi Podfile
iMac:FaceRecogApp $ cat Podfile
target "FaceRecogApp" do
  echo 'platform :ios, "7.0"
  pod 'OpenCV' > Podfile
end
iMac:FaceRecogApp $ pod install

結構時間が掛かりますがエラーなく終了すればインストール完了。
xcworkspace というファイルをダブルクリックして Xcode で開きます。
WS000006.jpg

アプリでビデオキャプチャする

よくある iOS アプリの Hello World では「Storyboard で~」という感じで始まりますが、
iOS アプリの経験がない人間が Storyboard をいじり始めると余計に訳わからなくなるので
いきなりコードを書いていきます。

Xcode 上でアプリの Project 内に ViewController.swift というファイルがあるので開きます。
ここにこんな感じでガシガシ書いていくと、とりあえずカメラプレビューできるアプリが出来上がります。
コードの意味はコメントを参照。
import UIKit
import AVFoundation // カメラ映像用ライブラリ

class ViewController: UIViewController {
    
    var input:AVCaptureDeviceInput! // 映像入力

    var cameraView:UIView! // プレビュー表示用View
    var session:AVCaptureSession! // セッション
    var camera:AVCaptureDevice! // カメラデバイス

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    // 画面の初期化
    override func viewWillAppear(animated: Bool) {
        
        // プレビューを画面全体に引き延ばす
        let screenWidth = UIScreen.mainScreen().bounds.size.width;
        let screenHeight = UIScreen.mainScreen().bounds.size.height;
        cameraView = UIView(frame: CGRectMake(0.0, 0.0, screenWidth, screenHeight))
        
        // 背面カメラを探す
        // 自撮りにしたければ AVCaptureDevicePosition.Front
        session = AVCaptureSession()
        for captureDevice: AnyObject in AVCaptureDevice.devices() {
            if captureDevice.position == AVCaptureDevicePosition.Back {
                camera = captureDevice as? AVCaptureDevice
                break
            }
        }
        
        // カメラ映像を取得
        do {
            input = try AVCaptureDeviceInput(device: camera) as AVCaptureDeviceInput
        } catch let error as NSError {
            print(error)
        }
        
        if( session.canAddInput(input)) {
            session.addInput(input)
        }
        
        // 画面に表示
        let previewLayer = AVCaptureVideoPreviewLayer(session: session)
        previewLayer.frame = cameraView.frame
        previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
        
        self.view.layer.addSublayer(previewLayer)
        
        session.startRunning()
    }
}

ビルド、実行、そして失敗

カメラのキャプチャをするのでシミュレータでは動きません。
Mac に USB ケーブルで iPhone を接続してから Xcode の実行ボタンを押します。

・・・が、ビルドに失敗します。
Xcode7 では bitcode という中間データを使用しますが、
OpenCV は bitcode を含んでいないのでリンクエラーになるようです。

Xcode 上でプロジェクト名を選択し、Build Settings から bitcode を disable にします。
WS000009.jpg

で、再度試すと今度は iPhone 上でアプリが起動します。

処理対象の画像を取り出す

このままだと撮影した映像はそのまま画面に出てしまうので、 UIImage という画像オブジェクトの形でデータを取り出します。
// バッファ処理用 delegate を作れるように AVCaptureVideoDataOutputSampleBufferDelegate を継承
class ViewController: UIViewController, AVCaptureVideoDataOutputSampleBufferDelegate {
    
    var input:AVCaptureDeviceInput! // 映像入力
    var output:AVCaptureVideoDataOutput! // 映像出力

撮影した映像を queue に放り込んで delegate で処理するように変更。
処理が重くなって追いつかなくなるので間に合わなかったフレームは捨てます。
本当はフレームレートを落とした方が良いのですがやってません。
本体が発熱するかも。
    // 画面の初期化
    override func viewWillAppear(animated: Bool) {
        
        // プレビューを画面全体に引き延ばす
        let screenWidth = UIScreen.mainScreen().bounds.size.width;
        let screenHeight = UIScreen.mainScreen().bounds.size.height;
        cameraView = UIImageView(frame: CGRectMake(0.0, 0.0, screenWidth, screenHeight))
        
        // 背面カメラを探す
        // 自撮りにしたければ AVCaptureDevicePosition.Front
        session = AVCaptureSession()
        for captureDevice: AnyObject in AVCaptureDevice.devices() {
            if captureDevice.position == AVCaptureDevicePosition.Back {
                camera = captureDevice as? AVCaptureDevice
                break
            }
        }
        
        // カメラ映像を取得
        do {
            input = try AVCaptureDeviceInput(device: camera) as AVCaptureDeviceInput
        } catch let error as NSError {
            print(error)
        }
        
        if( session.canAddInput(input)) {
            session.addInput(input)
        }
        
        // カメラ映像を画像処理に回す.
        output = AVCaptureVideoDataOutput()
        output.videoSettings = [kCVPixelBufferPixelFormatTypeKey : Int(kCVPixelFormatType_32BGRA)]
        
        // デリゲート
        let queue: dispatch_queue_t = dispatch_queue_create("videoqueue" , nil)
        output.setSampleBufferDelegate(self, queue: queue)
        
        // 処理が遅れたフレームを捨てる
        output.alwaysDiscardsLateVideoFrames = true
        
        // セッションに出力を追加
        if session.canAddOutput(output) {
            session.addOutput(output)
        }
        
        // カメラ向きを固定
        for connection in output.connections {
            if let conn = connection as? AVCaptureConnection {
                if conn.supportsVideoOrientation {
                    conn.videoOrientation = AVCaptureVideoOrientation.Portrait
                }
            }
        }
        
        // 画面に表示 → captureOutputで出力
        self.view.addSubview(cameraView)
        //let previewLayer = AVCaptureVideoPreviewLayer(session: session)
        //previewLayer.frame = cameraView.frame
        //previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
        //
        //self.view.layer.addSublayer(previewLayer)
        
        session.startRunning()
    }

delegate で画像バッファを拾って UIImage を作ります。
正直言って、このコードは何をやっているのか全く分かりません。
訳も分からずサンプルコードを swift2 に対応させただけ。

作った UIImage は最後の ImageProcessing.SobelFilter という行で OpenCV に渡して処理します。
    // 表示更新
    func captureOutput(captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, fromConnection connection: AVCaptureConnection!) {
        
        let image:UIImage = self.captureImage(sampleBuffer)
        
        dispatch_async(dispatch_get_main_queue()) {
            // 描画
            self.cameraView.image = image
        }
    }
    
    // sampleBuffer から UIImage を作成
    func captureImage(sampleBuffer:CMSampleBufferRef) -> UIImage {

        // 画像取得
        let imageBuffer: CVImageBufferRef = CMSampleBufferGetImageBuffer(sampleBuffer)!
        
        // ベースアドレスをロック
        CVPixelBufferLockBaseAddress(imageBuffer, 0 )
            
        // 画像データ情報
        let baseAddress: UnsafeMutablePointer<Void> = CVPixelBufferGetBaseAddressOfPlane(imageBuffer, 0)
            
        let bytesPerRow: Int = CVPixelBufferGetBytesPerRow(imageBuffer)
        let width: Int = CVPixelBufferGetWidth(imageBuffer)
        let height: Int = CVPixelBufferGetHeight(imageBuffer)
        let bitmapInfo = CGImageAlphaInfo.PremultipliedFirst.rawValue|CGBitmapInfo.ByteOrder32Little.rawValue as UInt32
 
        //RGB色空間
        let colorSpace: CGColorSpaceRef = CGColorSpaceCreateDeviceRGB()!
        let newContext: CGContextRef = CGBitmapContextCreate(baseAddress,                                      width, height, 8, bytesPerRow, colorSpace, bitmapInfo)!
        // Quartz Image
        let imageRef: CGImageRef = CGBitmapContextCreateImage(newContext)!
            
        // UIImage
        let cameraImage: UIImage = UIImage(CGImage: imageRef)
        
        // OpenCV で SobelFilter を掛ける
        let resultImage: UIImage = ImageProcessing.SobelFilter(cameraImage)

        return resultImage

    }

OpenCV を組み込む

OpenCV は swift 非対応で、swift には C++ を直接書けないのでそのままでは繋がりません。
まず、Xcode のファイルリストを右クリックして「New File」で C++ 用のファイルを作ります。
その際に Xcode が自動的にヘッダファイルを作ってくれます。
今回、ImageProcessing.m というファイルを作成したら
ヘッダファイル名は{プロジェクト名}-Bridging-Header.h でした。なんでやねん。

ヘッダファイルにクラスを定義します。
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

@interface ImageProcessing: NSObject
+(UIImage *)SobelFilter:(UIImage *)image;
@end

C++ のファイルに実装したいところですが、
拡張子が自動的に「.m」になっており C++ が書けません。
画面右上の「Identity and Type」で拡張子を「.mm」に変更します。

で、UIImage をOpenCVの画像バッファに変換して
画像処理してUIImageに戻して返します。
素晴らしきかなOpenCV。超簡単。
#import <Foundation/Foundation.h>
#import >UIKit/UIKit.h>

#import "FaceRecogApp-Bridging-Header.h"

#import <opencv2/opencv.hpp>
#import <opencv2/imgcodecs/ios.h>

@implementation ImageProcessing: NSObject

+(UIImage *)SobelFilter:(UIImage *)image{
    
    //UIImageをcv::Matに変換
    cv::Mat mat;
    UIImageToMat(image, mat);
    
    //グレースケールに変換
    cv::Mat gray;
    cv::cvtColor(mat, gray, cv::COLOR_BGR2GRAY);
    
    // エッジ抽出
    cv::Mat edge;
    cv::Canny(gray, edge, 100, 200);
    
    //cv::Mat を UIImage に変換
    UIImage *result = MatToUIImage(edge);
    return result;
}
@end

ところで、ググると「#import <opencv2/highgui/ios.h>」と
なっている説明が大半ですが、OpenCV 3.0.0 では
imgcodecs に移っています。

また、「cv::cvColor」を使っているサンプルコードが多いですが
これも 3.0.0 では「cv::cvtColor」です。

実行

iPad で動かすとこんな感じになります。

このエントリーをはてなブックマークに追加

スポンサーサイト
  1. 2016/06/25(土) 01:03:10|
  2. iOS
  3. | コメント:2

WiiリモコンとArduinoでQuadcopterを飛ばす(6):Wiiリモコンをプロポにする

【ご注意】
ここで紹介する方法は飽くまで個々の技術を組み合わせた例です。
Wiiリモコンのセンサ等はラジコンに用いることを想定されておらず、
操作不能に陥り想定外の場所に暴走したり墜落することがあります。
規制区域はもちろんのこと、安易な飛行は非常に危険ですので
重々ご注意ください。

遅々として進まないままだらだら書いているうちにドローンの飛行が
規制されるようになってしまって、こんなのどこで飛ばすんだよ状態ですが
一応書き進めます。

前回はArduinoに安全装置を実装する方法について説明しました。
今回は Arduino 部分の残りのコードを完成させてWiiリモコンから操作できるようにします。

使用するWiiリモコンはモーションプラスが
付いているだけの普通のものです。
本当はクラシックコントローラで
アナログ操作したかったのですが
Arduinoから認識させられませんでした。
ヌンチャクは認識するのですが操作中に
接続が切れまくって使い物にならないので断念。
Arduino には PS3 コントローラ用のライブラリがあるので
PS3のDUALSHOCK3を使うとWiiリモコンよりは
操作しやすいかもしれません。
今回のプログラムは使えませんが。

ソースコード全体

GitHub にソースコードを置きました。
https://github.com/onthehand/Quad_PPM/blob/master/Quad_PPM.ino

ほとんどの部分はこれまでに説明済みなので、
おさらいも兼ねて loop 関数を一通り見ていきます。

Wiiリモコンとの接続

接続確認。
接続が切れているときは何もしません。
void loop() {
  Usb.Task();
  if(! Wii.wiimoteConnected || Wii.getButtonPress(HOME)){ activate = 0; return; }

一定時間おきに加速度センサをチェックします。
前回チェック時と同一の値だったら cc をインクリメントし、
cc が一定値を超えたら disarm しています。
詳しくは前回の安全装置その1をご参照ください。

WatchDog と組み合わせてタイマーをリセットした方がカッコいいですが
これ以上割り込みを増やしたくなかったので少々ダサい実装です。
  if( millis() > uptime ){
    // check connecition
    if( pp == Wii.getPitch() && pr == Wii.getRoll() ){ cc ++ ; }else{ cc = 0; }
    pp = Wii.getPitch();
    pr = Wii.getRoll();
    if(Wii.getButtonPress(RIGHT)){
      currentTh++;
    }else if(Wii.getButtonPress(LEFT)){
      currentTh--;
    }
    uptime = millis() + SPAN;    
  }
  if ( cc > WII_TIMEOUT / SPAN ){ activate = 0; return; }
  activate = 1;

ところで、WiiリモコンのRIGHTボタンを押すと
スロットル(currentTh)をインクリメントしています。
LEFTボタンならデクリメント。

何故 UP, DOWN ボタンではないのかと言うと、
Wiiリモコンを横持ちするからです。
横持ちすると RIGHT ボタンが上に来ます。

上ボタンを押しっぱなしにした時のスロットル加速度は
SPAN 変数の値で決まります。
Wiiリモコン接続確認間隔も SPAN 変数を共用しているので
スロットル加速度を下げると接続切れ対応が遅くなってしまいます。
このあたりも実装がダサいですね。

カメラ操作

前々回のカメラについての説明をご参照ください
分かりにくい実装ですが、Wiiリモコンの「2」ボタンを押すとカメラにパルスを飛ばします。
  if( 0 < camtrig && camtrig < millis() ){
    camtrig = 0;
    digitalWrite( PIN_CAMERA, LOW );
  }
  if( camtrig == 0 && Wii.getButtonPress(TWO) ){
    camtrig = millis() + CAMERA_PULSE;
    digitalWrite( PIN_CAMERA, HIGH );
  }

ロール/ピッチ/ヨーの制御

コードがどんどんカオスになっていきます。

y, r, p はそれぞれYaw, Roll, Pitch用の変数です。
ヨーは左右の方向制御なので単純に UP/DOWN ボタン
(リモコン横持ちで左右ボタン)に割り当てました。
checkButton関数はただ単に次の対応に従って値を返しているだけです。
  • DOWNボタン押下→HIGH_PULSE_TIME(Yawが右)
  • UPボタン押下→LOW_PULSE_TIME(Yawが左)
  • 何も押されていない→HALF_PULSE_TIME(Yawが真ん中)


RollとPitchは加速度センサの値をMultiWiiのパルス時間幅に引き延ばして使用しています。
一見、変数割り当てが逆になっているように見えますが、これもリモコン横持ちの影響です。
Wiiリモコンは長手方向を軸にした回転が Rollです。
横持ちした場合に前後の操作が Wii リモコンの Roll 回転に相当しますが、
この方向の操作は Quadcopter の仰角制御に割り当てるのが自然なので、
Quadcopter から見ると Pitch 方向の回転に相当します。
複雑。
  unsigned int y = checkButton(DOWN,UP,HIGH_PULSE_TIME,HALF_PULSE_TIME,LOW_PULSE_TIME);
  unsigned int r = map((unsigned int)(Wii.getPitch()*100.0), 9000, 27000, MAX_PULSE_TIME, MIN_PULSE_TIME);
  unsigned int p = map((unsigned int)(Wii.getRoll()*100.0), 9000, 27000, MIN_PULSE_TIME, MAX_PULSE_TIME);

おまけ機能

リモコンの「1」ボタンを押すとMultiWiiのAUX1がHIGHになるようにしました。
AUX1, AUX2 と言うのは本物のプロポに付いているトグルスイッチだそうです。
MultiWii側でAUX1にBAROを割り当てておくと、WiiリモコンからBAROのON/OFFを操作できます。

ちなみに、BAROと言うのは高度計です。
BAROをONにすると気圧センサを使って高度を一定に自動制御してくれる、、、はず
なのですが誤差がひどくてあまりアテになりません。

AUX2 も一応使えるようになっていますが実際には使っていません。
と言うのも、MultiWii はカメラにパルスを送る機能を持っていて、
AUX2 を割り当てようとしていたのですが、ただでさえ割り込みに敏感な
MultiWii でカメラを操作するよりも Arduino 側で直接カメラ操作した方が
安全かつ確実だという判断です。
  // BARO is supposed to be activated by AUX1.
  unsigned int a1 = (Wii.getButtonPress(ONE)) ? HIGH_PULSE_TIME : HALF_PULSE_TIME;
  unsigned int a2 = (Wii.getButtonPress(TWO)) ? HIGH_PULSE_TIME : HALF_PULSE_TIME;
  if( Wii.getWiiState() & 0x01 ){ a2 = LOW_PULSE_TIME; }

ARM/DISARM

通常であれば ARM, DISARM はプロポの左右レバーの組み合わせで操作するのですが、
Wiiリモコンでそれをやるのは不可能なのでショートカットを作ってあります。
今回はBボタンとプラスマイナスボタンの同時押しという、
偶然の誤操作があり得ない組み合わせにしています。
  if(Wii.getButtonPress(B)){
    r = p = HALF_PULSE_TIME;
    if(Wii.getButtonPress(PLUS)){
      // arm
      currentTh = 1000;
      y = 2000;
    }else if(Wii.getButtonPress(MINUS)){
      // disarm
      currentTh = y = 1000;
    }
  }
}

そんなこんなで普通に買ったら数万円するプロポを
2千円そこそこのWiiリモコンで実現できました。

・・・と言いたいところですが、そんなに上手くは行きません。
WiiリモコンのBluetoothの通信可能距離はせいぜい10m程度なので
ちょっと飛ばしたらあっという間に通信が切れて制御不能になります。

また10m以内でも頻繁に通信切れが発生してかなり危険なので
実用性は皆無だと考えた方が良いでしょう。

双葉のプロポを馬鹿にすることなかれ。

次回はMultiWii側について説明します。
気が向いたら。

このエントリーをはてなブックマークに追加

  1. 2016/06/23(木) 22:16:10|
  2. Quadcopter
  3. | コメント:8

USB顕微鏡をRaspberry Pi3 でストリーム配信

梅雨が明けたら待ちに待ったプランクトンの季節です。
という訳で、USBの顕微鏡を買ってみました。

中国製のかなり怪しい顕微鏡で付属のソフトを
Windows10 にインストールしてもまともに動作しません。
ところが、どういう訳か Raspberry Pi だと素晴らしく快調に映ります。

ちなみに、Amazon の商品説明は笑ってしまうほど嘘八百です。
  • 多数の倍率があることになっているが実際にピントが合うのは2種類だけ。
    Winソフトでデジタル的に引き延ばすのを倍率変更と呼んでいるようです。
  • 解像度最大 1600x1200 となっているが 640x480固定。
    Winソフトでデジタル的に1600まで引き延ばすようで鮮明になる訳ではありません。
  • 連続ズームの記載があるが実際にはズームするとピントが合わない。
  • SNAPとZOOMのボタンが存在するが動作しない。


とは言え、Raspberry Pi で動作する USB 顕微鏡がこの価格で手に入るのは悪くないと思います。

今回はこの顕微鏡を Raspberry Pi で2種類の使い方をしてみます。
1つ目はモバイルデジタル顕微鏡。
もう1つは顕微鏡映像のストリーム配信です。

モバイル顕微鏡化


まず Raspberry Pi の LCD モニタに映像を映します。
モバイルバッテリーを繋げば外に持ち歩くことも可能。

まぁ、OTG対応の android スマホを持っていれば顕微鏡を
直接スマホに挿して使えるんですけども。

Raspberry Pi で LCD を使う方法は過去記事をご参照ください。
Raspberry Pi3 を一体型 PC にする

この LCD モニタに顕微鏡の映像を映すには luvcview コマンドをインストールします。

pi@raspberrypi:~ $ sudo apt-get install luvcview


で、実行。それだけ。

pi@raspberrypi:~ $ luvcview


通常の Web カメラでも同様かと思います。
録画したい場合は guvcview をインストールすればOKです。

そんなこんなでミジンコを撮ってみました。


オンライン顕微鏡ストリーミング


Raspberry Pi で撮影しながら動画表示すると結構カクカクします。
そこで、Raspberry Pi をストリーミングサーバにして iPad で表示してみます。
これも mjpg-streamer を使うと結構簡単にできます。

まずは必要なパッケージをインストールしてソースからビルドします。

pi@raspberrypi:~ $ sudo apt-get install subversion libjpeg-dev imagemagick
pi@raspberrypi:~ $ svn co https://svn.code.sf.net/p/mjpg-streamer/code/mjpg-streamer mjpg-streamer
pi@raspberrypi:~ $ cd mjpg-streamer
pi@raspberrypi:~ $ make
pi@raspberrypi:~ $ make install


LD_LIBRARY_PATH を通して起動すれば配信開始。

pi@raspberrypi:~ $ sudo -s
root@raspberrypi:~# export LD_LIBRARY_PATH=/usr/local/lib
root@raspberrypi:~# mjpg_streamer -i "input_uvc.so -f 10 -r 640x480 -d /dev/video0 -y -n" -o "output_http.so -w /var/www/mjpg -p 8080"


iPad で Safari を開いて http://{IP_ADDRESS}:8080/?action=stream に
アクセスするとこんな感じになります。
ミジンコを観察できる壁掛けフレーム。オシャレ。


なお、ズームダイアルで数倍の大きさに拡大できますが、
大きすぎて滅多にミジンコがフレームインしなくなるので
このくらいの倍率がおすすめです。

Raspberry Pi の起動時に自動的に配信が始まるようにします。
スクリプトはこんな感じ。

#!/bin/sh
### BEGIN INIT INFO
# Provides: mjpg
# Required-Start: $local_fs $remote_fs $network $syslog $named
# Required-Stop: $local_fs $remote_fs $network $syslog $named
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
### END INIT INFO


export LD_LIBRARY_PATH=/usr/local/lib/:${LD_LIBRARY_PATH}

case "$1" in
start)
/usr/local/bin/mjpg_streamer -i "input_uvc.so -f 10 -r 640x480 -d /dev/video0 -y -n" -o "output_http.so -w /var/www/mjpg -p 8080" &
;;
stop)
/bin/kill -9 `/bin/pidof mjpg_streamer`
;;
esac

exit 0



root@raspberrypi:~# vi /etc/init.d/mjpg
root@raspberrypi:~# chmod 755 /etc/init.d/mjpg
root@raspberrypi:~# update-rc.d mjpg defaults


さらに、motion をインストールするとミジンコが映った時だけ録画することも可能。
ミジンコたん、、、可愛いよ、、、ハァハァ。。。

このエントリーをはてなブックマークに追加

  1. 2016/06/15(水) 22:58:05|
  2. Raspberry Pi
  3. | コメント:0
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。