2014年8月21日木曜日

OpenCV for iOS を試してみた

OpenCV for iOS を試した際のメモ

各バージョン
iOS : v7.1.2
Xcode : v5.1.1
OpenCV for iOS : v2.4.9

まずOpenCV公式ページからOpenCV for iOSをダウンロードします。

ダウンロードしたモノを解凍すると opencv2.framework が出てきます、これを使っていきます。

ここのページOpenCV iOS - Video Processingを参考に進めていきます。

テンプレートはSingle View Appricationを使いました。
作成できたら、先ほどダウンロードし解凍した opencv2.framework を作成したプロジェクトのFrameworksフォルダに入れておきます。
今回使用するフレームワークは以下のモノになります。opencv2.freamework 以外のものは Linked Frameworks and Libraries から追加してください。

使用するフレームワーク
  • opencv2.freamework
  • Accelerate.freamework
  • AssetsLibrary.freamework
  • AVFoundation.freamework
  • CoreGraphics.freamework
  • CoreImage.freamework
  • CoreMedia.freamework
  • CoreVideo.freamework
  • QuartzCore.freamework
  • UIKit.freamework
  • Foundation.freamework


次に <プロジェクト名>-Prefix.pch
の内容に以下を追記します。

#ifdef __cplusplus
    #import <opencv2/opencv.hpp>
#endif


追記した後の内容が以下のもになります。


//<プロジェクト名>-Prefix.pch

//
//  Prefix header
//
//  The contents of this file are implicitly included at the beginning of every source file.
//

#import <Availability.h>

#ifndef __IPHONE_5_0
#warning \"This project uses features only available in iOS SDK 5.0 and later.\"
#endif

#ifdef __cplusplus
    #import <opencv2/opencv.hpp>
#endif

#ifdef __OBJC__
    #import <UIKit/UIKit.h>
    #import <Foundation/Foundation.h>
#endif


ユーザインターフェース

次に Main.storyboard に UIImageView と UIButton2つ を配置します。下の図のように配置します。


対応するViewControllerにUIImageViewはIBOutletsとUIButton2つはIBActionsで追加して接続してください。したモノが下の図になります。


カメラの追加

ビューコントローラにカメラコントローラを追加し、ビューがロードされたときに、それを初期化するらしいです。
ViewController.hに以下の内容を記述


//ViewController.h

#import <UIKit/UIKit.h>
#import <opencv2/highgui/cap_ios.h>

@interface OFTViewController : UIViewController <CvVideoCameraDelegate>

@end


ビューコントローラはCvVideoCameraDelegateプロトコルを実装しなければならないし、ビデオカメラへのデリゲートとして設定する必要があります。
らしいので#import <opencv2/highgui/cap_ios.h>のインポートと CvVideoCameraDelegate でデリゲートを通す。


ViewController.mに以下の内容を記述

//ViewController.m

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    self.videoCamera = [[CvVideoCamera alloc] initWithParentView:_image];
    self.videoCamera.delegate = self;
    self.videoCamera.defaultAVCaptureDevicePosition = AVCaptureDevicePositionFront;
    self.videoCamera.defaultAVCaptureSessionPreset = AVCaptureSessionPreset352x288;
    self.videoCamera.defaultAVCaptureVideoOrientation = AVCaptureVideoOrientationPortrait;
    self.videoCamera.defaultFPS = 30;
    self.videoCamera.grayscaleMode = NO;
}


self . videoCamera . delegate = self ; でデリゲートを通している。


このケースでは、カメラを初期化し、各フレームをレンダリングするための標的としてのImageViewを提供する。CvVideoCameraは基本的にAVFoundationのラッパーなので、プロパティとしてAVFoundationカメラオプションの一部provie。たとえば私たちはフロントカメラを使用したい、(ビデオカメラは、通常、あなたは肖像画のアプリケーションを設計する際に、転置データ、その結果、横長モードで出力)352×288のビデオサイズやビデオの向きを設定。

