Pythonはじめました。

はじめに

プライベートでPythonを始めました。
仕事などで必要になったわけでもないので、C/C++なみのことができるようになればOKというザックリした目標です。
文字列処理やネットワーク、データベース、GUI、、色々な分野がありますが、遊んでて楽しいのはOpenCVKinectなので、そこらへんから着手しようと思い、OpenCVのプログラムをつくり始めました。
手始めに、何か動かしたいと思い、特徴点でマッチングするプログラムを作ります。

動かした

詠み人知らずの備忘録さんのプログラムを改造して、WEBカメラから使えるようにしました。
特徴点はSURF以外も使えるようにしています。

プログラム

ちょっと読みにくいかもしれませんが初心者ということでご容赦ください。
>|python||

#/usr/bin/env python
# TEST 2014.03.21
# ref
# http://authorunknown408.blog.fc2.com/blog-entry-34.html
#

import cv2
import scipy as sp

##------ MAIN PROCEDURE -----
if __name__ == "__main__":
# 2014.03.21 ORB+BRISK is BEST!

# SURF / SIFT / FAST / STAR / Dense / ORB
detectType = "ORB"
detector = cv2.FeatureDetector_create(detectType)
# BRIEF / BRISK / FREAK
descType = "BRISK"
descriptor = cv2.DescriptorExtractor_create(descType)
#------------ INIT TEMPLATE DATA -----------
# load template image
templateImageFilePath = "C:\OpenCV.2.4.4\samples\c\\box.png"
templ = cv2.imread(templateImageFilePath)
templateImg = cv2.cvtColor(templ,cv2.COLOR_BGR2GRAY)
kpTempl = detector.detect(templateImg)
templKeypoints, templDescriptors = descriptor.compute(templateImg, kpTempl)
print ' [TEMPL] kp_num=%d / dsc_num=%d < [%s]' % (len(templKeypoints), len(templDescriptors), templateImageFilePath)
for kpt in templKeypoints:
ct = ( int(kpt.pt[0]), int(kpt.pt[1]))
cv2.circle(templ, ct, int(kpt.size/5), (255,0,0))
cv2.imshow('TEMPLATE',templ)

matcher = cv2.DescriptorMatcher_create("BruteForce-Hamming")

# ------ PREPARE CAMERA --------
capture=cv2.VideoCapture(0)
isopen=capture.isOpened()
if(isopen == False):
print 'ERR: failed to VideoCapture()'
exit()

#------ MAIN ROUTIN start ------
while True:
# CAPTURE (+RESIZE)
ret, frame = capture.read()
if not ret:
print 'ERR: Failed to get capture! ret=%d' % ret
break
capImg = frame
# You have to Use 'capImg' NOT 'frame'.

# extract Features
dbgImg = capImg;
grayImg = cv2.cvtColor(capImg,cv2.COLOR_BGR2GRAY)
capTempl = detector.detect(grayImg)
capKeypoints, capDescriptors = descriptor.compute(grayImg, capTempl)
for kpt in capKeypoints:
ct = ( int(kpt.pt[0]), int(kpt.pt[1]))
cv2.circle(dbgImg, ct, int(kpt.size/5), (255,0,0))
cv2.imshow('IMAGE',dbgImg)

# match Capture and Template
matches = matcher.match(templDescriptors, capDescriptors)
#print '#matches:', len(matches)
dist = [m.distance for m in matches]
thres_dist = (sum(dist) / len(dist)) * 0.5 # threshold: half the mean
sel_matches = [m for m in matches if m.distance < thres_dist] # keep only the reasonable matches
print '#selected matches:', len(sel_matches)

# Visualize
h1, w1 = templateImg.shape[:2]
h2, w2 = grayImg.shape[:2]
viewImg = sp.zeros*1
pt2 = (int(capKeypoints[m.trainIdx].pt[0] + w1), int(capKeypoints[m.trainIdx].pt[1]))
cv2.line(viewImg, pt1, pt2, color)
windowName = "MATCHING: " + detectType + " / " + descType
cv2.imshow(windowName,viewImg)

# HANDLE INPUT
inputkey=cv2.waitKey(30)
if inputkey > 10:
break
#------ MAIN ROUTIN end ------
cv2.destroyAllWindows()
|

