2011-01-29 10 views
0

私はcvCanny関数を使用してエッジを検出しました。openCvのエッジ検出でランタイムエラーが発生する

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; 
} 
+0

実際のエラーメッセージを投稿してください - また、どのようなコンパイラ、OSなど? –

+0

しきい値が非常に高いように見えます。 img_bとoutの形式は何ですか?例外がスローされたときにバックトレースを与えることができるようにgdbを実行してください! – ypnos

+0

ソースコード全体へのリンクを試してください。これは論理的なエラーよりもデバッグのようなものです。あなたのコードを実行しようとしています。 – AruniRC

答えて

2

あなたは非常に近いこの作業を行うこととなりました。基本的に問題は次のとおりです。

  • ループ内にウィンドウを作成しています。ウィンドウは毎回同じ名前なので、一度作成するだけです。
  • イメージを表示するには、イメージを破壊しています。 cvShowImageを呼び出したときではなく、cvWaitKeyに電話をしたときに画像が表示されます。その時までにすでにイメージを解放しているので、何も表示されません。
  • CvCaptureから読み込んだフレームを解放しています。文書は、明示的にないこれを行うために言う:

機能cvQueryFrameは、カメラやビデオファイルから フレームをグラブ、 はそれを解凍し、それを返します。この 機能は、 GrabFrameとRetrieveFrameの組み合わせに過ぎませんが、 で1回呼び出されます。 ユーザーによって返される画像は である必要はありません。エラーが発生した場合、戻り値はNULLである可能性があります( )。

  • あなたはどこにでもimage_bまたはoutを初期化していません。あなたが投稿したコードでも宣言されていません。 あなたのコードがどのようにコンパイルされているかは分かりませんが、は実行しませんでした。
  • あなたはそれが本当にframe
  • 私が言ったようにあなたは、

小さなポイントの数をビデオキャプチャ構造体を解放していないべきであるとき、気の利いたエッジ検出のソースとしてimage_bを指定しています。ここで動作するコードです:

#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` 

標準画像と出力:

lennaoutput

+0

これは今うまくいきます。本当にありがとうございます。 – devan

+0

私はこれをリアルタイムでやりたい – devan

+0

@devon:「ブレイク」をコメントアウトしてください。ループの終わりにはラインが表示され、処理が続行されます。 (そしてLOAD_IMAGEをコメントアウトしてください) ニースコード/ nice答え、@misha! – Gene

関連する問題