simplestarの技術ブログ

目的を書いて、思想と試行、結果と考察、そして具体的な手段を記録します。

Direct Method:またCVネタのメモ

SVO という技術をご存知でしょうか?
www.youtube.com

去年の SSII 2015 のチュートリアルによると SVO は近年CV研究界(一般人は簡単に踏み込めないので、どこぞの異界を想像して良いかも)で関心が高まってきているとのこと。
確かに Direct Method を使った SVO の論文の被引用件数はすごい勢いで伸びていた。

Direct Method はよく Feature Based Method と対比されます。
手法としては KLT に似ていて、ルーツをたどると1999年ころに論文がある。
3D座標が同じなら輝度も同じだろうという強い仮定のもと、拘束式をならべて画像のマッチングやカメラの位置・姿勢推定を行う手法。
画像全体の画素で拘束式を立てて、解くことから
画像全体の画素を直接使う、ゆえに Direct Method と呼ばれるわけ。

OpenCV にも Direct Method サポートしてないかなと調べてみたら
OpenCV: Image Registration
これかな?
サンプルを動かしたという記事を今、探しています。

先にドキュメントを読みましたが、使い方としては
Mapper なるものがあるので、そこに画像を2枚渡して、ここにある Map オブジェクトを得ます。
あとは Map オブジェクトからシフト量を求めるだけとな
Mapper には Pyramid 対応もある(Coarse-to-Fine処理のこと)

画像処理メモ

画像処理の顔検出技術において
高速化するうえで便利な技法に積分画像というものが知られています。

Haar-like 特徴量とかSURFというこれまた有名な局所特徴量記述形式などにも利用され
コンピュータビジョンを仕事にしている人で、知らない人はいないほど(趣味でやっている人は知らないかも)

何がうれしいって
例えば画像の平均輝度を計算したいとき、すべての画素の値を参照して合計輝度値を出し、合計ピクセル数で割ればよいではないですか
でも、もし画像領域を十字の境界線を引いて4等分に割って、それぞれの領域の平均輝度を計算したいときがあった場合
もう一回、すべての画素値を参照して計算します?
なんだか無駄に計算時間を使っていそうですね

そう

この処理、積分画像を使うととても少ない計算量で同じ答えが出せるようになります。

どうやってやるか、理解するかはここが参考になります。

Webcam画像を表示

EWCLIBヘルプ
というものを使いました。

下記コード(これだけではビルドが通りませんが…)の要領で Webcam 画像を表示してみました。

// OpenCVCameraViewer.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//

#include "stdafx.h"
/**
* @file Threshold.cpp
* @brief Sample code that shows how to use the diverse threshold options offered by OpenCV
* @author OpenCV team
*/

#include "opencv2/highgui/highgui.hpp"
#include "ewclib/ewclib.h"

using namespace cv;
const char* window_name = "Threshold Demo";

/**
* @function main
*/
int main(int, char** argv)
{
	EWC_Open(0, 640, 480, 60);
	EWC_Run(0);
	void* pBuffer = nullptr;
	namedWindow(window_name, WINDOW_AUTOSIZE);
	EWC_GetBuffer(0, &pBuffer);

	Mat dst = Mat(480, 640, CV_8UC4, pBuffer);
	while (true)
	{
		imshow(window_name, dst);

		int c;
		c = waitKey(20);
		if ((char)c == 27)
		{
			break;
		}
	}

	destroyWindow(window_name);
	EWC_Close(0);
}

Visual Studio 2015 でビルドしようとすると qedit.h が足りないと怒られたので、次の記事を参考に解決してみました。
失った時を数えて: #include "qedit.h"におけるエラーの解決方法

実行すると Webcam の映像がウィンドウに表示されます。


この ewclib の中を勉強してみたいと思います。
f:id:simplestar_tech:20160719002833j:plain

OpenCVをインストール

一番新しい OpenCV をもらってきます。

DOWNLOADS | OpenCV

このリンクから OpenCV 3.1 をインストールしました。

次のインストール先のサンプルコードを実行します。
opencv-3.1.0\sources\samples\cpp\tutorial_code\ImgProc

おお、スライダーコントロールで値を変更しながら、結果を確認できるのですね。
C++から直接たたくOpenCVはしばらく触ってませんでしたが
いつのまにか入門者にとって手に取りやすく、コーディングもテストも便利になった感じです。

