デジカメで自炊する。しかもMacOS-Xで。

(2013/08/14)
 この間、物は試しとKobo Gloを買ってみた。コミックを読むにはツラいが、文字ベースの小説などを読むには遜色ない。E-Inkなのでバッテリーも持つしね。んで、肝心の中身だが、青空文庫なんかはそのまま読めばいい。文庫本は・・そのまま読めばいいでしょ、KoboGloより軽いんだし。自炊とかめんどくさーい。と今まで思っていたんだが、自炊する意味も色々出てきた。1つには文庫本でも終わり近くなると、2冊持ち歩かないと続けて読めない。KoboGloに入れてしまえば本の数は気にならない。それともう一つ。文庫じゃない本の扱いだ。ハードカバーの本は重いので持ち歩きたくない。すると積み上げてある本から、次何を読もうかなと思った時に文庫本を選んでしまい、ハードカバーの本は積み上がってゆく・・。これをなんとかしたい!。これが始まり。

 次に、自炊をするとなると、scansnapとアマゾン限定裁断機のセットが定番。でもやはり、収納が邪魔っていうのと、本をぶった切るのに抵抗が・・。蔵書を全部電子化!などと言う目的ではないので、お手軽にデジタルカメラで撮影しデジタル処理で電子ブックへと。取り込むのに時間がかかる物の、小一時間で終わるならそれはそれで有りなのでは?。とな。

 そこで、デジカメで非破壊自炊するために、MacOS-Xで動くアプリを探したがないっぽい。余白を消したりはあるみたいなんだけどなー。さ、無い物は作るか。と。

デジカメで撮ってみる

とりあえず、デジカメで何枚か撮ってサンプルを作る。

透明なアクリル板で挟んで撮影した。ネタは銀河鉄道の夜。著作権切れてるから載せても平気なはず。カメラはリコーGXRにカールツァイスイエナのフレクトゴンに偏光フィルターを付けて撮ってる。解像度は3Mピクセル。モノクロモードで撮影。要は300万画素のマクロ機能付きデジタルカメラってこと。偏光フィルターを付けているのは蛍光灯の反射がうざいから。ライティングまでちゃんとやると規模がデカくなる。

デジタル処理

 ここから、デジタル処理をしていくが著しく準備が・・。Macの環境は現在MountainLionなのでMacOS-X10.8.4。ハードはMacBookAir。標準環境だけではどうにもならないので、事前準備が必要となる。rubyとruby-opencvをメインにしているがそれを使うにはかなりの準備が必要になる。XCode4,Homebrew,git,opencv,ImageMagickなどである。

インストール方法は
こちらへ。

そして、ruby-opencvを使うための参考資料をまとめておく。なぜならば、全くドキュメントがないから。。
ser1zw's blogruby-opencvの作者のページ
opencv.jpOpenCVの日本のページ、C/C++などのサンプルがあるので、どんなことができるか分かる。
GitHubのruby-opencvのページ要するにめんどくさくなったらソースコードを見るのが早いと。。exampleとtestの中に大体の物を使ったサンプルがあるのでこれでなんとかなる。そこに出ていないものや引き数が分からない物は直接ソースコードを見る。ext/opencvの中がソースコードなので、その中を検索すれば何とかなる。

画像を回転する

見ての通り左が頭になっているのに右に90℃回転する必要がある。MacOS-Xにはsipsっていうイメージプロセッシングコマンドラインツールが入ってる。これを使って右回転する。
Terminalを開いて、コマンドラインで操作する。

 macbookair$ > sips -r 90 small_org.jpg

これだけ。Rubyで使うには

#!/usr/bin/env ruby
filename=ARGV[0]
`sips -r 90 #{filename}`

こんな風にRubyからも普通に外部のコマンドを呼び出せる。一括処理する場合にはRuby経由でやる。

結果はこんな感じ。縦になったと。

本の四角を抜き出して保存する

OpenCVで矩形を検出して、切り抜いて保存する。文字も認識してしまうので、幅と高さが画像サイズの80%を超えるものを本の枠とする。しきい値なんかを調整してうまく識別出来る値を探す。検出にはOpenCVのcannyでエッジ抽出する。以下のソースは抽出エリアを描画するためにrectangleで書いているが、実際の処理ではいらない。

