2

我在 Visual Studio 2012 上运行 OpenCV 2.4.2。我想使用 MSER 检测图像中的文本。我从 OpenCV 目录中提供的示例 MSER 示例程序开始,

#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);
}

当我构建并运行此代码时,我得到以下输出,之后应用程序停止响应:

 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

知道问题到底是什么吗?我完全迷路了!

我尝试注释掉外部 for 循环内的所有内容,似乎问题出在 RotatedRect 和 fitEllipse 部分。我不完全确定。任何帮助将不胜感激!

4

2 回答 2

1

您可以仔细检查变量的数据类型。从错误消息中可以看出,某些函数只能使用或来获取Mat变量。CV_32FCV_32S

于 2012-09-06T09:31:06.843 回答
0
  1. 将您的平台工具集更改为Visual Studio 2010. (配置属性 -> 常规 -> 平台工具集)

  2. 确保您使用的是二进制文件opencv\build\x{86|64}\vc10

中的二进制文件vc10是用 VS 2010 构建的,与 VS 2012 不兼容。OpenVC 还没有附带原生的 VS 2012 构建。

于 2013-02-01T19:30:33.497 回答