環境

Windows 8.1
OpenCV 2.4.4
Python 2.7

*1:max(h1, h2), w1 + w2, 3), sp.uint8) viewImg[:h1, :w1, 0] =templateImg viewImg[:h2, w1:, 0] = grayImg viewImg[:, :, 1] = viewImg[:, :, 0] viewImg[:, :, 2] = viewImg[:, :, 0] for m in sel_matches: # draw the keypoints color = tuple([sp.random.randint(0, 255) for _ in xrange(3)]) pt1 = (int(templKeypoints[m.queryIdx].pt[0]),int(templKeypoints[m.queryIdx].pt[1]

Jason Saragih氏のFaceTracker使ってみた。

久しぶりのブログ更新。。
derivecvさんの記事を見て、Jason Saragih氏のソースを勝手に自分でビルドしたら、簡単に動きましたのでご報告。
Visual Studioでソースをビルド。静的ライブラリにして、それを利用するサンプルアプリを作成。

ちょっと使った印象では、かなり癖があります。
誤検出が少なくないですが、トラッキング性能はかなり高い。QVGAで試しましたが、顔が小さく映っていても検出・トラッキングを継続できるのは「お得」。CPU負荷はIntel 2.67GHz CPU+シングルスレッドで150-200msくらい、ふつうのPCからするとかなり軽い。
ただ、フレームスピードが遅いとトラッキング性能が下がるので、注意が必要。

動作環境は以下。

SONY VAIO Duo 11 レビューしてみた

たまたま正月休みの間に借りることができたので、気取り気味で書き留めておきます。


パフォーマンスと見た目

さすが美しさと高機能が身上のVAIOです。スタイリッシュ。
SSDなので速いんですが、ふだんからSSDのノートPCを使用しているので特に感動はありませんでした。ACアダプタも小さくて持ち運びやすい。
余談ですが、SSDの価格は下落の一途なので、あと数年ですべてのモバイルからHDDは消え、2.5インチ規格も見なくなることでしょう。

ディスプレイ

PC Watchでディスプレイの角度は変更できない点が指摘されていましたたが、傾斜角度は問題ありません。
ディスプレイ表面はフリックしやすい程度の滑りを確保しなかがらも、反射しすぎない光沢になっていて、さすがSONYと思わせます。

タッチパネルとキーボードの併用という提案

これはちょっとした革新です。
従来はキーボードから手を離して、マウスかタッチパッドでヨッコイショってカーソルを移動してたけど、
このVAIOはキーボートとディスプレイが近いので、ちょっと手を挙げてふわっと触るだけでいい。
ウィンドウサイズの調整が感動的にラク
ちなみにキーボードを出した状態で、画面下のWindowsボタンを押すのは至難。QWERTYの左下Winボタンをお勧めします。
スタイラスという選択肢も用意されてますが、まずペンをなくす自信があるので試しもしてません。
mazecというスタイラス手書き文字入力のIMEが常駐してて、キーボードでタイプしてるとこれがポイポイ表示されるのが邪魔。

キーボード

端的にいうとVAIO-Pを彷彿とさせます。
私個人はもともとVAIOのキーボードは合わないのですが、それでもVAIO-Zなどはニヤニヤしながら打っちゃう人です。
でも、これはタイプし始めて15分ですでに手の甲が痛くなっちゃいました。
最初はパームレストがないことが最大の要因だと思ったんですが、それだけかなー?
あと、タイプしてると、トラックポイントのボタンを押してしまい、カーソルが飛ぶ。
親指か人差し指で押すんだから、もっと重くしてもよかったのではないでしょうか。

タッチ操作

これは致命的。
dpiがデカすぎてボタンが小さくなり押せません。
ChromeGoogleのボタンなんてとても押せないので、ショートカットで操作せざるをえませんでした。
IEなら多少なりともマシに使えるがそれでもしんどい。
ブラウジング以外でも基本的にボタンは小さいので、Win8標準の「アプリケーション」以外では使いにくい。
もともとVAIOは私のように指が太い人間には優しくないのですが、購入を検討されている方は店頭でよく触っておくことをお勧めします。

