0

cvCanny 関数を使用してエッジを検出しました。

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

しかし、実行時に実行時エラーが発生します。エラーメッセージはまったく明確ではありません。いくつかのメモリの場所を参照します。私を助けてください..!!

コード:

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

1 に答える 1

2

あなたはこの仕事をするのに非常に近かった. 基本的に、ここにあなたの問題があります:

  • ループ内にウィンドウを作成しています。ウィンドウは毎回同じ名前なので、作成するのは一度だけです。
  • 画像を表示する前に画像を破壊しています。cvShowImageを呼び出したときではなく、 を呼び出したときに画像が表示されますcvWaitKey。その時までに画像は解放されているので、何も表示されません。
  • からロードされたフレームを解放していますCvCaptureドキュメントには、これを行わないように明示的に記載されています。

関数 cvQueryFrame は、カメラまたはビデオ ファイルからフレームを取得し、解凍して返します。この関数は GrabFrame と RetrieveFrame を組み合わせたものですが、1 回の呼び出しです。返されたイメージは、ユーザーによって解放または変更されるべきではありません。エラーが発生した場合、戻り値は 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`

標準画像と出力:

レナ 出力

于 2011-01-31T14:21:36.553 に答える