0

テキスト ファイル npoints3 には、1 242 2 242 3 242 ... 900 242 という形式の座標があり、これは画像を横切る直線ですが、次のコードは直線と追加の線分を出力します。何が間違っているのかわかりません。余分な線分が表示される理由を教えてもらえますか? 前もって感謝します!

    IplImage* InputImg = cvLoadImage("image.jpg", CV_LOAD_IMAGE_GRAYSCALE);
    CVPoint * points  = (CvPoint*)malloc(length*sizeof(CvPoint*));
    FILE *fp;


    fp = fopen("npoints3", "r");

    for(i=1; i <= length; i++)
    {
    fscanf(fp, "%d", &(points[i].x));
    fscanf(fp, "%d", &(points[i].y));
    printf("%d  %d\n",points[i].x, points[i].y);

    }
   for(i=1; i < length; i++)
   cvLine(InputImg, points[i], points[i+1], red, 3, 1);

お返事をありがとうございます。私があなたを明確に理解していることを確認するために、私はあなたの提案の編集を投稿しました. 次のループはあなたが提案したものですか?前もって感謝します。

IplImage* InputImg = cvLoadImage("image.jpg", CV_LOAD_IMAGE_GRAYSCALE);

    if (!InputImg) {
       printf("Could not load Input Image");
       exit(0);
    }


    points1 = (CvPoint*)malloc(length*sizeof(CvPoint*));
           points2 = (CvPoint*)malloc(length*sizeof(CvPoint*));
    points  = (CvPoint*)malloc(length*sizeof(CvPoint*));

    fp = fopen("points", "r");

    for(i=0; i < length; i++)
    {
    fscanf(fp, "%d", &(points[i].x));
    fscanf(fp, "%d", &(points[i].y));

    }
   for(i=0; i < length; i++)
   {


       points1[i].x = points[i].x;
       points1[i].y = points[i].y;

       points2[i].x = points[i+1].x; points2[i].y = points[i+1].y;
      //   cvLine(InputImg, points1[i], points2[i], red, 3, 1);
    }

  cvSnakeImage(InputImg, points, length, alpha, beta, gamma, CV_VALUE, winni, criteria, calcGradient);

    for (i = 0; i <length-1; i++)
    {

           points1[i].x = points[i].x;
           points1[i].y = points[i].y;

           points2[i].x = points[i+1].x; points2[i].y = points[i+1].y;
             cvLine(InputImg, points1[i], points2[i], red, 3, 1);

    }
4

1 に答える 1

0

オフバイワンエラーのように見えます。を呼び出すと、要素mallocの配列に十分なスペースが割り当てられます。length配列のインデックスは 0 です。つまり、points[0]topoints[length-1]は有効なメモリ アドレスですが、そうでpoints[length]はありません。

最初のループの最後に設定した最後の点は、配列の末尾を 1 つ過ぎた要素であり、最後の線分を描画しようとするまでに、値が何かによって上書きされる可能性があります。

最初のループを次のように変更してみてください。

for(i=0; i < length; i++) {
    // scanf stuff here
}

2番目のループは次のとおりです。

for(i=0; i < length-1; i++)
    // cvLine stuff here
于 2013-02-16T20:04:34.060 に答える