Ask Your Question

Revision history [back]

CornerSubPix function crashes on small frames

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?

CornerSubPix function crashes on small frames

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?

EDIT: This is the code of the `subdivide' function

#define SQRT 3
static Mat * subdivide(Mat input)
{

    static Mat output[9];

    int rows = input.rows;
    int cols = input.cols;

    cv::Size s = input.size();
    rows = s.height;
    cols = s.width;
    int subrows=rows/SQRT;
    int subcols=cols/SQRT;

    for (int j=0; j<SQRT; j++)
    {
        for (int i=0; i<SQRT; i++)
        {
             Rect Rec(i*subcols, j*subrows, subcols, subrows);
             output[i]=input(Rec);

        }
    }

    return output;
}

If I try to show the pieces of the video, everything it's ok. For example, with this code

    namedWindow( "DEBUG, 1 );
    imshow("DEBUG", cells[0]);

I get a window that shows the upper left cell (in B/W mode) of the original video. My problem actually is only with the function CornerSubPix

CornerSubPix function crashes on small frames

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?

EDIT: This is the code of the `subdivide' subdivide function

#define SQRT 3
static Mat * subdivide(Mat input)
{

    static Mat output[9];

    int rows = input.rows;
    int cols = input.cols;

    cv::Size s = input.size();
    rows = s.height;
    cols = s.width;
    int subrows=rows/SQRT;
    int subcols=cols/SQRT;

    for (int j=0; j<SQRT; j++)
    {
        for (int i=0; i<SQRT; i++)
        {
             Rect Rec(i*subcols, j*subrows, subcols, subrows);
             output[i]=input(Rec);

        }
    }

    return output;
}

If I try to show the pieces of the video, everything it's ok. For example, with this code

    namedWindow( "DEBUG, 1 );
    imshow("DEBUG", cells[0]);

I get a window that shows the upper left cell (in B/W mode) of the original video. My problem actually is only with the function CornerSubPix