プロパティdefaultFPSは、カメラのFPSを設定します。処理は、所望のFPSよりも小さい速い場合、フレームが自動的に削除されます。
プロパティ grayscaleMode=YES の場合、「YUV(YpCbCr 4:2:0)」、grayscaleMode=NO の32ビットBGRAを出力する。

らしい適当翻訳。

画像処理

ViewController.mに以下を記述。

//ViewController.m

#pragma mark - Protocol CvVideoCameraDelegate
#ifdef __cplusplus
- (void)processImage:(cv::Mat&)images;
{
    // Do some OpenCV stuff with the image
    cv::Mat image_copy;
    cv::cvtColor(images, image_copy, CV_BGRA2BGR);
    
    // invert image
    bitwise_not(image_copy, image_copy);
    cv::cvtColor(image_copy, images, CV_BGR2BGRA);
}
#endif


色の反転の画像処理を行っています。

ここでCV::Matをを使っていることに注意してください。
ViewController.m のコンパイルの設定を変更する必要があります(ここで少し間取りました)。
ViewController.m の Utilities の Identity and Typeの項目(右側にあるよ)のTypeを Objective-C++ Sourceに変更。


それと Build Phases の Compile Sources の ViewController.m の Compiler Flags を -x objective-c++ にする必要があります。


カメラ ON OFF

ボタンを押すと、次のコードは、適切にUIを接続と仮定して、カメラを起動・終了します。

//カメラ開始
- (IBAction)startOpencv:(id)sender {
      [self.videoCamera start];
}
//カメラ終了
- (IBAction)stopOpenCV:(id)sender {
    [self.videoCamera stop];
}


起動に成功するとインカメラが起動し反転した映像が映っていると思います。


最後に久しぶりにiOSのコードを触ったのでコードの書き方は正しいか怪しいです。


参考にしたページは以下になります。
OpenCV iOS - Video Processing
openCV 2.4.8 iOS 7.0 framework linker errors

2012年12月29日土曜日

Postgresql Library for iPhone

iPhoneアプリでpostgresqlにアクセスしたときのメモ。

開発環境 Xcode4.5.2 IOS6.0

ここPostgreSQL Client Library (libpq) for iPhone/iPadを参考にして作成(まんまパクr)。

libpqのダウンロード

libpqが含まれるpostgresqlのソースコードをダウンロード
PostgreSQLソースコードから好きなバージョンをダウンロード
私は2012/12/27現在最新のpostgresql-9.2.2.tar.bz2をダウンロードしました

libpqのビルド

ターミナルを起動し、ダウンロードしてきたpostgresql-9.2.2に移動し、以下のコマンドを起動

./configure
make -C src/interfaces/libpq
ar -t src/interfaces/libpq/libpq.a

必要なファイルは以下のもの(※バージョンによって必要なファイルが変わってくるのできちんと確認)

fe-auth.o
fe-connect.o
fe-exec.o
fe-misc.o
fe-print.o
fe-lobj.o
fe-protocol2.o
fe-protocol3.o
pqexpbuffer.o
pqsignal.o
fe-secure.o
libpq-events.o
chklocale.o
inet_net_ntop.o
noblock.o
pgstrcasecmp.o
thread.o
ip.o
md5.o
encnames.o
wchar.o

Xcodeプロジェクト作成

Xcode起動➡新規プロジェクト➡iOSのFramework & LibraryのCocoa Touch Static Libraryを選択➡ProductNameは適当に"psqlv9"にチェックには何も入れず、作成。(このときできたpsqlv9フォルダにpostgresql-9.2.2フォルダを入れておく、後のユーザヘッダ検索パスでの参照を楽にするため)