#!/usr/bin/env ruby
#

require "rubygems"
require "opencv"
require "pp"
include OpenCV

cvmat = OpenCV::CvMat.load(ARGV[0])
cvmat = cvmat.BGR2GRAY
#.threshold(200, 255, CV_ADAPTIVE_THRESH_MEAN_C)

canny = cvmat.canny(160, 200)
contour = canny.find_contours(:mode => OpenCV::CV_RETR_LIST, 
                              :method => OpenCV::CV_CHAIN_APPROX_SIMPLE)

crop_box=nil;
while contour
  unless contour.hole?
    box = contour.bounding_rect
    if(box.top_right.x-box.top_left.x > cvmat.width*0.8 &&
         box.bottom_right.y-box.top_right.y > cvmat.height*0.8)
      cvmat.rectangle! box.top_left, box.bottom_right, :color => OpenCV::CvColor::Gray, :thickness => 2
      crop_box= box;
      p "detect"
    end
  end
  contour = contour.h_next
end 
cvmat.save_image("detect.jpg")

#end of file

 このグレーの部分が認識されたエリア。色々処理するとこの矩形エリアの座標が取れる。写真を撮る時には機械的に撮りたいので、イチイチぴったり合っている必要は無いようにしたいよね。

切り出す

 後は、そのエリアを抜き出す。電子書籍で見た時には余白は無駄なのでなるべく無い方が良い。傾いた残りの黒い部分があまり出ているのも嫌なので、5%ほど小さいエリアを切り抜くことにする。

#!/usr/bin/env ruby
#

require "rubygems"
require "opencv"
require "pp"
include OpenCV

cvmat = OpenCV::CvMat.load(ARGV[0])
cvmat = cvmat.BGR2GRAY
#.threshold(200, 255, CV_ADAPTIVE_THRESH_MEAN_C)

canny = cvmat.canny(160, 200)
contour = canny.find_contours(:mode => OpenCV::CV_RETR_LIST, 
                              :method => OpenCV::CV_CHAIN_APPROX_SIMPLE)

crop_box=nil;
while contour
  unless contour.hole?
    box = contour.bounding_rect
    if(box.top_right.x-box.top_left.x > cvmat.width*0.8 &&
         box.bottom_right.y-box.top_right.y > cvmat.height*0.8)
      cvmat.rectangle! box.top_left, box.bottom_right, :color => OpenCV::CvColor::Gray, :thickness => 2
      crop_box= box;
      p "detect"
    end
  end
  contour = contour.h_next
end 

#
#IplImage
#
img = OpenCV::IplImage.load(ARGV[0])
#
# cropping
#
w=crop_box.top_right.x-crop_box.top_left.x;
h=crop_box.bottom_left.y-crop_box.top_left.y
x=crop_box.top_left.x + w*0.05;
y=crop_box.top_left.y + h*0.05;
w=w*0.9
h=h*0.9
img.set_roi(OpenCV::CvRect.new(x,y,w,h))

img.save_image("cut.jpg")

#end of file

ちょっと左に寄りすぎた。この辺は本に寄るので微調整かな。

