OpenCV cvCanny 内存异常

Posted

技术标签:

【中文标题】OpenCV cvCanny 内存异常【英文标题】:OpenCV cvCanny memory exception 【发布时间】:2011-06-21 14:10:08 【问题描述】:

我正在尝试做 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;

【问题讨论】:

顺便问一下,你用的是哪个版本的OpenCV? 【参考方案1】:

你忘了说你是否能够看到屏幕上显示的原始图像。

我从不厌倦告诉人们检查函数的返回是必须的!

考虑IplImage* img = cvLoadImage("images/00000038.jpg");,你怎么知道这个函数是否成功?据我所知,您遇到的错误可能是由于在调用 cvCanny() 之前函数失败造成的。

不管怎样,我最近发布了一个code that uses cvCanny to improve circle detection。您可以检查该代码,看看您在做什么不同。

编辑

在这种情况下,您的问题是您将 cvCanny 输入和输出作为 3 通道图像传递,而它只需要一个单通道图像。 Check the docs:

void cvCanny(const CvArr* image, CvArr* edges, double threshold1, double threshold2, int opening_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);

【讨论】:

我很抱歉。我有两个窗口正在显示,如果我注释掉 cvCanny,那么我会在屏幕上看到原始图像。 更新了答案。问题已解决。

以上是关于OpenCV cvCanny 内存异常的主要内容,如果未能解决你的问题,请参考以下文章

使用opencv在内存位置出现异常

c# emgu/opencv 使用抛出异常 - 试图读取或写入受保护的内存

cvCanny 在 opencv 2.3 中不起作用

Java内存溢出异常(上)

OutOfMemoryError/OOM/内存溢出异常实例分析--堆内存异常

第二章:本机直接内存异常