cv drone と ar toolkit についてのしつもんです
Posted: 2014年11月17日(月) 18:25
#include "ardrone/ardrone.h"
#ifdef _WIN32
#include <windows.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#ifndef __APPLE__
#include <GL/gl.h>
#include <GL/glut.h>
#else
#include <OpenGL/gl.h>
#include <GLUT/glut.h>
#endif
#include <AR/gsub.h>
#include <AR/video.h>
#include <AR/param.h>
#include <AR/ar.h>
/*
#include <AR/config.h>
#include <AR/video.h>
#include <AR/param.h> // arParamDisp()
#include <AR/ar.h>
#include <AR/gsub_lite.h>*/
#define KEY_DOWN(key) (GetAsyncKeyState(key) & 0x8000)
#define KEY_PUSH(key) (GetAsyncKeyState(key) & 0x0001)
// --------------------------------------------------------------------------
// main(引数の数、引数リスト)
// メイン関数です
// 戻り値 正常終了:0 エラー:-1
// --------------------------------------------------------------------------
/* パターンファイル */
char *patt_name = "Data/patt.hiro"; // パターンファイル
int patt_id; // パターンのID
double patt_trans[3][4]; // 座標変換行列
double patt_center[2] = { 0.0, 0.0 }; // パターンの中心座標
double patt_width = 80.0; // パターンのサイズ(単位:mm)
int main(int argc, char **argv)
{
// カメラからのビデオキャプチャを初期化する
CvCapture *videoCapture = cvCreateCameraCapture( 1 );
if( videoCapture == NULL )
{
return -1;
}
// AR.Drone
ARDrone ardrone;
// 初期化
if (!ardrone.open()) {
printf("ARDroneの初期化に失敗しました\n");
return -1;
}
// メインループ
while (!GetAsyncKeyState(VK_ESCAPE)) {
// AR.Droneの更新
if (!ardrone.update()) break;
// 画像の取得
IplImage *image = ardrone.getImage();
//OpenCV→ARToolkit
// argDrawMode2D();
// argDispImage( dataPtr, 0,0 );
// ナビゲーションデータの取得
double roll = ardrone.getRoll();
double pitch = ardrone.getPitch();
double yaw = ardrone.getYaw();
printf("ardrone.roll = %3.2f [deg]\n", roll * RAD_TO_DEG);
printf("ardrone.pitch = %3.2f [deg]\n", pitch * RAD_TO_DEG);
printf("ardrone.yaw = %3.2f [deg]\n", yaw * RAD_TO_DEG);
// 高度
double altitude = ardrone.getAltitude();
printf("ardrone.altitude = %3.2f [m]\n", altitude);
// 速度
double vx, vy, vz;
double velocity = ardrone.getVelocity(&vx, &vy, &vz);
printf("ardrone.vx = %3.2f [m/s]\n", vx);
printf("ardrone.vy = %3.2f [m/s]\n", vy);
printf("ardrone.vz = %3.2f [m/s]\n", vz);
// バッテリ残量
int battery = ardrone.getBatteryPercentage();
printf("ardrone.battery = %d [%] (残り約%d分)\n", battery, 12*battery/100);
// 離陸・着陸
if (KEY_PUSH(VK_SPACE)) {
if (ardrone.onGround()) ardrone.takeoff();
else ardrone.landing();
}
// ARDroneが飛行状態
if (!ardrone.onGround()) {
// 速度指令
double x = 0.0, y = 0.0, z = 0.0, r = 0.0;
if (KEY_DOWN(VK_UP)) x = 0.5;
if (KEY_DOWN(VK_DOWN)) x = -0.5;
if (KEY_DOWN(VK_LEFT)) r = 0.5;
if (KEY_DOWN(VK_RIGHT)) r = -0.5;
if (KEY_DOWN('Q')) z = 0.5;
if (KEY_DOWN('A')) z = -0.5;
ardrone.move3D(x, y, z, r);
}
// カメラ切り替え
static int mode = 0;
if (KEY_PUSH('C')) ardrone.setCamera(++mode%4);
// 表示
cvShowImage("camera", image);
// ARMarker処理
arToolKit(image);
cvWaitKey(1);
}
// さようなら
ardrone.close();
// ビデオキャプチャを解放する
cvReleaseCapture( &videoCapture );
return 0;
}
/*
* ARToolKit用関数
* メインループから呼び出される
* 参考:http://www.cg-ya.net/imedia/ar/artoolkit_base_program/
*/
void arToolKit( IplImage* cvImage ) {
ARUint8* arImage = (ARUint8*)(cvimage->imageData);
ARMarkerInfo* marker_info;
int marker_num;
// マーカが画像内にあるか
if( arDetectMarker( arImage, thresh, &marker_info, &marker_num ) < 0 ) {
return;
}
// 登録したマーカの一致度比較
int k = - 1;
for( int j = 0; j < marker_num; j++ ){
for( patt_id == marker_info[j].id ) {
if( k == -1 ) k = j;
else if( marker_info[k].cf < marker_info[j].cf )
k = j;
}
}
// 登録したマーカが存在しない場合
if( k == -1 ) {
return;
}
}
// マーカの位置・姿勢
// arGetTransMat( &marker_info[k], patt_center, patt_width, patt_trans );
// マーカの情報表示
printf( "信頼度:%f\n", marker_info.cf);
printf( "マーカの中心座標 x:%5f y:%5f\nn" marker_info.pos[0], marker_info.pos[1] );
}
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
: error C2065: 'thresh' : 定義されていない識別子です。
1: warning C4553: '==' : 演算子にプログラム上の作用がありません。'=' を意図しましたか?
1 : error C2143: 構文エラー : ';' が ')' の前にありません。
: error C2143: 構文エラー : ';' が ')' の前にありません。
: error C2065: 'marker_info' : 定義されていない識別子です。
: error C2228: '.cf' の左側はクラス、構造体、共用体でなければなりません
1> 型は ''unknown-type'' です。
1 : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
1 : error C2365: 'printf' : 再定義; 以前の定義は '関数' でした。
1> c:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\stdio.h(287) : 'printf' の宣言を確認してください。
1 : error C2078: 初期化子の数が多すぎます。
1 : error C2146: 構文エラー : ')' が、識別子 'marker_info' の前に必要です。
1 : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
1 : error C2365: 'printf' : 再定義; 以前の定義は '関数' でした。
1> c:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\stdio.h(287) : 'printf' の宣言を確認してください。
1> : error C2440: '初期化中' : 'const char [33]' から 'int' に変換できません。
1> この変換が可能なコンテキストはありません。
1 : error C2059: 構文エラー : ')'
1: error C2059: 構文エラー : '}'
1 : error C2143: 構文エラー : ';' が '}' の前にありません。
1 : error C2059: 構文エラー : '}'
エラーの解決方法を教えていただきたいです。
#ifdef _WIN32
#include <windows.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#ifndef __APPLE__
#include <GL/gl.h>
#include <GL/glut.h>
#else
#include <OpenGL/gl.h>
#include <GLUT/glut.h>
#endif
#include <AR/gsub.h>
#include <AR/video.h>
#include <AR/param.h>
#include <AR/ar.h>
/*
#include <AR/config.h>
#include <AR/video.h>
#include <AR/param.h> // arParamDisp()
#include <AR/ar.h>
#include <AR/gsub_lite.h>*/
#define KEY_DOWN(key) (GetAsyncKeyState(key) & 0x8000)
#define KEY_PUSH(key) (GetAsyncKeyState(key) & 0x0001)
// --------------------------------------------------------------------------
// main(引数の数、引数リスト)
// メイン関数です
// 戻り値 正常終了:0 エラー:-1
// --------------------------------------------------------------------------
/* パターンファイル */
char *patt_name = "Data/patt.hiro"; // パターンファイル
int patt_id; // パターンのID
double patt_trans[3][4]; // 座標変換行列
double patt_center[2] = { 0.0, 0.0 }; // パターンの中心座標
double patt_width = 80.0; // パターンのサイズ(単位:mm)
int main(int argc, char **argv)
{
// カメラからのビデオキャプチャを初期化する
CvCapture *videoCapture = cvCreateCameraCapture( 1 );
if( videoCapture == NULL )
{
return -1;
}
// AR.Drone
ARDrone ardrone;
// 初期化
if (!ardrone.open()) {
printf("ARDroneの初期化に失敗しました\n");
return -1;
}
// メインループ
while (!GetAsyncKeyState(VK_ESCAPE)) {
// AR.Droneの更新
if (!ardrone.update()) break;
// 画像の取得
IplImage *image = ardrone.getImage();
//OpenCV→ARToolkit
// argDrawMode2D();
// argDispImage( dataPtr, 0,0 );
// ナビゲーションデータの取得
double roll = ardrone.getRoll();
double pitch = ardrone.getPitch();
double yaw = ardrone.getYaw();
printf("ardrone.roll = %3.2f [deg]\n", roll * RAD_TO_DEG);
printf("ardrone.pitch = %3.2f [deg]\n", pitch * RAD_TO_DEG);
printf("ardrone.yaw = %3.2f [deg]\n", yaw * RAD_TO_DEG);
// 高度
double altitude = ardrone.getAltitude();
printf("ardrone.altitude = %3.2f [m]\n", altitude);
// 速度
double vx, vy, vz;
double velocity = ardrone.getVelocity(&vx, &vy, &vz);
printf("ardrone.vx = %3.2f [m/s]\n", vx);
printf("ardrone.vy = %3.2f [m/s]\n", vy);
printf("ardrone.vz = %3.2f [m/s]\n", vz);
// バッテリ残量
int battery = ardrone.getBatteryPercentage();
printf("ardrone.battery = %d [%] (残り約%d分)\n", battery, 12*battery/100);
// 離陸・着陸
if (KEY_PUSH(VK_SPACE)) {
if (ardrone.onGround()) ardrone.takeoff();
else ardrone.landing();
}
// ARDroneが飛行状態
if (!ardrone.onGround()) {
// 速度指令
double x = 0.0, y = 0.0, z = 0.0, r = 0.0;
if (KEY_DOWN(VK_UP)) x = 0.5;
if (KEY_DOWN(VK_DOWN)) x = -0.5;
if (KEY_DOWN(VK_LEFT)) r = 0.5;
if (KEY_DOWN(VK_RIGHT)) r = -0.5;
if (KEY_DOWN('Q')) z = 0.5;
if (KEY_DOWN('A')) z = -0.5;
ardrone.move3D(x, y, z, r);
}
// カメラ切り替え
static int mode = 0;
if (KEY_PUSH('C')) ardrone.setCamera(++mode%4);
// 表示
cvShowImage("camera", image);
// ARMarker処理
arToolKit(image);
cvWaitKey(1);
}
// さようなら
ardrone.close();
// ビデオキャプチャを解放する
cvReleaseCapture( &videoCapture );
return 0;
}
/*
* ARToolKit用関数
* メインループから呼び出される
* 参考:http://www.cg-ya.net/imedia/ar/artoolkit_base_program/
*/
void arToolKit( IplImage* cvImage ) {
ARUint8* arImage = (ARUint8*)(cvimage->imageData);
ARMarkerInfo* marker_info;
int marker_num;
// マーカが画像内にあるか
if( arDetectMarker( arImage, thresh, &marker_info, &marker_num ) < 0 ) {
return;
}
// 登録したマーカの一致度比較
int k = - 1;
for( int j = 0; j < marker_num; j++ ){
for( patt_id == marker_info[j].id ) {
if( k == -1 ) k = j;
else if( marker_info[k].cf < marker_info[j].cf )
k = j;
}
}
// 登録したマーカが存在しない場合
if( k == -1 ) {
return;
}
}
// マーカの位置・姿勢
// arGetTransMat( &marker_info[k], patt_center, patt_width, patt_trans );
// マーカの情報表示
printf( "信頼度:%f\n", marker_info.cf);
printf( "マーカの中心座標 x:%5f y:%5f\nn" marker_info.pos[0], marker_info.pos[1] );
}
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
: error C2065: 'thresh' : 定義されていない識別子です。
1: warning C4553: '==' : 演算子にプログラム上の作用がありません。'=' を意図しましたか?
1 : error C2143: 構文エラー : ';' が ')' の前にありません。
: error C2143: 構文エラー : ';' が ')' の前にありません。
: error C2065: 'marker_info' : 定義されていない識別子です。
: error C2228: '.cf' の左側はクラス、構造体、共用体でなければなりません
1> 型は ''unknown-type'' です。
1 : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
1 : error C2365: 'printf' : 再定義; 以前の定義は '関数' でした。
1> c:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\stdio.h(287) : 'printf' の宣言を確認してください。
1 : error C2078: 初期化子の数が多すぎます。
1 : error C2146: 構文エラー : ')' が、識別子 'marker_info' の前に必要です。
1 : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
1 : error C2365: 'printf' : 再定義; 以前の定義は '関数' でした。
1> c:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\stdio.h(287) : 'printf' の宣言を確認してください。
1> : error C2440: '初期化中' : 'const char [33]' から 'int' に変換できません。
1> この変換が可能なコンテキストはありません。
1 : error C2059: 構文エラー : ')'
1: error C2059: 構文エラー : '}'
1 : error C2143: 構文エラー : ';' が '}' の前にありません。
1 : error C2059: 構文エラー : '}'
エラーの解決方法を教えていただきたいです。