デジタル処理まとめ

 ここまで、適当にやってみたけど、まぁ読めないことは・・・。どうだろう、読めないことないけど、読もうという気が起きないね。上が今回取り込んだヤツ。下がTextファイル。

 OpenCVでは出来ることと出来ないことがある。まず、画像の歪みだが、傾きはOpenCVのhough_lineを使って直線検出し、角度を出せばばアフィン変換すれば補正できる。アフィン変換では回転と拡大縮小が出来る。あとシアーね、平行につぶすヤツ。これしかできない。つまり、台形になっちゃったりした物の4点を延ばして長方形にすることは出来ない。自由変形できるのは3点の三角形まで。なので、写真を撮る時はアクリル板できっちりおして平らにした方が良い。OpenGLを使えばテクスチャマッピングができるので4点の自由変形も出来るんだけどね。2次元のアフィン変換でやろうとすると、細かい3角形にわけてそれぞれ歪み補正して貼付けて、とメンドクサイのだ。以前ちらっと仕事でやったんだ・・・。丸1週間かかったよ。まぁアフィン変換そのものも作ってたからという話もあるけど。何にせよ入力時に綺麗になっているにこしたことは無い。

 次に、裏写りと文字の欠け。ピントを合わせたいのでF5.6くらいまで絞り込んでいたんだが、夜の蛍光灯では暗すぎてコントラストが出ない。もっと明るいところで撮影するか、何かしらコントラストを上げる工夫が必要になる。OpenCvでコントラストを上げてしまっても良いのだが、元々のコントラストが低いので、自炊の度に微調整が必要になる。また、無理矢理明るくしているので、裏写りがしてしまってる。カメラのコントラストを上げて撮るなり、撮影時の対策も必要。でも、これだけ気をつければデジカメでの自炊は可能かと。

 ということで、その辺に気をつけて再び撮影。フラッシュを使ってみたがアクリルに反射しちゃってだめ。なのでコントラストとシャープネスをマックスにして撮影。ライティングはシーリングのみ。

多少はコントラストが上がってる。それに同じ処理を入れてみるとこうなる↓。あんまり変わらないか。左端切れちゃったね。

この画像を更にしきい値200でそれ以下は黒、それ以上は白とばっさりと切って白黒にした画像。小説なんかはこれで良いね。

そいつを、KoboGloに入れてみる。

ルビまでばっちり!。グレースケールでも白黒でも遜色なく読める。これくらいのコントラストがあればコミックもいけると思う。

残っている課題

デジカメ自炊用折り畳み式ブックスキャンスタンド (Retractable Book Scan Stand for degital camera)

(2013.08.15)
 なげータイトルだが、上記デジタル処理の実験から、土台はしっかりしてないと、(今のところ)修正できない歪みが発生しそうなので、そこそこ丈夫な台が必要なことがわかった。また、平らにおいて撮影するよりも、90度程度の角度にして開いて撮影した方が付け根の平ら度が上がる。この辺はググってみればわかるけど、非破壊自炊の人は大体こういう結論に達している。平面に置いて、アクリルで無理矢理押さえ込むと、ノリが剥げて裁断したのと変わらなくなりそうなのである。

 んで、せっかくだから折り畳みにしたい。色々スケッチして設計し、材料を買いに行く。木製だが全部切ってもらうのでドライバーとカッターさえあれば作れる。

 どん!。完成。

設計図から組み立て方法まで公開しようと思ったんだが、蝶番の厚み分だけ現物合わせになってしまったので、公開は断念。材料費は全部でネジ類が700円、板が800円で1500円くらい。本当は黒い化粧板を切ってもらおうと思ったんだが、黒い板が売って無かった。仕方なくシナ材の9mm合板を使用することにした。エッジ抽出するのに、本とスタンドのコントラストが大きい方が良いのでバックは黒く塗った。塗ったんだけど・・ダイソーで黒い画用紙を買ってきて張った方が綺麗なので、上から張った。3枚で100円だった。本が乗る部分は縦220mm、横150mmで文庫本からA5の単行本サイズまで対応可能。雑誌は無理、まぁ雑誌をわざわざ自炊はしないでしょ。

 折り畳むと、こんな感じ。

折り畳んだ時の幅が220mm,長さが約30mmなので、カラーボックスに収納できるかな?。畳んで、アクリル板と一緒にしておけば必要な時だけ出してきてスキャンできる。

撮り慣れていないのもあるが、300ページの文庫本で取り込み完了まで大体1時間くらいだった。2mmのアクリル板を使ったんだけど、もうちょっと厚みがあった方が良い。2mmだと押し付けると歪んでしまう。

デジタル処理その2

(2013.08.16)
 少しプログラムを改善しよう。ソフトウェアの出来如何で、デジカメでの撮影に気を使う度合いが変わる。

矩形切り抜きでの文字掛け対策

 前回デカい矩形を検出して、余白を切り取る方法だと、ぎりぎりの場合に切れてしまっていた。↓これ。

