Я пытаюсь использоватьcv::calcOpticalFlowPyrLK
, но иногда внутреннее утверждение в этой функции терпит неудачу. Утверждение npoints = prevPtsMat.checkVector(2, CV_32F, true)) >= 0
. Я использую OpenCV 2.3.1. Исходный код этой функции доступен здесь.
Мне трудно понять их код, особенно из-за моего ограниченного опыта работы с компьютерной графикой и отсутствия комментариев. Почему это утверждение срабатывает и что оно говорит о моей проблеме?
Правка: Я вызываю функцию следующим образом:
cv::calcOpticalFlowPyrLK(curBwFrame, prvFrame, features, newFeatures, trackingStatus, errors);
Я обнаружил, что вектор признаков
, который был получен вызовом cv::goodFeaturesToTrack(curBwFrame, features, 5 , 0.2, 0.5, skinMask);
с непустой маской, которая кажется достаточно большой и допустимым изображением, не содержит никаких признаков. Как это может произойти?
curBwFrame
skinMask
Я могу воспроизвести проблему, используя следующий фрагмент кода:
#include
#include
#include
using std::vector;
using namespace cv;
int main() {
vector 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;
}