2017年9月27日水曜日

OpencvSharpでパノラマ画像を作成する

OpenCVでC++の場合のサンプルコードは沢山見かけるのですが、
C#版が無かったので投稿します。

Surfとかはライセンスの関係の問題でOpenCVに付属していないようです。
なので代わりにAKAZEを利用しています。

処理速度や特徴点抽出には申し分ないと思うのでコピペ利用でOKだと思います。



void hoge()
{
    var src = new Mat[2];
    var dst = new Mat[2];
    Mat outImg = new Mat();
    KeyPoint[] keypoints1;
    KeyPoint[] keypoints2;
    var descripter1 = new MatOfFloat();
    var descripter2 = new MatOfFloat();
    var result = new Mat();

    src[0] = Cv2.ImRead("2.JPG");
    src[1] = Cv2.ImRead("1.JPG");
    dst[0] = new Mat();
    dst[1] = new Mat();
    Cv2.CvtColor(src[0], dst[0], ColorConversionCodes.BGR2GRAY);
    Cv2.CvtColor(src[1], dst[1], ColorConversionCodes.BGR2GRAY);

    var akaze = AKAZE.Create();
    akaze.DetectAndCompute(dst[0], null, out keypoints1, descripter1);
    akaze.DetectAndCompute(dst[1], null, out keypoints2, descripter2);

    var matcher = new BFMatcher();
    var matches = matcher.Match(descripter1, descripter2);

    Cv2.DrawMatches(src[0], keypoints1, src[1], keypoints2, matches, outImg);

    using (new Window("OutImg", outImg))
    {
        Cv2.WaitKey();
    }

    //画像合体
    var size = matches.Length;
    var getPoints1 = new Vec2f[size];
    var getPoints2 = new Vec2f[size];

    for (var a = 0; a < size; a++)
    {
        var pt1 = keypoints1[matches[a].QueryIdx].Pt;
        var pt2 = keypoints2[matches[a].TrainIdx].Pt;
        getPoints1[a][0] = pt1.X;
        getPoints1[a][1] = pt1.Y;
        getPoints2[a][0] = pt2.X;
        getPoints2[a][1] = pt2.Y;
        Debug.WriteLine($"{pt2.X - pt1.X}, {pt2.Y - pt1.Y}");
    }

    var hom = Cv2.FindHomography(InputArray.Create(getPoints1), InputArray.Create(getPoints2), HomographyMethods.Ransac);

    Cv2.WarpPerspective(src[0], result, hom, new Size(src[0].Cols * 2.0, src[0].Rows * 2.0));
    for (int y = 0; y < src[0].Rows; y++)
    {
        for (int x = 0; x < src[0].Cols; x++)
        {
            result.Set(y, x, src[1].At<Vec3b>(y, x));
        }
    }

    using (new Window("result", result))
    {
        Cv2.WaitKey();
    }
}

2017年9月25日月曜日

TinkerBoardでリモートデスクトップxrdpを使う

RaspberryPi感覚でインストールして使ってみると
ログイン画面は出てくるけどその後は真っ青で何も進まない経験をしたのではないでしょうか。

それは必要なパッケージが入ってないだけで、解決する方法があります。

以下のコマンドを入力してくださいw

$ sudo apt-get install xorgxrdp xrdp -y

はい、これでおk

Tinkerboardでorable jdk8をインストールする。

openjdkがとても遅いのでOracleのJDKをインストールしました。

やっぱ本家は早いね!
JAVA使いならぜひインストールした方がいいと思います。