そこで、少し抽出方法を変えた。小さいブロックを認識させて、それを含む矩形を抽出し、少し広げる方法をとる。そもそも本の余白はコンテンツではないので、文字だけ認識すればよいのだ。長くなりすぎるので関数部分だけ抽出するが、抽出した矩形を、色々フィルタリングして、max_rectで全部を含む大きい矩形を求める。それに対して、3%ほど広げて少し余白をつくってやる。

def rect_max cvmat
  canny = cvmat.canny(160, 200)
  contour = canny.find_contours(:mode => OpenCV::CV_RETR_LIST, 
                                :method => OpenCV::CV_CHAIN_APPROX_SIMPLE)
#  pp cvmat.methods
  crop_box=nil;
  while contour
    unless contour.hole?
      box = contour.bounding_rect
      if(box.top_right.x-box.top_left.x < cvmat.width*0.8 &&
           box.bottom_right.y-box.top_right.y < cvmat.height*0.8 &&
           box.top_right.x-box.top_left.x > cvmat.width*0.01 &&
           box.bottom_right.y-box.top_right.y > cvmat.height*0.01 &&
           box.top_left.x > cvmat.width*0.05 &&
           box.top_left.y > cvmat.height*0.05 &&
           box.bottom_right.x < cvmat.width*0.95 && 
           box.bottom_right.y < cvmat.height*0.95 &&
           box.width < box.height * 1.3 &&
           box.width > box.height * 0.7
           )
        if(crop_box!=nil)
          crop_box = CvRect.max_rect(crop_box,box);
        else
          crop_box = box;
        end
  cvmat.rectangle! box.top_left, box.bottom_right, :color => OpenCV::CvColor::Gray, :thickness => 2
      end
    end
    contour = contour.h_next
  end 
  cvmat.rectangle! crop_box.top_left, crop_box.bottom_right, :color => OpenCV::CvColor::Gray, :thickness => 2

  return CvRect.new(crop_box.top_left.x - crop_box.width* 0.03, 
                    crop_box.top_left.y - crop_box.height* 0.03,
                    crop_box.width*1.06,
                    crop_box.height*1.06)
end

上の画像のグレーの四角くくくられている部分が、認識した文字。結講適当な感じだけど、大きい矩形にしちゃえば問題ない。これを元に切り抜いたのが次の画像。

こうすると、前に切れてた部分もちゃんと見れるようになる。余白の左右上下も揃う。いい感じ。と思ったんだけど、挿絵だけとか真ん中にちょっとしかない物とかほとんど画像がなくなってしまう。仕方ないので、切り取りサイズがオリジナルの半分以下だった場合は前のアルゴリズムに切り替わるようにした。左に傾いてるのはバグ付きの傾き補正が効いちゃったせい。

傾き補正

 とりあえず、傾き補正を作る。OpenCVに直線検出があるので、その結果から傾きを補正する。アフィン変換が使えるので自由回転は出来る。直線検出はHough変換っていうのが実装されているらしい。また関数だけだが、これで傾きを抽出する。このソースだとちょっとバグがある。横向きの補正しかできない。縦にすると45度の範囲に入らないので補正できない。

def get_degree2 cvmat
  cvmat = cvmat.canny(190, 200);
  seq = cvmat.hough_lines(CV_HOUGH_PROBABILISTIC, 1, Math::PI / 180, 50, 50, 200);
  sum=0;
  count=0;
  seq.each{ |points|
    cvmat.line!(points[0],points[1], :color => OpenCV::CvColor::Gray, :thickness => 2);

    x= 90-Math.atan2((points[1].x-points[0].x),(points[1].y-points[0].y)) / Math::PI * 180;
    p sprintf("x:%s y:%s d:%s",(points[1].x-points[0].x),(points[1].y-points[0].y),x);
    if(x < 45 && x > 0)
      sum=sum+x;
      count=count+1;
    end
  }
  cvmat.save_image("line.jpg")
  return sum/count;
end

こんな感じで、直線を抽出できる。すると傾きが得られるので適当に平均して回す。回すのは普通にアフィン変換を使用する。rubu-opencvではwarp_affineというなのメソッドで実装されている。ワープ?、なんでここだけワープって付いてるんだろう、まぁいいけど。

