解像度と誤差について
失礼します。
OpenCVという画像処理ライブラリを用いてテンプレートマッチング法を使った物体追跡を行っています。
今、観測画面内でテンプレート画像とマッチングした箇所を矩形で囲んでその部分の座標X,Y(単位[pixel])を随時コマンドプロンプトに表示させています。
このとき、矩形で囲んでいる物体が一定の場所に置いてあっても、コマンドプロンプト上に表示させている座標にプラスマイナス2[pixel]ぐらいの誤差が生じてしまいます。
この誤差というのは[pixel]→[mm]に単位変換した場合どのくらいの誤差になるのでしょうか??
パソコンはWindows XPでモニターサイズは普通の15インチ(72dpi?)だと思います。観測画面は640×480の解像度でキャプチャーしています。
どうでもいいかもしれませんがmain内のテンプレートマッチングに関係した分のプログラムだけ貼っておきます。
よろしくお願いします。
int main( void ) {
int device1 = 0;
int key=0;
double max_interlinkage=0;
double min_interlinkage=0;
int X1 = 351;
int X2 = 351;
int Y1 = 349;
int Y2 = 349;
CvPoint end_point1;
CvPoint end_point2;
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/デスクトップ/cv_samples/image/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);
end_point1=cvPoint(X1,Y1);
end_point2=cvPoint(X2,Y2);
cvRectangle(frameImage , end_point1 , end_point2 , CV_RGB(255,0,0) , LINE_THICKNESS , LINE_TYPE , SHIFT);
// テンプレートマッチングを行う
cvMatchTemplate( grayImage, tempGray, dstImage, CV_TM_CCOEFF_NORMED );
// テンプレートが元画像のどの部分にあるのかという情報を得る
cvMinMaxLoc( dstImage, &min_interlinkage, &max_interlinkage, &min_point, &max_point, NULL );
if(max_interlinkage>0.60){
corner_point=cvPoint(max_point.x+templateImage->width , max_point.y+templateImage->height);
printf("point x=%d ",max_point.x+templateImage->width);
printf(" 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");
}