OpenCV cvCanny исключение памяти - PullRequest
1 голос
/ 21 июня 2011

Я пытаюсь сделать примеры в книге OpenCV и попал в часть, касающуюся cvCanny. Я пытаюсь использовать его, но получаю ошибку исключения памяти

Unhandled exception at 0x75d8b760 in Image_Transform.exe: Microsoft C++ exception: cv::Exception at memory location 0x0011e7a4..

Я также посмотрел другой пост, похожий на этот вопрос, но он мне не помог, так как каждый раз получал одну и ту же ошибку. Любая помощь очень ценится, и исходный код функции находится ниже.

void example2_4(IplImage* img)
{
// Create windows to show input and ouput images
cvNamedWindow("Example 2-4 IN", CV_WINDOW_AUTOSIZE);
cvNamedWindow("Example 2-4 OUT", CV_WINDOW_AUTOSIZE);

// Display out input image
cvShowImage("Example 2-4 IN", img);

// Create an image to hold our modified input image
IplImage* out = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 3);

// Do some smoothing
//cvSmooth(img, out, CV_GAUSSIAN, 3, 3);

// Do some Edge detection
cvCanny(img, out, 10, 20, 3);

// Show the results
cvShowImage("Example 2-4 OUT", out);

// Release the memory used by the transformed image
cvReleaseImage(&out);

// Wait for user to hit a key then clean up the windows
cvWaitKey(0);
cvDestroyWindow("Example 2-4 IN");
cvDestroyWindow("Example 2-4 OUT");
}

int main()
{
// Load in an image
IplImage* img = cvLoadImage("images/00000038.jpg");

// Run the transform
example2_4(img);

// clean the image from memory
cvReleaseImage(&img);

return 0;
}

1 Ответ

1 голос
/ 21 июня 2011

Вы забыли сказать, можете ли вы видеть оригинальное изображение, отображаемое на экране.

Я никогда не устаю говорить людям, что проверка возврата функций обязательна!

Рассмотрим IplImage* img = cvLoadImage("images/00000038.jpg");, как вы можете определить, была ли эта функция выполнена успешно или нет? Насколько я могу судить, ошибка, которая у вас возникла, может быть связана с ошибкой функции до вызова cvCanny().

Во всяком случае, я недавно опубликовал код , который использует cvCanny для улучшения обнаружения круга . Вы можете проверить этот код и посмотреть, что вы делаете по-другому.

EDIT

Ваша проблема в этом случае заключается в том, что вы переходите к входу и выходу cvCanny в виде 3-канального изображения, когда оно принимает только одноканальное изображение. Проверьте документы :

void cvCanny (постоянное CvArr * изображение, CvArr * ребра, двойной порог1, двойной порог2, int aperture_size = 3)

Implements the Canny algorithm for edge detection.
Parameters: 

    * image – Single-channel input image
    * edges – Single-channel image to store the edges found by the function
    * threshold1 – The first threshold
    * threshold2 – The second threshold
    * aperture_size – Aperture parameter for the Sobel operator (see Sobel)

Итак, измените свой код на:

// Create an image to hold our modified input image
IplImage* out = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1); 

// Do some smoothing
//cvSmooth(img, out, CV_GAUSSIAN, 3, 3);

IplImage* gray = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1); 
cvCvtColor(img, gray, CV_BGR2GRAY);

// Do some Edge detection
cvCanny(gray, out, 10, 20, 3);
...