degree =  get_degree2(cvmat)

center = CvPoint2D32f.new(cvmat.width/2,cvmat.height/2);
mat1 = CvMat.rotation_matrix2D(center, degree, 1.0)
cvmat = cvmat.warp_affine(mat1)

左が元画像、右が今までの処理+傾き補正したもの。この画像はコンパクトデジカメでフラッシュを炊いて手持ちで撮ったもの。それでもこれだけの精度で抽出できるようになった。フラッシュが反射して真ん中のところ白飛びしてるけどね。フラッシュの前にトレーシングペーパーを挟めばこの反射はなくなるかな。そういう手もある。前の画像のようにミラーレス一眼やマクロレンズを使わなくても何とかなりそう。日中に撮るなりすればもっと楽かもしれない。

ここまでの成果のフルソース。20130816_ebook.rb。そのままじゃ使い物にならないが、サンプルコードとして誰かの役に立つかもしれない。

自動レベル調整

 写真毎にコントラストが異なってて閾値を調整しなきゃいけない問題に対する対策だが。OpenCVにも自動ヒストグラム調整があるのだが、ruby-opencvに現在のところ実装されていない。Preview.appにあるので、こいつをコマンドラインで動かせないかと思ったがだめで、マカー定番のAutomatorでも自動レベル調整はできない。うーん。。opencvがはいっているのだしC言語で単機能アプリを作ろうかとも思ったのだが、もうHomeBrew入れてしまっているのだしUNIXツール群を入れてしまえば良いだろうと、ImageMagickをインストールしてしまった。その中にあるconvertというコマンドに--auto-level引き数を付けてやると自動レベル調整が出来る。簡単だな。標準で入れてくれないかな・・・。これを入れてしまうと回転もこれでできちゃうんだけどな。

Cocoaアプリにする。

(2013.08.17)
 結局、GUIがないと不便なのでGUIを付けようと色々GUIツールを見てみた。まずRuby-Cocoaが使えないかと、試してみたのだが、どうにもXCode4.6でib_outletの接続が出来ない。次にCocoaアプリからはLaunchだけすればいいやとRuby/Tkを試してみたんだが、OS-Xには標準では添付されていなかった。Ruby-Cocoaのソース見てもObjective-Cとの混在している感じでRubyっぽさは少ない。であればC言語系列のObjective-CでGUIだけ作って外部プログラムを呼び出した方が楽だなと、結局Objective-CでCocoaプログラミング。うーん、Objective-C簡単だねぇ。でも直ぐ忘れるんだよね。Cocoa-Javaで2つ3つアプリを作ったことあるけど、もう忘れちゃったもんね。

 ということで、シンプルな1枚ウィンドウで作ってみた。

当然、このアプリだけじゃほとんど役立たず。ライブラリなんかも一緒に配布する方法もあるんだよな確か。。。

ダウンロード

一応ここまでの成果として置いておく。なげー名前にしちゃったなぁ。

EBookUtilsForDigitalCamera-1.0b1.dmg

注意など:IntelMac 64bitのみ。MacOS-Xのバージョンは10.6以降でビルドしてある。このアプリだけダウンロードしても動くのは一括ファイル名変更のみ。全部動かすには、ここに書いてあるライブラリ群全部入れないとだめ。

改造方法

基本的にほとんどがRubyなので、アプリを右クリック→パッケージの内容を表示→Contents/Resounces/の中にあるdetect.rbがすべてなので、これをいじればOK。コメントはほとんど入ってない。UIを改造したいって人は連絡くれればプロジェクトごとあげる。ちゃんと作ろうぜって協力してくれる奇特な人が居るならgithubにいれてもいいかな。↓のツイートで連絡とれるハズ。

VersionUp!(その1)

(2013.09.01)
しばらく使ってみての課題。

こんな感じか?。kpub化とかはAozoraEpub3が優秀なので、そっちを使う。でもwindowsで作っているらしく、エンコーディングがutf-8のzipファイルを読ませようとすると例外発生しちゃうんだよね。なのでascii文字列のフォルダ名とファイル名しか使えないという・・。

