CocoaPodsを使ってObjective-Cのライブラリを管理する
最近iOSアプリの開発を始めたので, まずはライブラリ管理周りを調べ始めた. とりあえず一番有名そうなCocoaPadsを使って管理しようと思ったので, メモ代わりにブログ書いてみた.
CocoaPadsとは?
Objective-C向けのバージョン管理ツール. RubyのBundlerのObjective-C版.
CocoaPadsのインストール
CocoaPadsをインストールするには, Rubyがインストールされている必要がある. Mavericks以降だと, デフォルトでRubyの2.0がインストールされているので特に用意するものはない.
以下のコマンドでインストールする. 必要に応じてsudo
を利用する.
sudo gem install cocoapods
これでpod
コマンドがインストールされる.
CocoaPadsでのライブラリ管理
Podfile
というファイルを記述してライブラリ管理を行う.
RubyだとGemfile
で, 記述形式もほとんどGemfile
と一緒.
platform :ios, '8.0' pod 'ObjectiveSugar', '~> 0.5'
1行目でプラットフォームを指定する. 上記の場合はiOSの8.0であることを指定している.
2行目がバージョン管理を行う行で, 上記の場合はObjectiveSugarというライブラリを 0.5以降から2.0以前に制限してインストールすることを表す.
バージョンの制限には以下の方法がある. Gemfile
の記述と同じ.
記述 | 対象バージョン |
---|---|
(記述なし) | 最新版 |
0.5 | 0.5(固定) |
~> 0.5 | 0.5以降1.0以前 |
>= 0.5 | 0.5以降 |
> 0.5 | 0.5より後 |
< 0.5 | 0.5より前 |
<= 0.5 | 0.5以前 |
また, gitのレポジトリを指定することもできる.
pod 'AFNetworking', :git => 'https://github.com/gowalla/AFNetworking.git'
上記の場合は, master
ブランチのheadがインストールされる. ブランチを変更したい場合は以下のようにする.
pod 'AFNetworking', :git => 'https://github.com/gowalla/AFNetworking.git', :branch => 'dev'
タグを指定する場合は以下のようにする.
pod 'AFNetworking', :git => 'https://github.com/gowalla/AFNetworking.git', :tag => '0.7.0'
また, コミットを明示的に指定することもできる.
pod 'AFNetworking', :git => 'https://github.com/gowalla/AFNetworking.git', :commit => '082f8319af'
参考リンク
ruby-opencvを利用して顔検出をする
ちょっとしたことでOpenCVを使いたいなと思って, せっかくなのでrubyからOpenCVを利用できないかなと思って調べてみたらruby-opencvなるものがあったので使ってみた.
動作環境
ruby-opencvのインストール
bundler経由でインストールします.
source 'https://rubygems.org' gem 'ruby-oepncv'
bundle install
とかでインストールできます.
顔検出する
OpenCVにある識別器を用いて顔検出します. 以下のソースコードで実現できます.
detector = CvHaarClassifierCascade::load './haarcascade_frontalface_alt.xml' detector.detect_objects(image).each do |region| # regionに顔として検出した領域の矩形情報が格納されているのでそれを使って色々処理 end
region
はwidth
, heigit
, left_top
, right_bottom
などの変数を持っているので, それを用いて処理をすることになるでしょう.
ちなみに'./haarcascade_frontalface_alt.xml'
は顔検出用の学習データとなりますが, この学習データを変更することで様々なものを識別させることができます.
サンプル
以下は第1引数に与えれた画像から顔検出して, 抽出した領域に笑い男のロゴを貼り付けるサンプルです.
#!/usr/bin/env ruby require 'opencv' include OpenCV if ARGV.size != 1 puts "Usage: ruby #{__FILE__} Image" exit end image = nil image_laugh = nil begin image = IplImage.load ARGV[0], 1 image_laugh = IplImage.load './laugh.png', 1 rescue puts 'Could not open or find the image.' exit end detector = CvHaarClassifierCascade::load './haarcascade_frontalface_alt.xml' detector.detect_objects(image).each do |region| resized_image = image_laugh.resize region image.set_roi region (resized_image.rows * resized_image.cols).times do |i| if resized_image[i][0].to_i > 0 or resized_image[i][1].to_i > 0 or resized_image[i][2].to_i > 0 image[i] = resized_image[i] end image.reset_roi end window = GUI::Window.new('laugh.rb') window.show image GUI::wait_key
実行結果
以下は上記のサンプルに自分のFacebookプロフィール画像を食わせた結果です. うまくハックで来てますね :)
ちなみにデフォルトの学習データでは誤識別をするケースがありますので, アプリケーションによっては, 例えばしきい値となる矩形幅を指定しておいてそれ以下なら処理しない, とか工夫が必要かもしれません.
感想
OpenCVがRubyから使えるということでその手軽さが良いなと思いました. しかしまだまだ開発途中なのかAPIが少なく, またドキュメントがほぼない? のでOpenCVの知識と実際のソースを読まないと進められないという難しさは感じました.
参考ページ
GitのSubmoduleのアップデート
http://rochefort.hatenablog.com/entry/20110410/p1
git submodule foreach 'git checkout master; git pull'
よく忘れるので自分用メモ
ブログ始めました
@yucchiy_ そんなあなたにソリューションです bit.ly/u4UoWU
— ゆううき (@y_uuki_) March 1, 2013