2011-07-06 4 views
2

cvhoughline2の結果を格納するためにopencvのシーケンスを使用しています。
私はシーケンスを作成し、その上でいくつかの操作を行うことが、私はプログラムを実行すると、それはラインcvseqremove(seq,index)で壊し、私に例外を与える:opencvシーケンスのヘルプが必要です!

例外メモリ位置に

cvseqremove(seq,index)のseqにカーソルを置くと、それは私に書き込みます:h_prev=0*000000000000000

は私が、私は任意の助けを感謝します、そのコードを書いた

void APPROXIMATE_LINES(IplImage* image,unsigned int xsize,unsigned int ysize,double width) 
{ 
    unsigned int i; 
    IplImage* color_dst = cvCreateImage(cvGetSize(image), 8,3); 
    IplImage* dst = cvCreateImage(cvGetSize(image), 8,1); 
    CvMemStorage* storage = cvCreateMemStorage(0); 
    CvSeq* Filtered_Lines=0; 
    boolean isbreak; 
    double distance=4.0; 
    CvPoint Mid_Point; 
    CvPoint First_Mid_Point; 
    CvSeq* lines = cvCreateSeq(CV_SEQ_ELTYPE_POINT,sizeof(CvSeq),sizeof(CvPoint),storage); 
    cvCanny(image,dst,180,250,3); 
    cvCvtColor(dst,color_dst,CV_GRAY2BGR); 

    lines = cvHoughLines2(dst, storage, CV_HOUGH_PROBABILISTIC, 4, CV_PI/165, 95, 93, 75); 
    while (lines->total>1) 
    { 
     CvPoint* First_Line = (CvPoint*)cvGetSeqElem(lines,0); 
     First_Mid_Point=mid(First_Line[0],First_Line[1]); 
     isbreak=FALSE; 

     for(i =1; i < lines->total; i++) 
     { 
      CvPoint* line = (CvPoint*)cvGetSeqElem(lines,i); 
      Mid_Point=mid(line[0],line[1]); 
      if(dist(First_Mid_Point.x,First_Mid_Point.y,Mid_Point.x,Mid_Point.y)<distance) 
      { 
       cvSeqRemove(lines,i); 
       isbreak=TRUE; 
       break; 
      } 
     }  /*End_for*/ 

     if(!isbreak) 
     { 
      cvSeqPushFront(Filtered_Lines,First_Line); // <--- breaks here 
      cvSeqRemove(lines,0); 
     } 
    } /*End_while*/ 


    for(i=0;i<Filterd_Lines;i++) 
    { 
     CvPoint* Filtered = (CvPoint*)cvGetSeqElem(Filterd_Lines,i); 
     cvLine(color_dst, Filtered[0], Filtered[1], cvScalar(0,0,255,0),1,8,0); 
    } 

    cvNamedWindow("Example1", CV_WINDOW_AUTOSIZE); 
    cvShowImage("Example1",color_dst); 
    cvWaitKey(0); 
    cvReleaseImage(&color_dst); 
    cvDestroyWindow("Example1"); 
} 
+1

あなたの質問によくタグを付けることを学ぶと、より多くの意見が得られます。私はちょうどあなたのためにCのタグを追加しました。 – karlphillip

答えて

1

関数のシグネチャは次のとおりです。

void cvSeqRemove(CvSeq* seq, int index) 

しかし、コードの一部にあなたがやっている:

cvSeqRemove(lines,&i); 

これは、値の代わりに変数iのメモリアドレスを渡すことを意味し、これはあなたがしたいこと。

その他のバグがある可能性があります。

+0

カールフィリップ、ありがとう、あなたは協力者です。 –

+0

@ Karlphillip、linecvSeqRemoveからアンパサンド(&)を削除して実行しましたが、今度はcvSeqPushFront(Filtered_Lines、First_Line)の行でブレークします。 ---> –

+0

@Eslamコードが不完全で実行できないので、今からやることはあまりありません。これらのポインタが有効でない(NULLに等しい)場合、関数が壊れる可能性があることに注意してください。したがって、それらの関数を呼び出す前にパラメータが良好であるかどうかを確認してください。がんばろう。 – karlphillip