ImageMagickを内包する

ImageMagickはApache2ライセンスで、そのライセンスの提示と、ImageMagickが含まれていることを書いておけばOK?。ってことになってるような。ということで、ImageMagickをここから取ってきて。ビルドする。

$>cd ImageMagick-6.8.6-9
$>./configure --without-freetype --disable-shared --without-png --without-bzlib --without-zlib --without-xml --without-x  LDFLAGS="-L../jpeg-8d/.libs/"

$>make

普通にconfigureかけたらHomeBrewのfreetypeなどなどを参照しに行って仕舞ったのでjpeg以外全部オフ。更にこのままだとダイナミックリンクライブラリになって、配布は面倒なので、それぞれのコマンドラインツールが独立して動くようにしたい。ってことで、共有ライブラリを作らずにスタティックリンクするように--disable-sharedオプションを付けてmake。結果、convertコマンドが大体5MB。リンクされてるっぽい。こいつをアプリのフォルダにコピーしてNSBandleクラスでパスを取得し動かすと。
おっと、libjpegも最初から入ってるわけじゃないのか。じゃlibjpegもビルドして、LDFLAGSを追加。これでローカルなスタティックライブラリ見に行くんだっけかな。。libjpegは最新はversion9なんだけど、homebrewでインストールされた物はversion8なので8に合わせた。ここでpngを切っちゃったからjpegオンリー仕様になってしまう。まぁいいか。

OpenCVを内包する

これは簡単だった。OpenCV/OpenCV 2.4.6.1 Framework for Mac OS Xにpatchが置いてあって、そのまま動かせばframeworkが出来上がった。patch・・久しぶりに使ったよ。。

ruby-opencvを内包する

ruby-opencvのソースをここから取ってきて、ビルドする。opencv本体は同じディレクトリにある。つまり今こういう状態。

$>ls
EBookApp
ImageMagick-6.8.6-9
ImageMagick-6.8.6-9.tar.gz
jpeg-8d
jpegsrc.v8d.tar.gz
opencv_2.4.6
ruby-opencv-master
ruby-opencv-master.zip
$>cd ruby-opencv/ext/opencv
$>ruby extconf.rb --with-opencv_dir=../../../opencv_2.4.6/opencv-2.4.6/
$> make

うーん。with-opencv_dirで指定したところをみにいくのか。このままだとcontents/resource/の下にopencv.bundleが入ることになるので、アプリと同じディレクトリにあるopencv_2.4.6/opencv-2.4.6のlibを見に行ってしまう。でアプリの中のopencvのディレクトリは、contents/frameworks/opencv2.frameworkになるので、えーと。

$>ruby extconf.rb --with-opencv_dir=../Frameworks/opencv2.framework

これで、リンクされるようにしなきゃいけないのか。で?更に、Librariesじゃなくてlibを見に行っちゃうので、シンボリックリンクを張らなきゃ行けないのか。著しくメンドクサイ・・・。んー。。。メンドクサイ。バイナリを書き換えてしまおう。opencv.bundleを開いて。@loader_path/Libraries/を@executable_path/../Frameworks/opencv2.frameworkに書き換えればOKかな?。エディタで無理矢理開いて置換。エラーが出やがった。。SUM値とか入れてやがるのかな。と調べたら、install_name_toolってのでpathを変えられるらしい。なんだかな・・なんかシステムとして今ひとつな気がするんだが・・。まぁいいや動けば。

ってことで、変更するためのスクリプトを作る。