↑この写真も決して遠近感を強調したわけではありません。

まとめ

タッチ操作という最先端のUIのWin8を搭載したPCとしては抜群に洗練されていると思いますが、まだガッツリ使うにはツラいものがあるので、今後改善されることを希望します。

ccmakeのすすめ

Linuxでビルドするときにcmakeを使うことが多くなってきた今節。
ccmakeを使うと楽ちんなので、書き留めておきます。

目的

OpenCVPCLといった大規模ライブラリをビルドするとき、cmakeのオプションが多すぎて面倒。
以下はOpenCV 2.4.3をビルドするときの例。(こちらから拝借)

cmake -DBUILD_DOCS=ON -DBUILD_EXAMPLES=ON -DCMAKE_BUILD_TYPE=RELEASE -DWITH_TBB=ON -DINSTALL_C_EXAMPLES=ON -DWITH_CUDA=OFF -DWITH_OPENNI=ON -DWITH_UNICAP=ON -DWITH_V4L=ON -DWITH_XINE=ON .

これをタイプせずに指定できるようにしたい。

ccmakeを使う

ccmakeをインストールして。

$ sudo apt-get install cmake-curses-gui

対象のディレクトリで1回cmakeたたいてからccmakeする。

$ cmake .
$ ccmake .

すると

EntarキーでON/OFFを切り替えて、cボタンでconfigureして終了。あとはmakeするだけ。
わ〜カンタン。

OpenCV HoGつかってみたよ

OpenCV 2.4.3のHOGDescriptorを使ってみた備忘録。参考にしたソースはお馴染みのpeopledetect.cpp
誤検出は多いが、検出漏れは少ないので扱いやすいなと思ったけど、使う機会がない。
テケトーなローパスフィルタかけてるんで、ちょいちょいな誤検出は描画してない。トラッキングもテケトー。
CPU4コアつかって、VGA処理するのに平均1500msec。HoG重い。
TBBもOpenMPもオフってるのに勝手にマルチスレッドで処理されたのは謎。

  • 環境

OS:Windows 8
マシン:ThinkPad X201
CPU: Intel Core i5 M560
OpenCV: 2.4.3
ビルド: Visual C++ 2010 Express

Kinectマネキンに関する雑感

  • 概要

ユナイテッドアローズが、Kinectを活用したマリオネット・ロボットを設置
この記事が気になったので、渋谷マークシティのUnitedAllowsに行ってきた。



男女のマネキンがKinectでキャプチャしたスケルトンに応じた動作をするアプリケーションです。左右の検出待ち時間(10秒間)→操作(30秒間)を繰り返します。若い男女が盛り上がれそうな感じ。
実際、週末の夕方ということもあり、男女関係なく人垣が絶えることはありませんでした。

  • ハードウェア

マネキンの自由度は少なく、左右手足4箇所が上下するだけですが、手は頭の上まで上がるので見た目は結構ダイナミック。ちゃんと作ってるっぽいのは見た目でわかる。でも剥き出しなのはどうなのか。


  • ソフトウェア

MacでOpenNIを動かしています。2m程度で閾値処理した後、膨張をかけた深度画像にスケルトンを描画しています。
ただ、ローパスフィルタみたいな処理をしていないので、フレーム間で「跳ねる」スケルトン検出に引っ張られている。
足の可動量が少ないのも「跳ね」のせいだと思われる。もったいない。
あとマネキンは左右に回るのに、ヨー軸の身体の向きを反映していない。もったいない。
というわけでソフトはいろいろ改善すべき点が見受けられました。

OpenCV 2.4.3の横顔(?)検出の備忘録

PCLkinfuを試す環境を構築しながらOpenCV2.4.3のChangeLogを見ていたら横顔も検出できるhaar-like識別器が追加されたっぽいことが書かれていたので試した。

光学条件としては画面左に昼光色、右に白色の蛍光灯が点灯している部屋で、その中間くらいで撮影。正面を向くと顔が影になるというややこしい環境。

特定の光学条件では横顔で検出できてる。逆に正面の顔は見つけられない。
Core_i5_M560(2.67GHz)シングルスレッドで、VGA画像1枚あたり2500-3000msecかかる。激重。