yucchiy's blog

日々学んだことを書きます

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

regionwidth, 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プロフィール画像を食わせた結果です. うまくハックで来てますね :)

laugh.rb_and_Wunderlist.png

ちなみにデフォルトの学習データでは誤識別をするケースがありますので, アプリケーションによっては, 例えばしきい値となる矩形幅を指定しておいてそれ以下なら処理しない, とか工夫が必要かもしれません.

感想

OpenCVRubyから使えるということでその手軽さが良いなと思いました. しかしまだまだ開発途中なのかAPIが少なく, またドキュメントがほぼない? のでOpenCVの知識と実際のソースを読まないと進められないという難しさは感じました.

参考ページ