Ask Your Question
-1

findcontours problem in vs2010

asked 2013-04-26 03:50:38 -0600

m_ahmadi gravatar image

updated 2013-04-26 07:52:23 -0600

hi there

when i use findcontours function in vs2010, i get "access violation reading location... "error when i try to compile it, but when i compile same code in linux ubuntu it is run perfectly, is there any problem with opencv&vs2010?

here is the code:

#include "highgui.h"
#include "cv.h"
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace cv;
using namespace std;
Mat src; Mat src_gray;
int thresh = 100;
int max_thresh = 255;
RNG rng(12345);
/// Function header
void thresh_callback(int, void* );
/** @function main */
int main(  )
{
/// Load source image and convert it to gray
src = imread( "lena.bmp",1 );
if ( src.empty() )
{
    cerr << "you owe me one!" << endl;
    return -1;
}
/// Convert image to gray and blur it
cvtColor( src, src_gray, CV_BGR2GRAY );
cvtColor( src, src_gray, CV_BGR2GRAY );
blur( src_gray, src_gray, Size(3,3) );
/// Create Window
char* source_window = "Source";
namedWindow( source_window, CV_WINDOW_AUTOSIZE );
imshow( source_window, src );
createTrackbar( " Canny thresh:", "Source", &thresh, max_thresh, thresh_callback );
thresh_callback( 0, 0 );
waitKey(0);
return(0);
}
void thresh_callback(int, void* )
{
Mat canny_output;
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
/// Detect edges using canny
Canny( src_gray, canny_output, thresh, thresh*2, 3 );
/// Find contours
findContours( canny_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0) );
/// Draw contours
Mat drawing = Mat::zeros( canny_output.size(), CV_8UC3 );
for( int i = 0; i< contours.size(); i++ )
{
Scalar color = Scalar( rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255) );
drawContours( drawing, contours, i, color, 2, 8, hierarchy, 0, Point() );
}
/// Show in a window
namedWindow( "Contours", CV_WINDOW_AUTOSIZE );
imshow( "Contours", drawing );
}

and the error is: Unhandled exception at 0x52b01f91 in test_test.exe: 0xC0000005: Access violation reading location 0x00000e1c. image description

the line that error occure:findContours( canny_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0) );

project in Debug or Release mod, the error is still happening. and its nothing with finding image, check the code please.

image is load correctly, the problem is with findcontours.

#include "highgui.h"
#include "cv.h"
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace cv;
using namespace std;
Mat src; Mat src_gray;
int thresh = 100;
int max_thresh = 255;
RNG rng(12345);
/// Function header
void thresh_callback(int, void* );
/** @function main */
int main( )
{
/// Load source image and convert it to gray
src = imread( "lena.bmp",1 );
if ( src.empty() )
{
    cerr << "you owe me one!" << endl;
    return -1;
}
namedWindow( "input_img", CV_WINDOW_AUTOSIZE );
imshow( "input_img", src );
waitKey(0);
/// Convert image to gray and blur it

//cvtColor( src, src_gray, CV_BGR2GRAY );
//
//blur( src_gray, src_gray, Size(3,3) );
///// Create Window
//char* source_window = "Source";
//namedWindow( source_window, CV_WINDOW_AUTOSIZE );
//imshow( source_window, src );
//createTrackbar( " Canny thresh:", "Source", &thresh, max_thresh, thresh_callback );
//thresh_callback( 0, 0 );
//waitKey(0);
return(0);
}
void thresh_callback(int, void* )
{
Mat canny_output;
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
/// Detect edges using canny
Canny( src_gray, canny_output, thresh, thresh*2, 3 );
/// Find contours
findContours( canny_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0) );
/// Draw contours
Mat drawing = Mat::zeros( canny_output.size(), CV_8UC3 );
for( int i = 0; i< contours.size(); i++ )
{
Scalar color = Scalar( rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255) );
drawContours( drawing, contours, i, color, 2, 8, hierarchy, 0 ...
(more)
edit retag flag offensive close merge delete

Comments

Read the FAQ and edit your question. Give us more information if you do not want your topic to get closed... Error when trying to compile tells us nothing ...

StevenPuttemans gravatar imageStevenPuttemans ( 2013-04-26 04:08:00 -0600 )edit
1

yes, compilers behave different some times, so - demo code, please..

berak gravatar imageberak ( 2013-04-26 04:08:21 -0600 )edit

Is it in release or debug mode ? What is the line where the error occures ?

Rogeeeer gravatar imageRogeeeer ( 2013-04-26 04:48:20 -0600 )edit

The guilty line is more Canny( src_gray, canny_output, thresh, thresh*2, 3 );. The green arrow point the next instruction to be executed.

Did you check what's in your src_gray at the begining of the "tresh_callback" ? Like an imshow to see if the matrix is ok. Maybe it can be the contours matrix that have to be initialized ? Take a look at the documentation :

http://docs.opencv.org/doc/tutorials/imgproc/imgtrans/canny_detector/canny_detector.html

The output matrix is already initialized...

Rogeeeer gravatar imageRogeeeer ( 2013-04-26 06:59:35 -0600 )edit

Contours matrix does not need initialization on my system :) So guess they don't need to be on his system either.

StevenPuttemans gravatar imageStevenPuttemans ( 2013-04-26 07:11:27 -0600 )edit

1 answer

Sort by ยป oldest newest most voted
3

answered 2013-04-26 04:59:39 -0600

berak gravatar image

updated 2013-04-26 05:04:02 -0600

your code works nicely here on win / vs2008

i bet a beer, that it just could not find your image ;)

src = imread( "lena.bmp",1 );
if ( src.empty() )
{
    cerr << "you owe me one!" << endl;
    return -1;
}

ah, idea... if you start your prog from the ide, by default it starts from debug or release folder, not your solution/proj folder. (might explain, why it found it on linux, but not on win like this)

you can adjust that from the debug settings in your proj.


oh, also you don't need cvtColor( src, src_gray, CV_BGR2GRAY ); twice ..

edit flag offensive delete link more

Comments

like always, when access violation errors occur, memory is read that was not assigned and filled with data before. So like @berak said, the loading of your image is going wrong. Try to use absolute paths as a starter, then perform some testing with relative paths in order to find out where to actually put your data. Or give the location of your file as an argument to your application.

StevenPuttemans gravatar imageStevenPuttemans ( 2013-04-26 06:01:33 -0600 )edit

hmm, screenshot seems to hint, that he got beyond that point ...

berak gravatar imageberak ( 2013-04-26 06:05:57 -0600 )edit

Question Tools

Stats

Asked: 2013-04-26 03:50:38 -0600

Seen: 2,685 times

Last updated: Apr 26 '13