OpenCVでのテンプレートマッチングについて
質問させてください。
現在画像処理ライブラリの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);
}
}
お礼
ありがとうございます! やっぱり無理ですか…残念です