00001 #include <ros/console.h>
00002 #include <blort/Tracker/Resources.h>
00003
00004 using namespace Tracking;
00005
00006
00007
00008 int Resources::SearchName(NameList* list, const char* filename){
00009
00010 int i = 0;
00011 NameList::iterator it_name = list->begin();
00012 while(it_name != list->end()){
00013 if(!strcmp((*it_name),filename))
00014 return i;
00015 ++it_name;
00016 ++i;
00017 }
00018
00019
00020 return -1;
00021 }
00022
00023
00024
00025 Resources::Resources(){
00026 m_capture = 0;
00027 m_image = 0;
00028 m_ip = 0;
00029 m_showlog = false;
00030 }
00031
00032 Resources::~Resources(){
00033 ReleaseCapture();
00034
00035 ReleaseImageProcessor();
00036
00037 ReleaseShader();
00038
00039 if(m_showlog) ROS_DEBUG("Resources released");
00040 }
00041
00042
00043
00044 IplImage* Resources::InitCapture(const char* file){
00045 m_capture = cvCaptureFromFile(file);
00046 if(!m_capture) {
00047 char errmsg[128];
00048 sprintf(errmsg, "[Resources::InitCapture] Error could not read '%s'\n", file );
00049 throw std::runtime_error(errmsg);
00050 }
00051
00052 double w = cvGetCaptureProperty( m_capture, CV_CAP_PROP_FRAME_WIDTH );
00053 double h = cvGetCaptureProperty( m_capture, CV_CAP_PROP_FRAME_HEIGHT );
00054
00055 if(m_showlog) ROS_DEBUG("Camera settings: %.1f x %.1f", w, h);
00056
00057 m_image = cvQueryFrame(m_capture);
00058 cvConvertImage(m_image, m_image, CV_CVTIMG_FLIP | CV_CVTIMG_SWAP_RB);
00059
00060 return m_image;
00061 }
00062
00063 IplImage* Resources::InitCapture(float width, float height, int camID){
00064 m_capture = cvCreateCameraCapture(camID);
00065 if(!m_capture) {
00066 char errmsg[128];
00067 sprintf(errmsg, "[Resources::InitCapture] Error could not initialise camera\n" );
00068 throw std::runtime_error(errmsg);
00069 }
00070
00071 cvSetCaptureProperty(m_capture, CV_CAP_PROP_FRAME_WIDTH, width );
00072 cvSetCaptureProperty(m_capture, CV_CAP_PROP_FRAME_HEIGHT, height );
00073
00074 double w = cvGetCaptureProperty( m_capture, CV_CAP_PROP_FRAME_WIDTH );
00075 double h = cvGetCaptureProperty( m_capture, CV_CAP_PROP_FRAME_HEIGHT );
00076
00077 if(m_showlog) ROS_DEBUG("Camera settings: %.1f x %.1f", w, h);
00078
00079 m_image = cvQueryFrame(m_capture);
00080 cvConvertImage(m_image, m_image, CV_CVTIMG_FLIP | CV_CVTIMG_SWAP_RB);
00081
00082 return m_image;
00083 }
00084
00085 ImageProcessor* Resources::InitImageProcessor(int width, int height){
00086 if(width==0||height==0){
00087 ROS_DEBUG("[Resources::GetImageProcessor] Error ImageProcessor needs width and height for initialisation");
00088 return 0;
00089 }
00090
00091 if(!m_ip)
00092 m_ip = new(ImageProcessor);
00093
00094 if( !(m_ip->init(width, height)) ){
00095 ROS_DEBUG("[Resources::GetImageProcessor] Error could not initialise ImageProcessor");
00096 delete(m_ip);
00097 m_ip = 0;
00098 return 0;
00099 }
00100
00101 return m_ip;
00102 }
00103
00104
00105 void Resources::ReleaseCapture(){
00106 if(m_capture)
00107 cvReleaseCapture(&m_capture);
00108 m_capture = 0;
00109 }
00110
00111 void Resources::ReleaseImageProcessor(){
00112 if(m_ip)
00113 delete(m_ip);
00114 m_ip = 0;
00115 }
00116
00117
00118
00119 IplImage* Resources::GetNewImage(){
00120
00121 if(!m_capture){
00122 ROS_DEBUG("[Resources::GetNewImage] Error camera not initialised" );
00123 return 0;
00124 }
00125 IplImage* img = 0;
00126
00127 try{
00128 img = cvQueryFrame(m_capture);
00129 }
00130 catch(char const* e){
00131 ROS_DEBUG("[Resources::GetNewImage()] Warning: %s", e);
00132 }
00133
00134 if(img != NULL){
00135 m_image = img;
00136
00137 }
00138
00139
00140 return m_image;
00141 }
00142
00143 IplImage* Resources::GetImage(){
00144 if(!m_image){
00145 return GetNewImage();
00146 }
00147 return m_image;
00148 }
00149
00150 ImageProcessor* Resources::GetImageProcessor(){
00151 if(!m_ip){
00152 ROS_DEBUG("[Resources::GetImageProcessor] Error ImageProcessor not initialised" );
00153 return 0;
00154 }
00155 return m_ip;
00156 }
00157
00158 Shader* Resources::GetShader(int id){
00159 return m_shaderList[id];
00160 }
00161
00162
00163 int Resources::AddShader( const char* shadername,
00164 const char* vertex_file,
00165 const char* fragment_file,
00166 const char* header)
00167 {
00168 int shaderID=-1;
00169
00170
00171
00172
00173
00174
00175
00176
00177 char vertex_fullname[FN_LEN];
00178 char fragment_fullname[FN_LEN];
00179 char header_fullname[FN_LEN];
00180 sprintf(vertex_fullname, "%s%s", m_shaderPath, vertex_file);
00181 sprintf(fragment_fullname, "%s%s", m_shaderPath, fragment_file);
00182 sprintf(header_fullname, "%s%s", m_shaderPath, header);
00183
00184 if(vertex_file)
00185 vertex_file = &vertex_fullname[0];
00186 if(fragment_file)
00187 fragment_file = &fragment_fullname[0];
00188 if(header)
00189 header = &header_fullname[0];
00190
00191 Shader* shader = new Shader(vertex_file, fragment_file, header);
00192
00193 if(!shader->getStatus()){
00194 ROS_DEBUG("[Resources::AddShader] Error failed to load shader %s", shadername);
00195 ROS_DEBUG("[Resources::AddShader] Vertex shader: '%s'", vertex_fullname);
00196 ROS_DEBUG("[Resources::AddShader] Fragment shader: '%s'", fragment_fullname);
00197 ROS_DEBUG("[Resources::AddShader] Header shader: '%s'", header_fullname);
00198 delete(shader);
00199 return -1;
00200 }
00201
00202 char* name = new char[FN_LEN];
00203 strcpy(name, shadername);
00204
00205
00206 m_shaderNameList.push_back(name);
00207 m_shaderList.push_back(shader);
00208
00209 shaderID = m_shaderList.size()-1;
00210
00211 if(m_showlog) ROS_DEBUG("Shader %i loaded: %s", shaderID, name);
00212
00213 return shaderID;
00214 }
00215
00216
00217 void Resources::ReleaseShader(){
00218
00219 for(unsigned int i = 0; i<m_shaderList.size(); ++i)
00220 delete(m_shaderList[i]);
00221 m_shaderList.clear();
00222
00223 for(unsigned int i = 0; i<m_shaderNameList.size(); ++i)
00224 delete(m_shaderNameList[i]);
00225 m_shaderNameList.clear();
00226 }
00227
00228 void Resources::ReleaseShader(int id){
00229 delete(m_shaderList[id]);
00230 m_shaderList[id] = 0;
00231 if(m_showlog) ROS_DEBUG("Shader %i released", id);
00232 }
00233
00234
00235
00236 int Resources::SearchShaderName(const char* filename){
00237 return SearchName(&m_shaderNameList, filename);
00238 }