アプリ版:「スタンプのみでお礼する」機能のリリースについて

質問させてください。
現在画像処理ライブラリのOpenCVを使ってテンプレートマッチングを用いた物体追跡しようと考えています。
今回作ってみたのですがどうしても、
「Bad argument(Array should be CvMat or IplImage)in function cvGetSize」
というエラーが出てしまいます。
おそらく画像の読み込みの部分だとは思うのですが・・・・
よろしくお願いします。

ソースプログラムは次のようになってます。
int main( void ) {

int device1 = 0;
int key=0;

double max_interlinkage=0;
double min_interlinkage=0;

CvPoint max_point;
CvPoint min_point;
CvPoint corner_point;

char windowNameTemplate[] = "Template";//テンプレート画像を表示するウィンドウの名前
char windowNameDestination[] = "Destination";//マッチング結果を表示するウィンドウの名前

//videoInputオブジェクト
videoInput VI;

//利用可能なキャプチャデバイス数を取得
int numDevices = VI.listDevices();

//キャプチャデバイスが見つからなかったら終了
if(numDevices == 0)
{
cerr << "[Error] Capture device not found!!" << endl;
exit(-1);
}

//デバイス初期化(今回はデバイスID = 0,CAPTURE_WIDTH x CAPTURE_HEIGHTでキャプチャ)
VI.setupDevice(device1, CAPTURE_WIDTH, CAPTURE_HEIGHT);

IplImage *templateImage = cvLoadImage( "C:/Documents and Settings/ito/My Document/My Pictures/temp.jpg", CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR );
IplImage *tempGray = cvCreateImage( cvGetSize(templateImage), IPL_DEPTH_8U, 1 );

if ( templateImage == NULL ) {
//画像が見つからなかった場合
printf( "画像が見つかりません\n" );
return -1;
}

cvCvtColor(templateImage,tempGray,CV_BGR2GRAY);

IplImage *frameImage = cvCreateImage( cvSize(CAPTURE_WIDTH, CAPTURE_HEIGHT), IPL_DEPTH_8U, 3 );//画像用IplImage
IplImage *grayImage = cvCreateImage( cvSize(CAPTURE_WIDTH, CAPTURE_HEIGHT), IPL_DEPTH_8U, 1 );//元画像をグレースケール化した画像用IplImage
IplImage *dstImage = cvCreateImage( cvSize( frameImage->width - templateImage->width + 1, frameImage->height - templateImage->height + 1 ), IPL_DEPTH_32F, 1 );//相違度マップ画像用IplImage

memcpy(frameImage->imageData, VI.getPixels(device1, false , true), frameImage->imageSize);

cvCvtColor(templateImage,tempGray,CV_BGR2GRAY);

//ループ開始
while(1){

//カメラ・デバイスから画像取得
memcpy(frameImage->imageData, VI.getPixels(device1, false , true), frameImage->imageSize);

cvCvtColor(frameImage,grayImage,CV_BGR2GRAY);

//テンプレートマッチングを行う
cvMatchTemplate( grayImage, tempGray, dstImage, CV_TM_CCOEFF_NORMED );

//テンプレートが元画像のどの部分にあるのかという情報を得る
cvMinMaxLoc( dstImage, &min_interlinkage, &max_interlinkage, &min_point, &max_point, NULL );

if(max_interlinkage>0.75){

corner_point=cvPoint(max_point.x+templateImage->width , max_point.y+templateImage->height);

printf("point x=%d ",max_point.x+templateImage->width);
printf("point y=%d ",max_point.y+templateImage->height);

cvRectangle(frameImage , max_point , corner_point , CV_RGB(255,0,0) , LINE_THICKNESS , LINE_TYPE , SHIFT);

printf("\n");

}else{

printf("point Lost\n");

}

//ウィンドウを生成する
cvNamedWindow( windowNameTemplate, CV_WINDOW_AUTOSIZE );
cvNamedWindow( windowNameDestination, CV_WINDOW_AUTOSIZE );

//画像を表示する
cvShowImage( windowNameTemplate, templateImage );
cvShowImage( windowNameDestination , frameImage );

//キー入力
key = cvWaitKey(1);

if(key=='q'){

break;

}else if(key=='c'){

cvSaveImage("image/frame.bmp",frameImage);

}
}

A 回答 (1件)

 こんばんは。



 ファイルのロードに失敗しているのではないでしょうか。パスをもう一度確認してみましょう。
 手っ取り早く、配下のフォルダに入れてtemp.jpgのファイル名だけでロード出来る様にして置いた方が、無難かもしれません。

 原因は、
 ロードに失敗
 ↓
 templateImage=NULL
 ↓
 cvGetSize(templateImage)に渡される
 ↓
 「Bad argument(Array should be CvMat or IplImage)in function cvGetSize」
 です。
    • good
    • 0
この回答へのお礼

アドバイスありがとうございました!
今日実際に試したところうまく実行することができました!

お礼日時:2008/11/14 21:04

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!