Threshold を 108 にしたときの lena.png の結果を添付します。

f:id:simplestar_tech:20160717123204j:plain

UnrealEngine4.12をソースコードからVisualStudio2013でビルドする

Epic Gamesのアカウントで次のアドレスに入ったら
https://www.unrealengine.com/dashboard

ソースコードを取得する項目を見つけました。
f:id:simplestar_tech:20160705081425j:plain

GitHub アカウントを作成して、アカウント名をプロフィールに記載することで
Unreal Engineリポジトリアクセス権関連の招待メールが届きました。

招待に応じると、Unreal Engineソースコードにアクセスできるようになりました。
f:id:simplestar_tech:20160705081739j:plain

ここからはビルドするだけです。

GitHubの使い方?
Visual StudioC++ プロジェクトのコンパイルエラー、リンクエラーの解決方法?

はい、詳細を記載していきます。
会社から戻ったらね。

追記;
すまない、その後
Visual Studio 2015 で事足りることがわかったので、追記はやめることにしました。

あと、この記事に興味ある人は
GitHubの使い方を覚えたり
Visual StudioC++ プロジェクトのコンパイルエラー、リンクエラーの解決なんて
自力で調べればすぐですよ。
ということで、次の作業メモ書いていきます。

UnrealEngine4.12をVisualStudio2013で起動する方法

いや、おかしいよ。
何もしなくてもビルドと実行ができるはずなのに(←勘違いでした。)

error LNK2019: unresolved external symbol
という、リンクエラーが発生して先に進めません。

同じような苦しみを味わっている人が数日から数時間前にフォーラムに書き込んでいます。

Log in to your Epic Games account
Log in to your Epic Games account

今のところ回答が付いていません…新参者が行うおバカな質問と解釈されているのか、無視されている感じですね。

そこでだ、検証をしてみることにした。
例えば、Unreal Engine 4.10.2 とかで同じ操作をやったとき何が起きるのかを見てみる。

追記:
ほぅ?
つまり Visual Studio 2015 じゃないとダメ?
f:id:simplestar_tech:20160704221943j:plain

Unreal Engine 4.9.2 を入れて試してみます。

追記:
インストール中に調べてたら、公式回答を見つけました。
UE4 and Visual Studio 2015
Unreal Engine 4.10 からは Visual Studio 2015 でないとプロジェクトのコンパイルは通らないそうです。
どうしても Visual Studio 2013 を使いたい方は Unreal Engine のソースを引いてきて、Visual Studio 2013 を使ってビルドしてください。
とのことです。

はい、確かに Unreal Engine 4.9.2 ならば Visual Studio 2013 でC++プロジェクトを起動できました。
まじか、最新版の Unreal Engine を使いたいならソースからビルドする必要があるのかぁ

次はその記事を書きますか

UnrealEngine4でUTexture2Dをシステムメモリから更新する

まず Unreal Engine 4 ではマテリアルに適用するテクスチャは UTexture2D というものだそうです。(調べただけでまだ触っていない)
基本的にはGPU側で超並列演算を行うもののようですが、特別にシステムメモリのbyte配列からテクスチャの内容を更新するUpdateTextureRegions関数が定義されています。(正しく動くかは知らない、調べただけ)

関連して C++ から WebCam にシンプルにアクセスするには
www.iki.fi/sol - Code - ESCAPI
が知られていて、ライセンスフリーでカメラの解像度を決定できて
各種カメラパラメータを手動 or オートで切り替えられつつ、サンプル時におそらく argb の int 値配列を返すもののようです。(日本語が変でごめん、情報が正しく伝わればよいので、書き換えず、そのままにしてます。)

escapi は IMFSourceReaderというDirectShowの後継を利用していて、ソースも公開されていて、そのバッファを書き込んでいるコードを見ると
https://github.com/jarikomppa/escapi/blob/master/escapi_dll/capture.cpp
どうも、一段不要かもしれない for 文を回して書き込みを行っている箇所があったので
各自、ここを独自に高速化するように書き換えてカメラ画像情報を受け取れるようにすると良さそう。

あとはこれらの知識をつないで、Unreal Engine にて簡易に画像ビューア、コンピュータビジョンを用いたゲームを組めます。

実際に動かしてみないと、調査内容は信用できないので、実際に動いたら追記します。
という、ただの個人メモ