Hatena::ブログ(Diary)

alt-ctrl-today このページをアンテナに追加 RSSフィード Twitter

March 21(Fri), 2014

Pythonはじめました。

はじめに

プライベートでPythonを始めました。

仕事などで必要になったわけでもないので、C/C++なみのことができるようになればOKというザックリした目標です。

文字列処理やネットワークデータベースGUI、、色々な分野がありますが、遊んでて楽しいのはOpenCVKinectなので、そこらへんから着手しようと思い、OpenCVプログラムをつくり始めました。

手始めに、何か動かしたいと思い、特徴点でマッチングするプログラムを作ります。

動かした

詠み人知らずの備忘録さんのプログラムを改造して、WEBカメラから使えるようにしました。

特徴点はSURF以外も使えるようにしています。

D

プログラム

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


#/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((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]))
      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

May 25(Sat), 2013

Jason Saragih氏のFaceTracker使ってみた。

久しぶりのブログ更新。。

derivecvさんの記事を見て、Jason Saragih氏のソースを勝手に自分でビルドしたら、簡単に動きましたのでご報告。

Visual Studioでソースをビルド。静的ライブラリにして、それを利用するサンプルアプリを作成。

f:id:alt-native:20130525122844p:image

ちょっと使った印象では、かなり癖があります。

誤検出が少なくないですが、トラッキング性能はかなり高い。QVGAで試しましたが、顔が小さく映っていても検出・トラッキングを継続できるのは「お得」。CPU負荷はIntel 2.67GHz CPU+シングルスレッドで150-200msくらい、ふつうのPCからするとかなり軽い。

ただ、フレームスピードが遅いとトラッキング性能が下がるので、注意が必要。

D

動作環境は以下。

December 31(Mon), 2012

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

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

f:id:alt-native:20121230140423j:image

パフォーマンスと見た目

さすが美しさと高機能が身上の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は私のように指が太い人間には優しくないのですが、購入を検討されている方は店頭でよく触っておくことをお勧めします。

f:id:alt-native:20121230052900j:image

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

まとめ

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