セグメンテーション違反なってしまいます。
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;
}
です。よろしくお願いします。
お礼
回答ありがとうございます。 お礼が遅くなってしまい申し訳ありません。 ご指摘くださったところを修正してみます。