2015年1月16日金曜日

【補足あり】JavaCVでPixel操作サンプル

さて、昨日つくった環境で
http://blogger.shase.info/2015/01/javacv.html
公式のサンプル(といっても結局c++なんだけど…)っぽいことをしてみる。

https://code.google.com/p/javacv/wiki/OpenCV2_Cookbook_Examples_Chapter_2#Accessing_Pixel_Values
ここにある、Accessing Pixel Values ってやつ。

元画像


加工後















コード
package hoge;

import org.junit.Test;

import static org.bytedeco.javacpp.opencv_core.*;
import static org.bytedeco.javacpp.opencv_imgproc.*;
import static org.bytedeco.javacpp.opencv_highgui.*;

public class HogeTest {

 @Test
 public void test1() {

  IplImage image = cvLoadImage("abc.jpg");
  CvMat cvMat = new CvMat();
  cvGetMat(image, cvMat);

  int div = 100;
  int nbElements = cvMat.rows() * cvMat.cols() * cvMat.channels();
  for (int i = 0; i < nbElements; i++) {
   double v = (int) cvMat.get(i);
   double newV = v / div * div + div / 2;
   cvMat.put(i, newV);
  }

  IplImage image2 = new IplImage(cvMat);
  cvSaveImage("abc2.jpg", image2);
  cvReleaseImage(image);
 }
}

CvMatのgetとputがduplicatedってどーゆーことー ?_?


【補足】
get,putの代わりにcvGet2Dとか、cvSet2Dとかあるのでこれでよいですね。
と、ここまで、やって、OpenCV使うにしてもJavaCVいろいろ微妙なんじゃないかな、と思い始めた俺ががいる。

MacOSでJavaCVが動かなくて悲しい思いをした

環境は、Mac OS

OpenCVやりたいー。
Javaだから、JavaCV使って見ようと思って、pom.xmlに追加するじゃないですか。

https://github.com/bytedeco/javacv

  <dependency>
    <groupId>org.bytedeco</groupId>
    <artifactId>javacv</artifactId>
    <version>0.10</version>
  </dependency>

公式サイトの通り。
で、公式サイトの通りテストプログラムを書いてみる。


import org.junit.Test;

import static org.bytedeco.javacpp.opencv_core.*;
import static org.bytedeco.javacpp.opencv_imgproc.*;
import static org.bytedeco.javacpp.opencv_highgui.*;

public class HogeTest {

  @Test
  public void test1() {

    IplImage image = cvLoadImage("/Users/hoge.jpg");
    if (image != null) {
      cvSmooth(image, image);
      cvSaveImage("/Users/hoge2.jpg", image);
      cvReleaseImage(image);
    }
  }

}

でもこんなエラーになるわけです。
java.lang.UnsatisfiedLinkError: no jniopencv_core in java.library.path
  at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1860)
  at java.lang.Runtime.loadLibrary0(Runtime.java:845)
  at java.lang.System.loadLibrary(System.java:1084)
  at org.bytedeco.javacpp.Loader.loadLibrary(Loader.java:535)
  at org.bytedeco.javacpp.Loader.load(Loader.java:410)
  at org.bytedeco.javacpp.Loader.load(Loader.java:353)
  at org.bytedeco.javacpp.opencv_core.(opencv_core.java:10)
  at java.lang.Class.forName0(Native Method)
  at java.lang.Class.forName(Class.java:264)
  at org.bytedeco.javacpp.Loader.load(Loader.java:385)
  at org.bytedeco.javacpp.Loader.load(Loader.java:353)
  at org.bytedeco.javacpp.opencv_highgui.(opencv_highgui.java:13)
  at jp.co.cyberagent.dokusho.service.HogeTest.test1(HogeTest.java:17)
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  at java.lang.reflect.Method.invoke(Method.java:601)
  at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
  at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
  at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
  at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
  at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
  at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
  at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
  at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
  at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
  at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
  at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
  at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
  at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
  at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: java.lang.UnsatisfiedLinkError: no opencv_core in java.library.path
  at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1860)
  at java.lang.Runtime.loadLibrary0(Runtime.java:845)
  at java.lang.System.loadLibrary(System.java:1084)
  at org.bytedeco.javacpp.Loader.loadLibrary(Loader.java:535)
  at org.bytedeco.javacpp.Loader.load(Loader.java:401)
  ... 31 more

悲しい。 結論から言うと、コイツ、いろんなjarが足りないらしい。ひどい! で、それらの足りないものを補ってくれるものが公開されてます。

ずばりここに書いてあった。

Making Computer Vision actually work
http://marellbox.marell.se/?p=687

で、書いてある回避用リポジトリをpom.xmlに追加すると動いたー。


<dependency>
    <groupid>org.bytedeco</groupid>
    <artifactid>javacv</artifactid>
    <version>0.10</version>
 </dependency>
 <dependency>
     <groupid>se.marell</groupid>
     <artifactid>opencv-macosx-x86_64</artifactid>
     <version>2.4.10-0.10</version>
     <scope>runtime</scope>
 </dependency>
 ...
 <repository>
   <id>marell</id>
   <url>http://marell.se/nexus/content/repositories/releases/</url>
 </repository>

