I' m modifying the algorithm that compute the optical flow. I want subdivide the input video (I'm using a file as input) in a perfect square number of subvideos in order to compute the optical flow separately and merge the final results in a single output.
I've written the part of code that split my original B/W frame in 9 subframes and everything works. Before iterating the optical flow computation over all the 9 subframes and merge the result, I want to try to compute the optical flow only on a single subframe, let's say, the upper left one. The code compiles but when it runs I get this error
OpenCV Error: Assertion failed (count >= 0) in cornerSubPix, file
/build/opencv-L2vuMj/opencv-
3.2.0+dfsg/modules/imgproc/src/cornersubpix.cpp, line 58
terminate called after throwing an instance of 'cv::Exception'
what(): /build/opencv-L2vuMj/opencv-
3.2.0+dfsg/modules/imgproc/src/cornersubpix.cpp:58: error: (-215) count
>= 0 in function cornerSubPix
This is the core part of the code
Mat gray, prevGray, image, frame;
vector<Point2f> points[2];
for(;;)
{
cap >> frame;
if( frame.empty() )
break;
frame.copyTo(image);
cvtColor(image, gray, COLOR_BGR2GRAY);
Mat * cells = subdivide(gray);
Mat * prevCells = subdivide(prevGray);
if( needToInit )
{
// automatic initialization
goodFeaturesToTrack(cells[0], points[1], MAX_COUNT, 0.01, 10, Mat(), 3, 0, 0.04);
cornerSubPix(cells[0], points[1], subPixWinSize, Size(-1,-1), termcrit);
addRemovePt = false;
needToInit=false;
}
else if( !points[0].empty() )
{
vector<uchar> status;
vector<float> err;
if(prevCells[0].empty())
cells[0].copyTo(prevCells[0]);
calcOpticalFlowPyrLK(prevCells[0], cells[0], points[0], points[1], status, err, winSize,
3, termcrit, 0, 0.001);
size_t i, k;
for( i = k = 0; i < points[1].size(); i++ )
{
if( addRemovePt )
{
if( norm(point - points[1][i]) <= 5 )
{
addRemovePt = false;
continue;
}
}
if( !status[i] )
continue;
points[1][k++] = points[1][i];
circle( image, points[1][i], 3, Scalar(0,255,0), -1, 8);
}
points[1].resize(k);
}
if( addRemovePt && points[1].size() < (size_t)MAX_COUNT )
{
vector<Point2f> tmp;
tmp.push_back(point);
cornerSubPix( cells[0], tmp, winSize, Size(-1,-1), termcrit);
points[1].push_back(tmp[0]);
addRemovePt = false;
}
needToInit = false;
imshow("LK Demo", image);
char c = (char)waitKey(10);
std::swap(points[1], points[0]);
cv::swap(prevCells[0], cells[0]);
}
return 0;
subdivide(Mat input)
is the function that returns an array of Mat.
In the previous code, if i write gray
instead of cells[0]
and prevGray
instead of prevCells[0]
everything works.
The code that i'm using as base is a demo provided by opencv (link to the page)
The only thing that I've added is the subdivide
function, and I've removed from my code all the parts that allow different options that I don't need like nightmode.
How can I solve it?