jediによるpythonコード補完 with Emacs on Windows
線分と平面の交点を求める
線分の両端点(a, b)と平面の法線ベクトル(nv)と平面上の任意の点(p)から、線分と平面の交点を求めるC++のプログラム。
線分abと平面の交点が線分abを内分する点となることから交点の座標を計算する。
#include <iostream> #include <opencv2/opencv.hpp> #include <opencv2/highgui/highgui.hpp> #include <string> using namespace std; cv::Mat Intersect3D( cv::Mat& nv, // 平面の法線ベクトル cv::Mat(3,1) cv::Mat& p, // 平面上の任意の1点 cv::Mat(3,1) cv::Mat& a, // 線分の端点 cv::Mat(3,1) cv::Mat& b // 線分の端点 cv::Mat(3,1) ){ // 返り値 cv::Mat ret = (cv::Mat_<double>(3,1) << 0,0,0); // ベクトルの準備 cv::Mat pa, pb; // p->a, p->bのベクトル pa = a - p; pb = b - p; // 内積計算 double dot_a = pa.dot(nv); // paベクトルと法線ベクトルの内積 double dot_b = pb.dot(nv); // pbベクトルと法線ベクトルの内積 // 内積が0の場合交点がなく、直線が平面に含まれる double MIN_DOT_TH = 0.000001; if( fabs(dot_a) < MIN_DOT_TH ){dot_a = 0;} if( fabs(dot_b) < MIN_DOT_TH ){dot_b = 0;} // 交点なし if( dot_a==0 && dot_b==0){ return ret; // [0,0,0]'で返す } // 交点なし if( dot_a*dot_b > 0 ){ return ret; // [0,0,0]'で返す } // 交点あり cv::Mat ab = b - a; double ratio = fabs(dot_a) / (fabs(dot_a) + fabs(dot_b) ); ret = a + ab * (ratio); return ret; // 計算結果を返す } int main(int argc, char *argv[]){ cv::Mat a = (cv::Mat_<double>(3,1) << 0,0, 0); // 端点1 cv::Mat b = (cv::Mat_<double>(3,1) << 2,2,-2); // 端点2 cv::Mat p = (cv::Mat_<double>(3,1) << 0,0,-1); // 平面上の点 cv::Mat nv = (cv::Mat_<double>(3,1) << 0,0, 1); // 法線ベクトル cv::Mat c = Intersect3D(nv, p, a, b); // 交点 cout << "result: " << c << endl; return 0; }
LabelingクラスをOpenCVで利用
学生時代にも一度お世話になったラベリングクラスhttp://imura-lab.org/products/labeling/を久々に使いました。
OpenCVで使える関数を作ったのでメモ。
2値化が大津の手法なので、琵琶湖の画像にしてみました。
素敵な写真はこちらから使わせていただきました。綺麗ですね。
https://www.itoen.co.jp/itoen-motherlake/photocontest.html
RANSACで多項式推定
RANdom SAmple Consensus:RANSACは、外乱を含む観測値から数学的モデルのパラメタを推定する手法のひとつである。インターネットで調べれば文献が出てくるが、サンプルプログラムを調べてみるとOpenCVのHomography行列の推定か直線の推定がおおいので、多項式の推定をしてみた。
選ばれたinlierから再度パラメタを最小二乗法で推定するべきだが、今回はまだ実装していない。https://github.com/thinkbell/ransac_cubic_equation
Amazon DriveでMacの写真のバックアップ
はじめに
自分はMacの「写真app」を使って写真を管理し、これをiPhoneと同期させて出先で見たり見せたりしている。
そろそろクラウド上にバックアップを取ろうと思い、Amazon Driveを使うことにした。
Amazon Drive
Amazon Driveとは、Amazonが運営するクラウド上のストレージサービスである。
https://www.amazon.co.jp/clouddrive/home
Amazon prime会員用のサービスで、prime会員ならすぐにAmazon Driveを使うことができる。
写真データのみ容量無制限で利用可能らしいので、他のサービス(Google, Drop boxなど)と比較することなくこれに決めた。
写真のバックアップをとる
今回Amazon Driveを使う目的はただ一つ、万が一HDDが壊れたときのために写真のバックアップをクラウド上にとっておくこと。
そのため、管理しやすさとか見易さはほとんど気にしない。ただ、クラウド上にデータが存在していればいい。
Amazon Driveのクライアントソフトをインストールする。クラウドと共有にするディレクトリはどこでもいい。
メニューバーに新しく加わった雲マークを選択し、ファイルのアップロードを選ぶ。
そして、「写真 Library」の中の「Thumbnails」ディレクトリをぶち込む。
Amazon Driveのウィンドウからだと「写真 Library」そのものを選ぶことができない && それより先のディレクトリに入れなかったので、
ln -s ~/Picture/写真\ Library.photoslibrary/Thumbnails ~/Thumbnails
などとシンボリックリンクを作成し、Amazon Driveから選択できるようにした。
この中にはサムネイル画像とか顔認識用途の画像がたくさん入っているようだが、そんなことはどうでもいい。
(本当は「写真 Library」の中のどこがバックアップすべきファイルなのか調べたいけど、面倒なのでやっていない)
数万個のファイルが同期されるのを待つだけである。
2万枚……すまん、Amazon。
# 追記
しかしこれ、同じファイルをもう一度アップロードするとどうなるんだろう。
上書きされるならいいけど、名前の違う同じ内容ファイルが重複したらめんどくさいな。
視差画像とV-disparity
背景
ステレオ視差画像から平面を抽出する一つの手法として、視差画像をV-disparity画像に変換するというものがある。今回は視差画像からV-disparity画像への変換の練習をしてみる。
V-disparity画像
V-disparity画像とは、視差画像における画像平面上下方向の視差の出現頻度を表した画像である。
実装に沿って表現すると、縦軸が画像と共通(V)で横軸が視差(disparity)からなる画像で、
各画素が「あるVでのある視差値の出現回数」を表している。
同様に、横軸を画像と共通(U)にして縦軸を視差(disparity)としたものをU-disparity画像と呼ぶ。