Canny 边缘检测器未处理的异常

Posted

技术标签:

【中文标题】Canny 边缘检测器未处理的异常【英文标题】:Unhandled exception at Canny edge detector 【发布时间】:2015-02-28 19:59:37 【问题描述】:

我想尝试 Canny 边缘检测器,但是当我尝试启动时收到未处理的异常:

canny_project.exe 中 0x00007FF97F6C8B9C 处的未处理异常:Microsoft C++ 异常:内存位置 0x0000002485D89860 处的 cv::Exception

下面是我在VS2012中实现的代码。

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <stdio.h>
#include <stdlib.h>

using namespace std;
using namespace cv;

int main(int, char**)

    namedWindow("Edges", CV_WINDOW_NORMAL);
    CvCapture* capture = cvCaptureFromCAM(-1);

    cv::Mat frame; cv::Mat out; cv::Mat out2;

    while (1) 
        frame = cvQueryFrame(capture);

        GaussianBlur(frame, out, Size(5, 5), 0, 0);
        cvtColor(out, out2, CV_BGR2GRAY); // produces out2, a one-channel image (CV_8UC1)
        Canny(out2, out2, 100, 200, 3); // the result goes to out2 again,but since it is still one channel it is fine

        if (!frame.data) break;
        imshow("Edges", out2);

        char c = cvWaitKey(33);
        if (c == 'c') break;
    
    return 0;

提前致谢

【问题讨论】:

能否请您在捕获后添加一个 if(frame.empty()) 来处理捕获失败的情况? 并测试捕获对象是否打开成功! 我添加了 if(frame.empty()) 。它不是空的...有什么想法吗? 如果图像不是空的,我没有发现任何问题(afaik device -1 也应该可以工作,但不确定 C 接口)...请尝试使用 cv::VideoCapture capture(-1); if(!capture.isOpened()) return 0; 而不是 cvCaptureFromCAM 和 @ 987654324@ 而不是 cvQueryFrame 行... 您知道捕获生成的输入图像的格式吗?也许它的 BGRA 而不是 BGR?您可以尝试删除 cvtColor 和 canny 操作,而是使用 cv::imwrite 将图像保存到磁盘,或者只显示图像而不进行任何先前的操作? 【参考方案1】:

问题可能是您使用 cvCaptureFromCAM 错误。

cvCaptureFromCAM(0) // not -1

您为什么将 OpenCV 与 C 代码一起使用?使用 VideoCapture 代替 CvCapture。

【讨论】:

同样的错误...我已经尝试过 canny 用于通常的图像并且它可以正常工作。我想图像的格式或大小存在一些问题......【参考方案2】:

请试试这个,告诉我是否显示图像,并尝试不同的设备号:

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <stdio.h>
#include <stdlib.h>

using namespace std;
using namespace cv;

int main(int, char**)

    cv::namedWindow("Capture");
    int deviceNum = 0; // please try different device numbers too like -1, 1, 2, ...
    cv:VideoCapture capture(deviceNum); 
    cv::Mat frame;

    if(!capture.isOpened())
    
        std::cout << "Could not open device " << deviceNum << std::endl;
        return 0;
    

    while (true) 
    
        capture >> frame; // = cvQueryFrame(capture);

        //if (!frame.data) break;
        if(frame.empty())
        
            std::cout << "could not capture a legal frame" << std::endl;

继续; //休息; cv::imshow("捕获", 帧);

        char c = cv::waitKey(33);
        if (c == 'c') break;
    
    std::cout << "press any key to exit" << std::endl;
    cv::waitKey(0); // wait until key pressed
    return 0;

【讨论】:

错误 1 ​​错误 C2039: 'isOpen' : is not a member of 'cv::VideoCapture' 我已经评论了 if(!capture.isOpen()) 条件。捕获窗口是灰色的。没有错误或异常 错字,必须是.isOpened() 无法捕获合法框架 我有另一台笔记本电脑,Win 7 x64,相同版本的 VS,opencv 等。一切都很完美。 我找到了规律。该程序仅在重新启动 PC 后第一次正常工作。第二次和更进一步它写“无法捕获合法框架”这可能是析构函数的问题吗?【参考方案3】:

cvCaptureFromCAM(-1) 的参数有误,如果您只连接了一台摄像机,请使用 0。此外,在 C API 中,当您处理完视频后,使用 cvReleaseCapture() 释放 CvCapture 结构,或者使用在析构函数中自动调用 cvReleaseCapture()Ptr&lt;CvCapture&gt;。请尝试this 示例,看看您是否可以正确访问您的相机。

【讨论】:

同样的错误...我已经尝试过 canny 用于通常的图像并且它可以正常工作。我想图像的格式或大小存在一些问题...... 您究竟在什么功能上遇到了异常?你能正确使用你的相机吗? 我很确定 cvtColor(out, out2, CV_BGR2GRAY);原因程序在下一行停止。不管它是什么。我尝试了 Canny edge 的另一个示例,并且在相同的字符串之后出现了相同的错误。我可以使用camery。我尝试了另一个使用相机的例子,它工作正常 请在捕获后直接打印通道数和类型。 我也建议使用 C 头文件,而不是 C++:#include &lt;cv.h&gt; #include &lt;highgui.h&gt;

以上是关于Canny 边缘检测器未处理的异常的主要内容,如果未能解决你的问题,请参考以下文章

Canny边缘检测算法的步骤和理解

sobel边缘检测优缺点与canny算子的优缺点?

图像处理之Canny边缘检测

OpenCV中的图像处理 —— 图像梯度+Canny边缘检测+图像金字塔

sobel边缘检测优缺点与canny算子的优缺点?

图像处理:推导Canny边缘检测算法