C++ Compilation introduce errors

asked 2014-02-24 16:04:19 -0500

mfeinstein gravatar image

updated 2014-03-19 12:19:26 -0500

I have a multi-threaded C++ windows project in Visual Studio 2010 which uses Qt (5.1.1) and OpenCV (2.4.8). When I build it in Debug mode everything runs fine, but when I build it in Release mode the program crashes. Both configurations are almost identical (just in Release I have Multi-threaded DLL /MD and in Debug Multi-threaded Debug DLL /MDd), I disabled optimizations for the Release, and even enabled debug to catch the error. What's most weird is that the same piece of code that crashes, runs just fine in another console project.

The error is internal to OpenCV's code, it's not related to my code, my code is just:

void MyProject::findEllipses(QImage &frame, vector<RotatedRect> &ellipses)
{      
    Mat image = Mat(frame.height(), frame.width(), CV_8UC4, frame.scanLine(0));                 

    cvtColor(image, image, CV_RGB2GRAY);
    GaussianBlur(image, image, Size(3, 3), 0, 0, 4);            
    threshold(image, image, treshVal, 255, THRESH_BINARY);

    vector<vector<Point> > contours;               
    Mat contoursImage = image.clone();    
    findContours(contoursImage, contours, CV_RETR_LIST, CV_CHAIN_APPROX_NONE, Point(0, 0)); 
    // ....Mode Code

As I said in Debug the code runs without a problem, findContours() calls _contours.create(total, 1, 0, -1, true); (in line 1720 of OpenCV's contours.cpp) and moves on that method....BUT in Release, when I step into _contours.create(), instead of executing that method, the program jumps to void _OutputArray::clear() const (line 1674 of matrix.cpp) and get's trapped in there, because it calls int k = kind(); in it's first line, which, instead of calling cv::kind(), calls:

 int _InputArray::type(int i) const
 {
    int k = kind();

Which calls againg kind() which again calls type() (instead of kind() as it should), making an infinite recursive loop, bringing a stack overflow.

I tried to make a new Visual Studio 2010 project to see if this is a project creation problem but the problem persisted.

My guess is that the function adresses are wrong in release mode so when it tries to call create(), it instead calls another address, making a mess in the stack, but that's just my guess. At first I will blame OpenCV release dlls, but, as I said, in another console project that only runs that particular code, the code runs fine in bot build modes. I don't see how my other threads and code can trigger this behavior, since the error goes down to a wrong function call in OpenCV.

This is way beyond my knowledge and I have no idea how to fix this, I appreciate all the help I can get on this problem, because I already exausted all my ideas to fix it....

EDIT :

I made a small project so anyone can see what's happening.

The files are in: https://app.box.com/s/3owljl44emv57erinrf8

In order to run it, you have to have OpenCV 2.4.8 and Qt 5.1.1 and configure the Visual Studio 2010 project to get the include files from the right places. In the resources folder ... (more)

edit retag flag offensive close merge delete