Необработанное исключение на детекторе краев Canny

Я хочу попробовать детектор края Canny, но при попытке запуска я получаю необработанное исключение:

Необработанное исключение в 0x00007FF97F6C8B9C в canny_project.exe: исключение Microsoft C++: cv:: Исключение в расположении памяти 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;
}

заранее спасибо

3 ответа

Решение

Пожалуйста, попробуйте это вместо этого и скажите мне, отображаются ли изображения или нет, а также попробуйте другие номера устройств:

#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;
}

Возможно, проблема в том, что вы используете cvCaptureFromCAM неправильно.

cvCaptureFromCAM(0) // not -1

Почему вы используете OpenCV с C-Code? Используйте VideoCapture вместо CvCapture.

cvCaptureFromCAM(-1) неверный аргумент, используйте 0, если у вас подключена только одна камера. Кроме того, в C API, когда вы закончили работать с видео, выпустите CvCapture структура с cvReleaseCapture()или используйте Ptr<CvCapture> что вызывает cvReleaseCapture() автоматически в деструкторе. Попробуйте, пожалуйста, этот пример, чтобы проверить, правильно ли вы подключаетесь к камере.

Другие вопросы по тегам