以下のファイルをプロジェクトに追加
postgresql-9.2.2/src/interfaces/libpq
fe-auth.c
fe-connect.c
fe-exec.c
fe-lobj.c
fe-misc.c
fe-print.c
fe-protocol2.c
fe-protocol3.c
fe-secure.c
libpq-events.c
pqexpbuffer.c
pqsignal.c
postgresql-9.2.2/src/backend/libpq
md5.c
ip.c
postgresql-9.2.2/src/backend/utils/mb
wchar.c
encnames.c
postgresql-9.2.2/src/port
chklocale.c
inet_net_ntop.c
noblock.c
pgstrcasecmp.c
thread.c
Project➡TARGETS➡Build Setting➡Search Paths➡User Header Search Pathsに以下のパスを追加
$(SRCROOT)/postgresql-9.2.2/src/
non-recursiveをrecursineにして再帰的にする。User Header Search Pathsのところをクリックしてたら出てくるよ。

pq_Prefix.pchに以下の1行を追加します。

#define FRONTEND 1

ユニバーサルバイナリの作成

上のツールバーのProduct➡Edit Schemeで構成をReleaseにしてDeviceとSimulatorの両方でビルド(Run)

psqlv9プロジェクトフォルダ内でターミナルから以下のコマンドを実行してユニバーサルバイナリを作成
lipo -create /Users/自分のユーザ名/Library/Developer/Xcode/DerivedData/作成したプロダクト名(psqlv9)-長い英文字列/Build/Products/Release-iphoneos/libpsqlv9.a /Users/自分のユーザ名/Library/Developer/Xcode/DerivedData/作成したプロダクト名(psqlv9)-長い英文字列/Build/Products/Release-iphonesimulator/libpsqlv9.a  -output libpsql.a

自分は特に他の設定はいじってないのでデフォルトの状態です。Productの.aファイルを確認したらどこに作成されているかは分かると思います。おそらく作成場所も指定もできるはずなので分かる人は好き勝手にやってください。

これでライブラリ作成は終了!

では使ってみよう! 適当に新しいプロジェクト作って先ほど作成したlibpsql.aを追加しFrameworksフォルダに入れておく、 ProjectのTARGETSのBuild Phasesタブを選択、Link Binary With Librariesにlibpsql.aがあるか確認

postgresql-9.2.2/src/interfaces/libpq/libpq-fe.h
postgresql-9.2.2/src/include/postgres_ext.h
を追加し、この二つのヘッダーファイルを忘れずimportする。

2012年11月13日火曜日

postgres

データベースの一覧を見る

postgres=# \l

データベースの作成

postgres=# create database testdb;

文字コードを指定する場合

postgres=# create database testdb2 encoding 'utf8';

データベースの削除

postgres=# drop database testdb;

Tigervnc Server

tigervnc-server

tigervnc-severインストール

# yum install tigervnc-server

VNCの設定ファイル

場所 /etc/sysconfig/vncservers

VNCSERVERS=”2:myusername”
 -ログインする事ができるユーザを設定,番号はディスプレイ番号.
-geometry 800×600
 -画面解像度の設定.
-nolisten tcp
 -TCPプロトコルを使用したVNCサーバへの接続を禁止.
-localhost
 -セキュアトンネルを利用していない接続禁止.localhost以外からの接続を禁止.

VNCポート番号

場所 /etc/services
5900番台を使用
以下を追加
tigervnc 5901/tcp # tigervnc-server
tigervnc 5901/udp   # tigervnc-server

ポート解放

ポート5901を開放
場所 /etc/sysconfig/iptables
以下を追加
-A INPUT -m state --state NEW -m tcp -p tcp --dport 5901 -j ACCEPT
-A INPUT -m state --state NEW -m udp -p udp --dport 5901 -j ACCEPT

VNC接続のパスワードを設定

# su - myusername $ vncpasswd

VNCサーバの停止

$ vncserver -kill :1 Killing Xvnc process ID 3464

参考ページ

EzXNetwork http://ezxnet.com/server/entry2091/