MSER Sample in OpenCV 2.4.2 on Visual Studio 2012

6.4k views Asked by At

I'm running OpenCV 2.4.2, on Visual Studio 2012. I want to use MSER to detect text in images. I started off with the sample MSER sample program provided in the OpenCV directory,

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/features2d/features2d.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <stdio.h>

using namespace cv;
using namespace std;

static const Vec3b bcolors[] =
{
    Vec3b(0,0,255),
    Vec3b(0,128,255),
    Vec3b(0,255,255),
    Vec3b(0,255,0),
    Vec3b(255,128,0),
    Vec3b(255,255,0),
    Vec3b(255,0,0),
    Vec3b(255,0,255),
    Vec3b(255,255,255)
};

int main( int argc, char** argv )
{
    string path;
    Mat img0, img, yuv, gray, ellipses;

    img0 = imread( argc != 2 ? "puzzle.png" : argv[1], 1 );
    if( img0.empty() )
    {
        if( argc != 2 )
            cout << "\nUsage: mser_sample <path_to_image>\n";
        else
            cout << "Unable to load image " << argv[1] << endl;
        return 0;
    }

    cvtColor(img0, yuv, COLOR_BGR2YCrCb);
    cvtColor(img0, gray, COLOR_BGR2GRAY);
    cvtColor(gray, img, COLOR_GRAY2BGR);
    img.copyTo(ellipses);

    vector<vector<Point> > contours;
    double t = (double)getTickCount();
    MSER()(yuv, contours);
    t = (double)getTickCount() - t;
    printf( "MSER extracted %d contours in %g ms.\n", (int)contours.size(),
           t*1000./getTickFrequency() );

    // draw mser's with different colors
    for( int i = (int)contours.size()-1; i >= 0; i-- )
    {
        const vector<Point>& r = contours[i];
        for ( int j = 0; j < (int)r.size(); j++ )
        {
            Point pt = r[j];
            img.at<Vec3b>(pt) = bcolors[i%9];
        }

        // find ellipse (it seems cvfitellipse2 have error or sth?)
        RotatedRect box = fitEllipse( r );

        box.angle=(float)CV_PI/2-box.angle;
        ellipse( ellipses, box, Scalar(196,255,255), 2 );
    }

    imshow( "original", img0 );
    imshow( "response", img );
    imshow( "ellipses", ellipses );

    waitKey(0);
}

When I build and run this code, I get the following output after which the application stops responding:

 MSER extracted 1584 contours in 1748.41 ms.
 OpenCV Error: Assertion failed (points.checkVector(2) >= 0 && (points.depth() == 
 CV_32F || points.depth() == CV_32S)) in unknown function, file 
 ..\..\..\src\opencv\modules\imgproc\src\contours.cpp, line 2019

Any idea what exactly the problem is? I am totally lost!

I've tried commenting out everything inside the outer for loop, and it seems that the problem lies with the RotatedRect and fitEllipse portions. I'm not completely sure though.Any help would be much appreciated!

2

There are 2 answers

0
mintaka On BEST ANSWER

You may double check the data type of your variables. From the error message, some function can only take Mat variable with either CV_32F or CV_32S.

0
Kay Sarraute On
  1. Change your platform toolset to Visual Studio 2010. (Configuration Properties -> General -> Platform Toolset)

  2. Make sure you're using the binaries in opencv\build\x{86|64}\vc10

The binaries in vc10 were built with VS 2010 and are incompatible with VS 2012. OpenVC doesn't ship with a native VS 2012 build yet.