Symfoware

Symfowareについての考察blog

OpenCV 2.4.9 + py-opencvで特徴量を算出する

FreeBSD 10にOpenCVをインストールし、顔の検出やキーポイントの検出を行ってみました。

FreeBSD + OpenCV 2.4.9 + py-opencvで顔認識
OpenCV 2.4.9 + py-opencvでキーポイントの検出

今回は特徴量を算出してみます。


cv2.DescriptorExtractor_create



特徴量を計算するクラスはcv2.DescriptorExtractor_createで作成します。


descripter = cv2.DescriptorExtractor_create('名称')




computeメソッドにグレースケールに変換した画像と、
抽出した特異点(キーポイント)を渡すと、
特徴量を計算してくれるようです。


descripter.compute([グレースケール画像], [キーポイント])






cv2.DescriptorMatcher_create



2つの画像の特徴量を算出します。
マッチャーに同じと思われるポイントを見つけてもらいます。


matcher = cv2.DescriptorMatcher_create("BruteForce-Hamming")
matches = matcher.match([画像1の特徴量], [画像2の特徴量])








サンプル



opencv-extract-surf-features-from-user-defined-keypoints
こちらを参考に、サンプルプログラムを作成しました。

使用する画像はこれと

493_01.png


上下を反転させたこの画像です。

493_02.png


scipyをインストールしていない場合は、以下のコマンドでインストールしておきます。


# pkg install py27-scipy




見様見真似で作成したサンプルはこちら。


  1. # -*- coding:utf-8 -*-
  2. import numpy
  3. import cv2
  4. import scipy
  5. image_path_1 = 'miku.png'
  6. image_path_2 = 'miku_turn.png'
  7. # ファイル読み込み
  8. img1 = cv2.imread(image_path_1)
  9. img2 = cv2.imread(image_path_2)
  10. # グレースケール変換
  11. gray1= cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY)
  12. gray2 = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)
  13. # キーポイントの検出
  14. gftt = cv2.FeatureDetector_create("ORB")
  15. keypoints1 = gftt.detect(gray1)
  16. keypoints2 = gftt.detect(gray2)
  17. # いくつキーポイントが見つかったか
  18. print len(keypoints1)
  19. print len(keypoints2)
  20. # 画像データの特徴量
  21. #descripter = cv2.DescriptorExtractor_create("FAST") # NG
  22. #descripter = cv2.DescriptorExtractor_create("STAR") # NG
  23. #descripter = cv2.DescriptorExtractor_create("SIFT") # NG
  24. #descripter = cv2.DescriptorExtractor_create("SURF") # NG
  25. #descripter = cv2.DescriptorExtractor_create("ORB") # OK
  26. #descripter = cv2.DescriptorExtractor_create("BRISK") # OK
  27. #descripter = cv2.DescriptorExtractor_create("MSER") # NG
  28. #descripter = cv2.DescriptorExtractor_create("GFTT") # NG
  29. #descripter = cv2.DescriptorExtractor_create("HARRIS") # NG
  30. #descripter = cv2.DescriptorExtractor_create("Dense") # NG
  31. #descripter = cv2.DescriptorExtractor_create("SimpleBlob") # NG
  32. descripter = cv2.DescriptorExtractor_create("BRISK")
  33. k1,d1 = descripter.compute(gray1, keypoints1)
  34. k2,d2 = descripter.compute(gray2, keypoints2)
  35. # キーの一致度合いを調べる
  36. matcher = cv2.DescriptorMatcher_create("BruteForce-Hamming")
  37. matches = matcher.match(d1, d2)
  38. print '#matches:', len(matches)
  39. dist = [m.distance for m in matches]
  40. print 'distance: min: %.3f' % min(dist)
  41. print 'distance: mean: %.3f' % (sum(dist) / len(dist))
  42. print 'distance: max: %.3f' % max(dist)
  43. # threshold: half the mean
  44. thres_dist = (sum(dist) / len(dist)) * 0.5
  45. # keep only the reasonable matches
  46. sel_matches = [m for m in matches if m.distance < thres_dist]
  47. print '#selected matches:', len(sel_matches)
  48. # #####################################
  49. # visualization
  50. h1, w1 = img1.shape[:2]
  51. h2, w2 = img2.shape[:2]
  52. view = scipy.zeros((max(h1, h2), w1 + w2, 3), scipy.uint8)
  53. view[:h1, :w1, 0] = gray1
  54. view[:h2, w1:, 0] = gray2
  55. view[:, :, 1] = view[:, :, 0]
  56. view[:, :, 2] = view[:, :, 0]
  57. for m in sel_matches:
  58.     # draw the keypoints
  59.     # print m.queryIdx, m.trainIdx, m.distance
  60.     color = tuple([scipy.random.randint(0, 255) for _ in xrange(3)])
  61.     cv2.line(view,
  62.         (int(k1[m.queryIdx].pt[0]), int(k1[m.queryIdx].pt[1])),
  63.         (int(k2[m.trainIdx].pt[0] + w1), int(k2[m.trainIdx].pt[1])),
  64.          color)
  65. cv2.imwrite('result.png', view)




実行結果


# python sample.py
500
500
#matches: 442
distance: min: 3.000
distance: mean: 47.548
distance: max: 189.000
#selected matches: 137




出力された画像がこちらになります。

493_03.png


いい感じで特異点をマッチングしてくれたようです。


関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2014/11/02(日) 12:07:30|
  2. Python
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<OpenCV 2.4.9 使用できるDetector,Extractor,Matcher | ホーム | OpenCV 2.4.9 + py-opencvでキーポイントの検出>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1522-d0c907ef
この記事にトラックバックする(FC2ブログユーザー)