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<CvCapture>
。请尝试this 示例,看看您是否可以正确访问您的相机。
【讨论】:
同样的错误...我已经尝试过 canny 用于通常的图像并且它可以正常工作。我想图像的格式或大小存在一些问题...... 您究竟在什么功能上遇到了异常?你能正确使用你的相机吗? 我很确定 cvtColor(out, out2, CV_BGR2GRAY);原因程序在下一行停止。不管它是什么。我尝试了 Canny edge 的另一个示例,并且在相同的字符串之后出现了相同的错误。我可以使用camery。我尝试了另一个使用相机的例子,它工作正常 请在捕获后直接打印通道数和类型。 我也建议使用 C 头文件,而不是 C++:#include <cv.h> #include <highgui.h>
以上是关于Canny 边缘检测器未处理的异常的主要内容,如果未能解决你的问题,请参考以下文章