( ´ー`)フゥー...

2015年1月14日水曜日

JavaでVarnish用のHttpMethod BANを発行してみる

いわゆる独自メソッドを定義したいという話。

やりたいことは、

curl -X BAN http://localhost/hogehoge

これ。

Javaでやると、こんなんなった。

最初SpringのrestTemplateで考えていたんだけど、これ独自メソッドにどうやってやるんやろ?ってしばらく悩んだ結果、諦めてApacheのHttpClientにしてみた。。。

2015年1月10日土曜日

rbenvでruby2系の環境をつくる

CentOS 6系で試したメモ


#事前に入れておく
yum install -y git gcc openssl-devel

#rbenvを拾ってくる
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv

# pathを通す
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile

#上記の読み込み
exec $SHELL -l

#rbenvの動作確認
rbenv -v

#ruby-buildの導入
git clone https://github.com/sstephenson/ruby-build.git~/.rbenv/plugins/ruby-build

cd ~/.rbenv/plugins/ruby-build

#install 可能リスト
rbenv install --list

#2.1.2のinstall
rbenv install -v 2.1.2

#再読み込み
rbenv rehash

#設定
rbenv global 2.1.2

#確認
ruby -v

2015年1月9日金曜日

Sinatraでechoサーバー

rubyが入ってるmacにて。

sinatraのinnstall

gem install sinatra --no-ri --no-rdoc -V

echo.rb


require 'sinatra'
get '/hoge' do
                  http_headers = request.env.select { |k, v| k.start_with?('HTTP_') }
                   p "#{http_headers}" 

起動コマンド

ruby -rubygems ./echo.rb -o 127.0.0.1 -p 10000 &

動作確認 

http://127.0.0.1:10000/hogeにGETでアクセス

sinatraの仕様はこちらを参考にしました
http://qiita.com/mechamogera/items/9c620155e669b394d513

5分でできますね。(^^)

2015年1月6日火曜日

Macで、apache + phpの環境をつくる

MacPortsでちょーざっくり

phpとapacheとhandler入れる


sudo port install php53 apache2
sudo port install php53-apache2handler

他必要なものがあったら入れる
(sudo port list php53-* ででてくるものとか)

apacheにモジュール読み込ませる


cd /opt/local/apache2/modules
sudo /opt/local/apache2/bin/apxs -a -e -n php5 mod_php53.so

httpd.confに追加

#phpのtypeを追加
AddType application/x-httpd-php .php
Include conf/extra/httpd-vhosts.conf
Include conf/extra/mod_php53.conf
DirectoryIndex index.html index.php


httpd-vhosts.confに最低限の設定を

<VirtualHost *:80>
    DocumentRoot "/opt/local/apache2/htdocs"
    ServerName localhost
</VirtualHost>

php.iniを環境にあわせて編集


sudo ln /opt/local/bin/php53 /opt/local/bin/php
sudo cp /opt/local/etc/php53/php.ini-development /opt/local/etc/php53/php.ini
sudo vim /opt/local/etc/php53/php.ini

適当に 


apache起動


sudo /opt/local/apache2/bin/apachectl start

動作確認

sudo vim /opt/local/apache2/htdocs/info.php
$ cat /opt/local/apache2/htdocs/info.php
<?php
  phpinfo();
?>
ブラウザで、 http://localhost/info.php



2015年1月5日月曜日

PHPはじめてなJava屋のチートシート


コメント

  • /
  • /** ~ */


メソッド

  • private メソッドの名前
    • アンダースコアからのキャメル
    • ex) _buildHoge() { }

演算子

  • ::(ダブルコロン)
    • static,定数,オーバーライドしたクラスのプロパティやメソッドに対してアクセス
  • ->(アロー演算子)
    • オブジェクトのメンバにアクセス 
    • ex) $this->(メソッド) // 自クラスのメソッド、変数にアクセス
  • ===(厳密な比較)
  • .(文字列結合)
  • .= (文字列結合代入)
    • $hoge = "aaa";$hoge .= "bbb!"; // $hoge は、"aaabbb" となる

モジュール

  • defined()
    • 指定した定数が存在しているかの確認
    • ex)bool defined ( string $name )
    • 定義するのは、define("A_B_C","className");

TIPS

  • フィールドへのアクセス等は$this->
    • private $_hoge = '';
    • $this->_hoge = "aaa";
    • とか
  • new クラス名してないのになんか使われてるっぽい
    • new ReflectionClass(クラス名)になってた
  • error_log() : 標準のエラーログ関数
    • ドコに吐かれるかは、php.iniで定義



参考にしてみたもの

Zend Framework PHP 標準コーディング規約
http://framework.zend.com/manual/1.12/ja/coding-standard.html

ほかGoogle先生