#!/bin/sh
#
install_name_tool -change @loader_path/Libraries/libopencv_nonfree.dylib @executable_path/../Frameworks/opencv2.framework/Libraries/libopencv_nonfree.dylib ./ruby-opencv-master/ext/opencv/opencv.bundle
install_name_tool -change @loader_path/Libraries/libopencv_photo.dylib @executable_path/../Frameworks/opencv2.framework/Libraries/libopencv_photo.dylib ./ruby-opencv-master/ext/opencv/opencv.bundle
install_name_tool -change @loader_path/Libraries/libopencv_video.dylib @executable_path/../Frameworks/opencv2.framework/Libraries/libopencv_video.dylib ./ruby-opencv-master/ext/opencv/opencv.bundle
install_name_tool -change @loader_path/Libraries/libopencv_objdetect.dylib @executable_path/../Frameworks/opencv2.framework/Libraries/libopencv_objdetect.dylib ./ruby-opencv-master/ext/opencv/opencv.bundle
install_name_tool -change @loader_path/Libraries/libopencv_ml.dylib @executable_path/../Frameworks/opencv2.framework/Libraries/libopencv_ml.dylib ./ruby-opencv-master/ext/opencv/opencv.bundle
install_name_tool -change @loader_path/Libraries/libopencv_legacy.dylib @executable_path/../Frameworks/opencv2.framework/Libraries/libopencv_legacy.dylib ./ruby-opencv-master/ext/opencv/opencv.bundle
install_name_tool -change @loader_path/Libraries/libopencv_imgproc.dylib @executable_path/../Frameworks/opencv2.framework/Libraries/libopencv_imgproc.dylib ./ruby-opencv-master/ext/opencv/opencv.bundle
install_name_tool -change @loader_path/Libraries/libopencv_highgui.dylib @executable_path/../Frameworks/opencv2.framework/Libraries/libopencv_highgui.dylib ./ruby-opencv-master/ext/opencv/opencv.bundle
install_name_tool -change @loader_path/Libraries/libopencv_gpu.dylib @executable_path/../Frameworks/opencv2.framework/Libraries/libopencv_gpu.dylib ./ruby-opencv-master/ext/opencv/opencv.bundle
install_name_tool -change @loader_path/Libraries/libopencv_flann.dylib @executable_path/../Frameworks/opencv2.framework/Libraries/libopencv_flann.dylib ./ruby-opencv-master/ext/opencv/opencv.bundle
install_name_tool -change @loader_path/Libraries/libopencv_features2d.dylib @executable_path/../Frameworks/opencv2.framework/Libraries/libopencv_features2d.dylib ./ruby-opencv-master/ext/opencv/opencv.bundle
install_name_tool -change @loader_path/Libraries/libopencv_core.dylib @executable_path/../Frameworks/opencv2.framework/Libraries/libopencv_core.dylib ./ruby-opencv-master/ext/opencv/opencv.bundle
install_name_tool -change @loader_path/Libraries/libopencv_contrib.dylib @executable_path/../Frameworks/opencv2.framework/Libraries/libopencv_contrib.dylib ./ruby-opencv-master/ext/opencv/opencv.bundle
install_name_tool -change @loader_path/Libraries/libopencv_calib3d.dylib @executable_path/../Frameworks/opencv2.framework/Libraries/libopencv_calib3d.dylib ./ruby-opencv-master/ext/opencv/opencv.bundle

 さーどうよ。ダメカー。何か勘違いしてるっぽい。。ググった結果。bundleからは@executable_pathはダメで@loader_pathを使うそうな。最初からそうなってるじゃねーか。と、試しに、@loadear_path以降を/Libraries/libopencv_xxxじゃなくてちゃんと/../Framekwors/opencv2.framwkork/libopencv_xxxに変えてみたら。動いた!。

ということで、本当はこう。