インストールの方法ですが、自前で設定する感じです。(めんどくさいですが、、

Step1ダウンロード
http://www.oracle.com/technetwork/java/javase/downloads/index.html

上記サイトからArm-32bit版のSDKをダウンロードしてください。


Step2.解凍する
$ tar zxvf  dk-8u144-linux-arm32-vfp-hflt.tar.gz


Step3.フォルダ移動
$ sudo mv ./jdk1.8.0_144 /usr/lib/jvm/jdk1.8.0


Step4.設定する
$ sudo update-alternatives --install "/usr/bin/java" "java" "/usr/lib/jvm/jdk1.8.0/bin/java" 1
$ sudo update-alternatives --install "/usr/bin/javac" "javac" "/usr/lib/jvm/jdk1.8.0/bin/javac" 1
$ sudo update-alternatives --config java

自分で打ちこんだ項目が一番下にあるので番号で指定する。


Step5.確認
$ java --version

これで1.8.0ってバージョンが表示されていればおk。

お疲れ様です。

2017年9月24日日曜日

TinkerBoardを買ってみた

総論からすると、
LXDEデスクトップの仕上がりが
RaspberryPiみたいなPIXEL風に見た目良くなるのを待ってもいいのかなー。

ラズパイのデスクトップを見てしまうと、あれ以上のクウォリディーが欲しくなってしまいますw

インストールの仕方ですが
準備編
・電源は最低5V3A必須。
・初期設定はHDMIディスプレイ上で行う。
・SSH、Vimは最初からインストール済みなので安心してOK

設定編
https://tinkerboarding.co.uk/forum/thread-69.html

①上記サイトからOSイメージをダウンロードしてSDカードにイメージ展開する。
②Wifiとかネットワークの設定を済ませたら
 $ sudo Passwd linaro でパスワード設定。

③別PCからSSHログイン。
 ユーザ名はlinaro

これでいけました。(V2.0.1時点)

今後のアップデートでRpi用タッチスクリーンやカメラに対応するそうです。

試しに繋げてみたけど動かなかっただけで、壊れはしませんでしたw

2017年9月22日金曜日

[Rpi]PlantUMLServerをインストールする。

PlantUML公式ページにWEBで出力してくれるけど、やっぱ自前サーバーでやりたいって人向けの情報です。
設定は簡単だけど、どこにも載ってないので備忘録を残しておきます。

$ sudo apt-get install -y graphviz maven
$ git clone https://github.com/plantuml/plantuml-server
$ vim ~/.bashrc
---
$GRAPHVIZ_DOT="/usr/bin/dot"
---
最後の行に挿入

$ source ~/.bashrc
$ mvn jetty:run -Djetty.port=1001

http://address:1001/

最初エラー画面が出るけど、下のURLをクリックすると表示する。

2017年9月11日月曜日

[UWP]2017年版UWPアプリを作る時に覚えておくこと

.Net Core 2.0や .Net standard 2.0が登場して間もない時期ですが、
ようやく下位互換になった!
というか
ようやく置いてけぼり感を食らっていたユーザーに光が差し込まれました。

UWPアプリで書くTaskや新しいインターフェイスを書かずとも

今まで通りの感覚でプログラムが書けます!

( ˘ω˘ )

2017年秋から本格的にUWPアプリを書き始めてみようかなと思いました。

まず今までと違うところが1つあって、
無い!って思ったライブラリ関係は
全部Nugetで追加していかないといけません。

その代名詞になるのが、シリアルポートでしょうか。

それにUWPのUIって全部XAMLで書かないといけないのかって
悩ましい問題も実はテンプレート関係が揃ってるライブラリもNugetにあります。

今までモノシックに出来上がったライブラリが
分割できる特殊パーツはNugetにしようって流れですね。

Nugetに何があるか分からないけど 視点を変えて、

無いものはまずWEBでNugetライブラリ検索しよう

という新しいスタイルをもって開発した方がよさそうです。

まずは簡単に必要最小限に必要な知識としては、
プログラムを全部ライブラリ化して、
UI部分をXamarinやWinform、UWPなどいろんなプラットフォームに合わせて作成する感じですね。

ということで、

ライブラリは.Net Standard 2.0で作る
 これ重要。



ついでにプライベートレポジトリを作っておくと便利なので、

Nugetパッケージを作る
・コマンドラインを開き、.slnファイルのある場所でdotnet pack



ハード制御したいよっという場合は、

シリアルポートを使う
・nugetで Ststem.IO.Portsをインストール



UWPアプリってXAMLタグ打つの大変、、ハンバーガーメニューを一発で使いたい場合は

UWPの画面回りテンプレートを使う
・nuggetで Microsoft.Toolkit.Uwpをインストール  
 サンプルがWEBストアにあって、
 UWP Community Toolkit Sample Appをインストール。
 Microsoft.Toolkit、Microsoft.Toolkit.Servicesこの辺りも使えそう。


ひとまずはこれを知っておけとなんとかなりそうです。

Androider