SYSTEM DEVELOPMENT

STUDY GROUP

PythonとOpenCV の読み書き はじめました pt.002特徴点の抽出

PythonとOpenCV の読み書きシリーズ

第2回

part 001はこちら          part 003はこちら

目標/目的 又はそれらしきもの

  • 大項目 手ブレ補正をやってみる
  • 中項目  今回やること → 特徴点の抽出
  • 小項目  実験するよー

環境

part 001を参照

参考文献

  • 特徴の理解 — OpenCV-Python Tutorials 1 documentation : http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_feature2d/py_features_meaning/py_features_meaning.html#features-meaning
  • OpenCV3とPython3で特徴点を抽出する(AgastFeature, FAST, GFTT, MSER, AKAZE, BRISK, KAZE, ORB, SimpleBlob, SIFT) – Qiita : https://qiita.com/hitomatagi/items/62989573a30ec1d8180b
  • 特徴検出 — opencv 2.2 documentation : http://opencv.jp/opencv-2svn/cpp/feature_detection.html

アウトプット

https://www.youtube.com/watch?v=CdxxnozOaQo&feature=youtu.be

簡単な説明

1フレームごとに「#粒子描画の設定」の段落で、特徴点の抽出~描画。
特徴点の抽出のために、今回はパッとできそうなgoodFeatureToTrack関数を使ってます。
goodFeatureToTrackは、画像中の特徴的なエッジを自動検出します。
他にも手法がいくつもあって、特許絡みとか、検出速度なんかで一長一短有るようです。詳しくは参考文献で。

まとめと雑感

おぉ~、動画の動きにちゃんとついていってる~(*´∀`*)
今回ホワイトボードに描いた点は「きれいな点」ではないので、複数のエッジが検出されているみたいです(;´∀`)

次回の予定

  • オプティカルフロー

ソースコード

import math
import cv2
import numpy as np
import os
fourcc = cv2.VideoWriter_fourcc(*’XVID’)
SKIPFRAMES = 0
RESIZE_RAT=2
ORG_SIZE=[]
if __name__ == ‘__main__’:
tgtdir=’C:\\Users\\Admin\\Downloads’
tgtfile=’VID_20171223_151319.mp4′
FILE_ORG = tgtdir + os.sep + tgtfile
#アウトプットファイル生成
out = cv2.VideoWriter(tgtdir+ os.sep +’output.avi’, fourcc, 30.0, (600,200))
showimage = np.zeros((200,600,3), dtype=np.uint8)
#フレーム読み込み関係の配列準備
cur = np.ndarray([])
cur_gray = np.ndarray([])
prev = np.ndarray([])
prev_gray = np.ndarray([])
has_next = None
cap = cv2.VideoCapture(FILE_ORG)
ORG_SIZE = (int(cap.get(3)),int(cap.get(4)))
#必要であればフレーム読み飛ばし
cap.set(1,SKIPFRAMES)
# 最初のフレーム読み込み
has_next, prev = cap.read()
while(True):
if has_next == False:
break
has_next, crnt = cap.read()
output_img = cv2.warpAffine(crnt, np.float32(T), ORG_SIZE, flags=cv2.INTER_LINEAR)
#粒子描画のための設定
cap_gray = cv2.cvtColor(crnt, cv2.COLOR_RGB2GRAY)
perticle = cv2.goodFeaturesToTrack(cap_gray,10,0.01,10)
crnt_out = crnt.copy()
if len(perticle)>0:
perticle = np.int0(perticle)
for i in perticle:
x,y = i.ravel()
cv2.circle(output_img,(x,y),10,(255,0,0),-1)
#映像出力
showimage[0:200,0:300] = cv2.resize(crnt,(300,200))
if output_img is not None:
showimage[0:200,300:600] = cv2.resize(output_img,(300,200))
out.write(showimage)
#検証用画像出力
if output_img is not None:
cv2.imshow(“frame0”, cv2.resize(showimage,(600,200)))
if cv2.waitKey(1) & 0xFF == ord(‘q’):
break
#cv2.waitKey(0)
prev = crnt
out.release()
pass

menu