install_name_tool -change @loader_path/Libraries/libopencv_nonfree.dylib @loader_path/../Frameworks/opencv2.framework/Libraries/libopencv_nonfree.dylib ./ruby-opencv-master/ext/opencv/opencv.bundle
install_name_tool -change @loader_path/Libraries/libopencv_photo.dylib @loader_path/../Frameworks/opencv2.framework/Libraries/libopencv_photo.dylib ./ruby-opencv-master/ext/opencv/opencv.bundle
install_name_tool -change @loader_path/Libraries/libopencv_video.dylib @loader_path/../Frameworks/opencv2.framework/Libraries/libopencv_video.dylib ./ruby-opencv-master/ext/opencv/opencv.bundle
install_name_tool -change @loader_path/Libraries/libopencv_objdetect.dylib @loader_path/../Frameworks/opencv2.framework/Libraries/libopencv_objdetect.dylib ./ruby-opencv-master/ext/opencv/opencv.bundle
install_name_tool -change @loader_path/Libraries/libopencv_ml.dylib @loader_path/../Frameworks/opencv2.framework/Libraries/libopencv_ml.dylib ./ruby-opencv-master/ext/opencv/opencv.bundle
install_name_tool -change @loader_path/Libraries/libopencv_legacy.dylib @loader_path/../Frameworks/opencv2.framework/Libraries/libopencv_legacy.dylib ./ruby-opencv-master/ext/opencv/opencv.bundle
install_name_tool -change @loader_path/Libraries/libopencv_imgproc.dylib @loader_path/../Frameworks/opencv2.framework/Libraries/libopencv_imgproc.dylib ./ruby-opencv-master/ext/opencv/opencv.bundle
install_name_tool -change @loader_path/Libraries/libopencv_highgui.dylib @loader_path/../Frameworks/opencv2.framework/Libraries/libopencv_highgui.dylib ./ruby-opencv-master/ext/opencv/opencv.bundle
install_name_tool -change @loader_path/Libraries/libopencv_gpu.dylib @loader_path/../Frameworks/opencv2.framework/Libraries/libopencv_gpu.dylib ./ruby-opencv-master/ext/opencv/opencv.bundle
install_name_tool -change @loader_path/Libraries/libopencv_flann.dylib @loader_path/../Frameworks/opencv2.framework/Libraries/libopencv_flann.dylib ./ruby-opencv-master/ext/opencv/opencv.bundle
install_name_tool -change @loader_path/Libraries/libopencv_features2d.dylib @loader_path/../Frameworks/opencv2.framework/Libraries/libopencv_features2d.dylib ./ruby-opencv-master/ext/opencv/opencv.bundle
install_name_tool -change @loader_path/Libraries/libopencv_core.dylib @loader_path/../Frameworks/opencv2.framework/Libraries/libopencv_core.dylib ./ruby-opencv-master/ext/opencv/opencv.bundle
install_name_tool -change @loader_path/Libraries/libopencv_contrib.dylib @loader_path/../Frameworks/opencv2.framework/Libraries/libopencv_contrib.dylib ./ruby-opencv-master/ext/opencv/opencv.bundle
install_name_tool -change @loader_path/Libraries/libopencv_calib3d.dylib @loader_path/../Frameworks/opencv2.framework/Libraries/libopencv_calib3d.dylib ./ruby-opencv-master/ext/opencv/opencv.bundle

やっと、単体アプリで動くようになった。9.1にやり始めてこれだけで1週間かかった。。今2013.09.07。ネットに情報が無いものをやると時間かかるね・・。

リサイズする

デジカメで3Mピクセルくらいで撮って加工しているので、2456x1359とか様々なサイズになってしまう。また、大きいままではcbzやepubにした時に無駄に容量食って仕舞うので、全部加工が終わったら端末(俺の場合Kobo glo)に合わせてリサイズする。これは簡単でImageMagickのconvertコマンドで一発で出来る。

$>convert book-0016.jpg -resize 754x1024 -size 754x1024 xc:white +swap -gravity center -composite book-0004.jpg

こんな感じで、スケーリングするサイズとバックのサイズをして貼付ければ縦横比をそのままにサイズを揃えられる。

ダウンロード(v1.0b2)

EBookUtilsForDigitalCamera-1.0b2.dmg

今回の改善点は、 ・単体で動くのでxcodeやHomwBrewのインストールをは必要なくなった。 ・処理後リサイズができるようになった。

MacOS-X 10.9でうごかない

(2013.11.24)
ちっちっち。Marverickにしたらうごかねぇ。orz。logにクラッシュレポートが出てるな・・。なんじゃこりゃ。ruby2.0になったのが問題っぽいな。そうか、rubyを使うとこうなるのか。ruby1.9も内包してしまうか?。いやバカらしいな。ネイティブで書くか。

 しかも・・、XCodeが5.0.xに変わってやがるし、Homebrewはそんなコンパイラ知らんとか言ってやがるし。うーん。電子書籍元年はどこ言ったおい!。

前へ戻る