Canny 边缘检测器未处理的异常
Unhandled exception at Canny edge detector
我想尝试 Canny 边缘检测器,但是当我尝试开始时收到未处理的异常:
canny_project.exe 中 0x00007FF97F6C8B9C 处的未处理异常:Microsoft C++ 异常:cv::Exception 在内存位置 0x0000002485D89860
下面是我在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;
}
提前致谢
问题可能是您使用的 cvCaptureFromCAM 有误。
cvCaptureFromCAM(0) // not -1
为什么要将 OpenCV 与 C 代码一起使用?使用 VideoCapture 代替 CvCapture。
cvCaptureFromCAM(-1)
参数错误,如果您只连接了一个摄像头,请使用 0。此外,在 C API 中,当您处理完视频后,使用 cvReleaseCapture()
释放 CvCapture
结构,或者使用 Ptr<CvCapture>
在析构函数中自动调用 cvReleaseCapture()
.请试一试,this 示例,看看您是否正确访问相机。
请试试这个,告诉我是否显示图像,并尝试不同的设备编号:
#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("Capture", 框架);
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;
}
我想尝试 Canny 边缘检测器,但是当我尝试开始时收到未处理的异常:
canny_project.exe 中 0x00007FF97F6C8B9C 处的未处理异常:Microsoft C++ 异常:cv::Exception 在内存位置 0x0000002485D89860
下面是我在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;
}
提前致谢
问题可能是您使用的 cvCaptureFromCAM 有误。
cvCaptureFromCAM(0) // not -1
为什么要将 OpenCV 与 C 代码一起使用?使用 VideoCapture 代替 CvCapture。
cvCaptureFromCAM(-1)
参数错误,如果您只连接了一个摄像头,请使用 0。此外,在 C API 中,当您处理完视频后,使用 cvReleaseCapture()
释放 CvCapture
结构,或者使用 Ptr<CvCapture>
在析构函数中自动调用 cvReleaseCapture()
.请试一试,this 示例,看看您是否正确访问相机。
请试试这个,告诉我是否显示图像,并尝试不同的设备编号:
#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("Capture", 框架);
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;
}