2011-12-18 2 views
1

при компиляции и запуске этого кода, я получаю сообщение об ошибке. Он компилируется, но когда я пытаюсь запустить его, он выдает следующую ошибку:OpenCV Дает ошибку при использовании функций imgproc

Приложение запросило Runtime прекратить необычным способом.

Это код:

#include <opencv2/opencv.hpp> 
#include <string> 

int main() { 
    cv::VideoCapture c(0); 
    double rate = 10; 
    bool stop(false); 
    cv::Mat frame; 
    cv::namedWindow("Hi!"); 
    int delay = 1000/rate; 
    cv::Mat corners; 
    while(!stop){ 
     if(!c.read(frame)) 
      break; 
     cv::cornerHarris(frame,corners,3,3,0.1); 
     cv::imshow("Hi!",corners); 
     if(cv::waitKey(delay)>=0) 
      stop = true; 
    } 
    return 0; 
} 

BTW, я получаю ту же ошибку при использовании оператора кэнний.

+0

Что'S ошибка? – Sam

ответ

0

Ваша corners матрица объявлена ​​как переменная, но для нее нет выделенной памяти. То же самое с вашей переменной frame. Сначала вы должны создать матрицу, достаточно большую для того, чтобы изображение входило в нее.

Предлагаю вам сначала взглянуть на cvCreateImage, чтобы вы могли узнать, как создавать и обрабатывать базовые изображения, прежде чем приступать к работе с видеопотоками.

+0

Эй, код может быть неправильным, но проблема не в распределении mem. Функции C++ выделяют память, когда это необходимо, поэтому их можно вызвать с пустой матрицей вывода - она ​​будет автоматически создана. – Sam

+0

Хм, да, они не указатели. Не такие функции, как cvCanny и даже imshow, требуют указателей на cv-структуры Mat и iplImage? – vsz

+1

Интерфейс C++ сильно отличается от C в этом случае. Они ожидают умного указателя (а не простого указателя), который они могут выделять, если необходимо, с нужным выходом. Как 'if (dst.empty) || dst.size()! = CORRECT_SIZE || .. different_type) {dst.deallocate(); dst.allocate (CORRECT_SIZE_AND_TYPE)} ' – Sam

0

Убедитесь, что захват готов, и изображение в порядке:

if(!cap.IsOpened()) 
    break; 

if(!c.read(frame)) 
     break; 

if(frame.empty()) 
    break; 
0

Вы должны преобразовать изображение в оттенки серого, прежде чем использовать угловой детектор:

cv::Mat frameGray; 
cv::cvtColor(frame, frameGray, CV_RGB2GRAY); 
Смежные вопросы