15

Python 2.7 および openCV 2.4.11 を使用して、dsift を介して取得した顔の特徴の輪郭に沿ってランドマークを追跡しようとしています。フレーム間でこれらの機能を追跡したい。

ただし、次のエラーが表示されます。入力画像が 1 チャンネルの等次元 (および符号なし 8 ビット型) であることを確認しました。同様に、前のポイント:

OpenCV Error: Assertion failed ((npoints = prevPtsMat.checkVector(2, CV_32F, tru
e)) >= 0) in cv::calcOpticalFlowPyrLK, file ..\..\..\modules\video\src\lkpyramid.cpp
cv2.error: ..\..\..\modules\video\src\lkpyramid.cpp:845: error: (-215) (npoints
= prevPtsMat.checkVector(2, CV_32F, true)) >= 0 in function cv::calcOpticalFlowP
yrLK

問題を引き起こしている行:

new_pts, ttl, err = cv2.calcOpticalFlowPyrLK(self.old_img, i_img, i_old_pts, None)

これのデバッグを開始できる場所を誰か知っていますか?

4

3 に答える 3

34

オプティカルフローベースの追跡を行ったときに同じ問題が発生しました。これを解決するために、さまざまな方法を試しました。しかし無駄に。

最後に、shi-tomsi コーナー ポイント検出を使用して追跡するサンプル プログラムがあり、それらのポイントが LK アルゴリズムで使用され、完全に機能しました。そこで、Shi-Tomsi 検出器の出力のデータ型と次元を調査し、追跡するポイントが同じ型であることを確認しました。起きた!

知っておくべきことは次のとおりです。

  • 画像がグレースケールであることを確認してください。
  • i_old_pts である座標パラメーターは、float32 を意味する単精度浮動小数点でなければなりません。このタイプは、numpy で使用できます。Pythonのフロートはfloat64です
  • 座標パラメーター i_old_pts (プログラムから) は、次元 (n,1,2) の numpy 配列である必要があります。ここで、n はポイントの数を表します。

これはうまくいくはずです。

于 2016-05-12T04:15:26.527 に答える