5

使用しようとしていますcv::calcOpticalFlowPyrLKが、その関数の内部アサーションが失敗することがあります。アサーションはnpoints = prevPtsMat.checkVector(2, CV_32F, true)) >= 0です。OpenCV 2.3.1 を使用しています。この関数のソース コードは、こちらから入手できます

特に、コンピューター グラフィックスの経験が限られていることと、コメントが不足していることから、彼らのコードに頭を悩ませるのは難しいことです。このアサーションがトリガーされるのはなぜですか? また、このアサーションは私の問題について何を示していますか?

編集:次のように関数を呼び出します:

cv::calcOpticalFlowPyrLK(curBwFrame, prvFrame, features, newFeatures, trackingStatus, errors);

十分に大きく、有効な画像であると思われる空でないマスクをfeatures呼び出して取得したベクトルには、特徴が含まれていないことがわかりました。cv::goodFeaturesToTrack(curBwFrame, features, 5, 0.2, 0.5, skinMask);これはどのように起こりますか?

curBwFrame

curBwFrame

スキンマスク

スキンマスク

次のコード スニペットを使用して問題を再現できます。

#include <vector>
#include <cassert>
#include <opencv2\opencv.hpp>
using std::vector;
using namespace cv;

int main() {
    vector<Point2f> features;
    cv::Mat curBwFrame = imread("curBwFrame.png");
    cv::cvtColor(curBwFrame, curBwFrame, CV_RGB2GRAY);
    imwrite("test.png", curBwFrame);

    cv::Mat skinMask = imread("skinMask.png");
    cv::cvtColor(skinMask, skinMask, CV_RGB2GRAY);
    imwrite("test.png", skinMask);

    cv::goodFeaturesToTrack(curBwFrame, features, 5, 0.2, 0.5, skinMask);
    assert(features.size() > 0);

    return 0;
}
4

4 に答える 4

4

主な問題はパラメーターです。OpenCV 2.3.2 のドキュメント(2.3.1 間の互換性の変更はありません) では、メソッドパラメーターの説明は次のとおりです。

void goodFeaturesToTrack(InputArray image, OutputArray corners, int maxCorners, double qualityLevel, double minDistance, InputArray mask=noArray(), int blockSize=3, bool useHarrisDetector=false, double k=0.04 )

パラメーター:

  • image – 入力 8 ビットまたは浮動小数点 32 ビット、シングル チャネル イメージ。
  • corners – 検出されたコーナーの出力ベクトル.
  • maxCorners – 返されるコーナーの最大数。見つかったよりも多くのコーナーがある場合は、最も強いコーナーが返されます。
  • qualityLevel – 画像コーナーの最低限許容される品質を特徴付けるパラメーター。パラメータ値は、最小固有値 ( cornerMinEigenVal() を参照) またはハリス関数の応答 ( cornerHarris() を参照) である最良のコーナー品質測定値で乗算されます。品質測定値が製品よりも低いコーナーは拒否されます。たとえば、最良のコーナーの品質測定値が 1500 で、 qualityLevel=0.01 の場合、品質測定値が 15 未満のすべてのコーナーが拒否されます。
  • minDistance – 返されたコーナー間の最小ユークリッド距離。
  • mask – オプションの関心領域。画像が空でない場合 (タイプ CV_8UC1 で、 image と同じサイズである必要があります)、コーナーが検出される領域を指定します。
  • blockSize – 各ピクセル近傍の微分共分散行列を計算するための平均ブロックのサイズ。cornerEigenValsAndVecs() を参照してください。
  • useHarrisDetector – Harris 検出器 ( cornerHarris() を参照) または cornerMinEigenVal() を使用するかどうかを示すパラメーター。
  • k – Harris 検出器の自由パラメータ。

ニーズを満たすために、qualityLevel と minDistance を少し試してみることをお勧めします。

于 2012-06-11T18:05:46.663 に答える
1

マスクなしでgoodFeaturesToTrack を試して、マスクされた領域内の特徴を検出するかどうかを確認しましたか? 画像が暗く、領域が少しテクスチャレスであるため、goodFeaturesToTrack がそこで特徴を見つけられない可能性があります。

goodFeaturesToTrack の代わりにORB または FASTを試すこともできます。calcOpticalFlowPyrLK で ORB を使用することに成功しました (ただし、マスクを使用しようとしませんでした)。

または、画像を明るくしたり、コントラストを強調したりすることもできます。あなたのシナリオの最大の問題は、シーン内のオブジェクトにこれらの検出器により適した機能である十分なテクスチャまたはコーナーがないことだと思うので、これが改善をもたらすかどうかはよくわかりません. ORB を試して、より多くのポイントが得られるかどうかを確認することをお勧めします。

于 2012-06-11T13:43:10.480 に答える
0

画像はカラーで始まりますか?cv::transform を使用して、グレーに変換する前に色のコントラストを強調します。0 から 255 までのグレーの全範囲で撮影します。マスクの外側で画像が飽和することを心配する必要はありません。

于 2012-06-12T17:10:13.377 に答える