使用しようとしています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
スキンマスク
次のコード スニペットを使用して問題を再現できます。
#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;
}