Обнаружение края в openCv дает ошибку времени выполнения - PullRequest
0 голосов
/ 29 января 2011

Я использовал функцию cvCanny для обнаружения краев.

cvCanny( img_b, out, lowThresh*N*N, highThresh*N*N, aperature_size ); 

Но во время выполнения это дает ошибку времени выполнения. Ошибка msg не совсем понятна. Это относится к некоторой ячейке памяти. Пожалуйста, помогите мне .. !!

Код:

void switch_callback_h( int position ){
 highInt = position;
}
void switch_callback_l( int position ){
 lowInt = position;
}

int _tmain(int argc, _TCHAR* argv[])
{

 const char* name = "Edge Detection Window";
 // Kernel size
 int N = 7;
CvCapture* capture = cvCaptureFromCAM(1);
IplImage* frame;

while(1) {
frame = cvQueryFrame( capture );

// Add convolution boarders
 CvPoint offset = cvPoint((N-1)/2,(N-1)/2);
 cvCopyMakeBorder(frame, img_b, offset, IPL_BORDER_REPLICATE, cvScalarAll(0));

 // Make window
 cvNamedWindow( name, 1 );

 // Edge Detection Variables
 int aperature_size = N;
 double lowThresh = 20;
 double highThresh = 40;

 // Create trackbars
 cvCreateTrackbar( "High", name, &high_switch_value, 4, switch_callback_h );
 cvCreateTrackbar( "Low", name, &low_switch_value, 4, switch_callback_l );
 highThresh = 800;
        lowThresh = 100;

     cvCanny( img_b, out, lowThresh*N*N, highThresh*N*N, aperature_size );  

        cvShowImage(name, out);
 cvReleaseImage( &frame );
 cvReleaseImage( &img_b );
 cvReleaseImage( &out );
 cvDestroyWindow( name );

   if( cvWaitKey( 15 ) == 27 ) 
 break;

  return 0;
}

1 Ответ

2 голосов
/ 31 января 2011

Вы были очень близки к выполнению этой работы.В основном, вот ваши проблемы:

  • Вы создаете окно внутри цикла.Поскольку окно каждый раз имеет одно и то же имя, вы можете создать его только один раз.
  • Вы уничтожаете свои изображения, прежде чем сможете их показать.Ваши изображения будут показаны не тогда, когда вы позвоните cvShowImage, а когда вы позвоните cvWaitKey.К тому времени вы уже освободили изображение, поэтому ничего не будет отображаться.
  • Вы освобождаете кадры, загруженные из CvCapture.Документация явно говорит , а не , чтобы сделать это:

Функция cvQueryFrame берет кадр из камеры или видеофайла, распаковывает его и возвращает его.Эта функция является просто комбинацией GrabFrame и RetrieveFrame, но в одном вызове. Возвращенное изображение не должно быть выпущено или изменено пользователем .В случае ошибки возвращаемое значение может быть NULL.

  • Вы нигде не инициализируете image_b или out.Они даже не объявлены в коде, который вы разместили. Я не знаю, как ваш код даже компилировался, не говоря уже о том, что он работал .
  • Вы указываете image_b в качестве источника для обнаружения непредсказуемого края, когда оно действительно должно быть frame
  • Вы не освобождаете структуру захвата видео

Как я уже сказал, множество крошечных точек.Вот код, который работает:

#include <stdlib.h>
#include <cv.h>
#include <highgui.h>
//
// Comment this out to use the webcam.
//
#define LOAD_IMAGE "/home/misha/Desktop/Lenna.png"
int main(int argc, char **argv)
{
    const char *name = "Edge Detection Window";
    int N = 7;
#ifndef LOAD_IMAGE
    CvCapture *capture = cvCaptureFromCAM(1);
#endif
    IplImage *frame = NULL;
    IplImage *out = NULL;

    cvNamedWindow(name, 1);

    while (1) 
    {
#ifdef LOAD_IMAGE
        frame = cvLoadImage(LOAD_IMAGE, 0);
#else
        frame = cvQueryFrame(capture);
#endif
        out = cvCreateImage(cvGetSize(frame), frame->depth, frame->nChannels);

        int aperature_size = N;
        double lowThresh = 20;
        double highThresh = 40;

        highThresh = 800;
        lowThresh = 100;

        cvCanny(frame, out, lowThresh * N * N, highThresh * N * N,
                aperature_size);

        cvShowImage(name, out);
#ifndef LOAD_IMAGE
        if (cvWaitKey(15) == 27)
            break;
#else
        cvWaitKey(0);
        break;
#endif
        }
    cvReleaseImage(&out);
    cvDestroyWindow(name);
#ifdef LOAD_IMAGE
    cvReleaseImage(&frame);
#else
    cvReleaseCapture(&capture);
#endif
    return 0;
}

Компилируется с:

gcc -ggdb -Wall -o devan.out devan.c `pkg-config --cflags --libs opencv`

Стандартное изображение и вывод:

lenna output

...