• 締切済み

セグメンテーション違反なってしまいます。

LinuxでopenCVを使っているのですが、どうしてもセグメンテーション違反が出てしまいます。 画像の輪郭座標の表示をさせたいのですが、どうしたらセグメンテーション違反がとれるのでしょうか? ちなみにプログラムは、 #include<cv.h> #include<stdio.h> #include<cxcore.h> #include<highgui.h> #include<stdio.h> void GetContourFeature(CvSeq *Contour); #define THRESHOLD 10 #define THRESHOLD_MAX_VALUE 50 #define MIN_CONTOUR_COUNT 100 #define CONTOUR_MAX_LEVEL 1 #define LINE_THICKNESS 2 #define LINE_TYPE 8 //座標格納用変数 CvPoint *point; CvPoint pt[200000]; //制御点の座標 int main(int argc, char** argv) { char windowNameSource[]="Source"; char windowNameContour[]="Contour"; IplImage *sourceImage=cvLoadImage(arg[0],CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR); if(sourceImage==NULL) { printf("画像が見つかりません\n"); return -1; } IplImage *grayImage=cvCreateImage(cvGetSize(sourceImage), IPL_DEPTH_8U,1); IplImage *binaryImage=cvCreateImage(cvGetSize(sourceImage),IPL_DEPTH_8U,1); IplImage *contourImage=cvCreateImage(cvGetSize(sourceImage),IPL_DEPTH_8U,3); cvCvtColor(sourceImage,grayImage,CV_BGR2GRAY); cvThreshold(grayImage,binaryImage,THRESHOLD,THRESHOLD_MAX_VALUE, CV_THRESH_BINARY); contourImage=cvCloneImage(sourceImage); CvMemStorage *storage = cvCreateMemStorage(0); CvSeq *contours=NULL; CvSize size = cvGetSize(sourceImage); //領域検出用の画像 IplImage* img_tmp = cvCreateImage(size,8,1); int contour_num = cvFindContours(binaryImage,storage, &contours,sizeof(CvContour),CV_RETR_LIST, CV_CHAIN_APPROX_NONE, cvPoint(0,0)); CvPoint ptMaxDist = cvPoint(-1,-1); double maxValue = 0.0; if(contour_num){ //距離変換画像 IplImage* img_dist = cvCreateImage(size,IPL_DEPTH_32F,1); IplImage* img_dist_norm = cvCreateImage(size,IPL_DEPTH_8U,1); //距離変換 cvDistTransform(binaryImage,img_dist,CV_DIST_L2,3,NULL,NULL); //0-255に正規化 cvNormalize(img_dist,img_dist_norm,0.0,255.0,CV_MINMAX,NULL); //最大距離の値と座標を取得する cvMinMaxLoc(img_dist,0,&maxValue,0,&ptMaxDist,0); cvReleaseImage(&img_dist); cvReleaseImage(&img_dist_norm); } //最大距離の点を持つ輪郭線を探す CvSeq* contour_max = NULL; if((ptMaxDist.x >= 0) && (ptMaxDist.x < size.width) && (ptMaxDist.y >= 0) && (ptMaxDist.y < size.height) && (maxValue > 0.0)) { cvZero(img_tmp); CvSeq* c = contours; for(contours=0;c != NULL;c = c -> h_next){ if(c -> total < MIN_CONTOUR_COUNT) continue; //この輪郭線を塗りつぶす cvDrawContours(img_tmp,c,cvScalarAll(255),cvScalarAll(255),CONTOUR_MAX_LEVEL,LINE_THICKNESS,LINE_TYPE,cvPoint(0,0)); //この領域に最大距離の点があるかどうか if(255.0 == cvGetReal2D( img_tmp, ptMaxDist.y, ptMaxDist.x)) { contour_max = c; break; } } cvReleaseImage(&img_tmp); } //この輪郭線を塗りつぶす cvDrawContours(contourImage,contour_max,CV_RGB(255,0,0),CV_RGB(255,0,0),CONTOUR_MAX_LEVEL,LINE_THICKNESS,LINE_TYPE,cvPoint(0,0)); int i; for (i=0;i < contour_max->total; i++){ point = CV_GET_SEQ_ELEM(CvPoint, contour_max, i); pt[i].x = point->x; pt[i].y = point->y; printf("(%d,%d)\n",pt[i].x,pt[i].y); } cvNamedWindow(windowNameSource, CV_WINDOW_AUTOSIZE); cvNamedWindow(windowNameContour, CV_WINDOW_AUTOSIZE); cvShowImage(windowNameSource,sourceImage); cvShowImage(windowNameContour,sourceImage); cvWaitKey(0); cvSaveImage("counter",contourImage); cvReleaseImage(&sourceImage); cvReleaseImage(&grayImage); cvReleaseImage(&contourImage); cvDestroyWindow(windowNameSource); cvDestroyWindow(windowNameContour); return 0; } です。よろしくお願いします。

みんなの回答

  • jjk65536
  • ベストアンサー率59% (66/111)
回答No.3

ん?ループ終了の行でセグメンテーション違反ですか? ちょっと考えにくいですね。 さきほど言い忘れましたが、コンパイルオプションで -g -O0 を付ける必要があります。 (-O0は必須ではないけど、ないと行がずれたりするんで)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

例えば「変数の値を調べてみよう」などとは思いませんでしたか?

  • jjk65536
  • ベストアンサー率59% (66/111)
回答No.1

gdbで走らせて、死んだ後btと打つとどの関数で死んだかわかると思いますが、 どの関数でセグメンテーション違反が出ていますか?

megu210jp
質問者

補足

for (i=0;i < contour_max->total; i++){ point = CV_GET_SEQ_ELEM(CvPoint, contour_max, i); pt[i].x = point->x; pt[i].y = point->y; printf("(%d,%d)\n",pt[i].x,pt[i].y); } で終わってしまいます。

関連するQ&A

専門家に質問してみよう