SimViewCam.cpp
Go to the documentation of this file.
00001 // -*- C++ -*-
00010 #include "SimViewCam.h"
00011 
00012 // Module specification
00013 // <rtc-template block="module_spec">
00014 static const char* SimViewCam_spec[] =
00015   {
00016     "implementation_id", "SimViewCam",
00017     "type_name",         "SimViewCam",
00018     "description",       "DataConversionRTC",
00019     "version",           "1.0.0",
00020     "vendor",            "AIST",
00021     "category",          "tool",
00022     "activity_type",     "PERIODIC",
00023     "kind",              "DataFlowComponent",
00024     "max_instance",      "5",
00025     "language",          "C++",
00026     "lang_type",         "compile",
00027     //"exec_cxt.periodic.rate", "1.0",
00028     ""
00029   };
00030 // </rtc-template>
00031 
00036 SimViewCam::SimViewCam(RTC::Manager* manager)
00037     // <rtc-template block="initializer">
00038   : RTC::DataFlowComponentBase(manager),
00039     m_inIn("in", m_in),
00040     m_outOut("out", m_out)
00041 
00042     // </rtc-template>
00043 {
00044 }
00045 
00049 SimViewCam::~SimViewCam()
00050 {
00051 }
00052 
00053 
00054 
00055 RTC::ReturnCode_t SimViewCam::onInitialize()
00056 {
00057   // Registration: InPort/OutPort/Service
00058   // <rtc-template block="registration">
00059   // Set InPort buffers
00060   registerInPort("in", m_inIn);
00061   
00062   // Set OutPort buffer
00063   registerOutPort("out", m_outOut);
00064   
00065   // Set service provider to Ports
00066   
00067   // Set service consumers to Ports
00068   
00069   // Set CORBA Service Ports
00070   
00071   // </rtc-template>
00072 
00073   img_rcv = cvCreateImage(cvSize(320,240), IPL_DEPTH_8U, 3);
00074   img_tmp = cvCreateImage(cvSize(640,480), IPL_DEPTH_8U, 3);
00075   img_snd = cvCreateImage(cvSize(640,480), IPL_DEPTH_8U, 3);
00076 
00077   windowOn = 0; //1ならSimViewを表示
00078   if(windowOn==1)
00079         cvNamedWindow("SimView", CV_WINDOW_AUTOSIZE);
00080 
00081   return RTC::RTC_OK;
00082 }
00083 
00084 
00085 RTC::ReturnCode_t SimViewCam::onFinalize()
00086 {
00087   cvReleaseImage(&img_rcv);
00088   cvReleaseImage(&img_tmp);
00089   cvReleaseImage(&img_snd);
00090   if(windowOn==1)
00091         cvDestroyWindow("SimView");
00092 
00093   return RTC::RTC_OK;
00094 }
00095 
00096 
00097 /*
00098 RTC::ReturnCode_t SimViewCam::onStartup(RTC::UniqueId ec_id)
00099 {
00100   return RTC::RTC_OK;
00101 }
00102 */
00103 
00104 /*
00105 RTC::ReturnCode_t SimViewCam::onShutdown(RTC::UniqueId ec_id)
00106 {
00107   return RTC::RTC_OK;
00108 }
00109 */
00110 
00111 /*
00112 RTC::ReturnCode_t SimViewCam::onActivated(RTC::UniqueId ec_id)
00113 {
00114   return RTC::RTC_OK;
00115 }
00116 */
00117 
00118 /*
00119 RTC::ReturnCode_t SimViewCam::onDeactivated(RTC::UniqueId ec_id)
00120 {
00121   return RTC::RTC_OK;
00122 }
00123 */
00124 
00125 
00126 RTC::ReturnCode_t SimViewCam::onExecute(RTC::UniqueId ec_id)
00127 {
00128         int simdata,r,g,b;
00129         int maskR = 0xff0000;
00130         int maskG = 0xff00;
00131         int maskB = 0xff;
00132 
00133         //while(!m_inIn.isEmpty())
00134         if(m_inIn.isNew()){
00135                 m_inIn.read();
00136                 
00137                 //ビット演算を駆使してビューシミュレーションの画像データからRGB値を取り出す。
00138                 for(int i=0; i<(int)m_in.data.length(); i++){
00139                         simdata = m_in.data[i];
00140                         r = (simdata & maskR) >> 16;
00141                         g = (simdata & maskG) >> 8;
00142                         b = (simdata & maskB);
00143 
00144                         //IplImage型のimg_rcvはonInitialize内でcreateしている。サイズはOpenHRP3側の
00145                         //ビューシミュレーションの設定に合わせて320x240に固定してしまっているので注意。
00146                 
00147                         img_rcv->imageData[i*3]   = (uchar) b;
00148                         img_rcv->imageData[i*3+1] = (uchar) g;
00149                         img_rcv->imageData[i*3+2] = (uchar) r; 
00150 
00151                 }
00152                 if(windowOn==1){
00153                         cvShowImage("SimView",img_rcv);
00154                         cvWaitKey(5);//ShowImageするなら必須
00155                 }
00156                 //CeilingNavigationで使う画像データの型に変換して送る。
00157                 //CeilingNavigationの側ではどうやら640x480の画像にしか対応していないようなので
00158                 //img_rcvを2倍サイズのimg_sndに変換して送る。
00159                 cvResize(img_rcv, img_tmp);
00160                 cvFlip(img_tmp, img_snd, -1);//画像をフリップ(垂直軸反転)
00161                 m_out.data.length(sizeof(IplImage) + img_snd->imageSize);
00162                 memcpy(&(m_out.data[0]), (unsigned char*)img_snd, sizeof(IplImage));
00163                 memcpy(&(m_out.data[sizeof(IplImage)]), img_snd->imageData, img_snd->imageSize);
00164                 m_outOut.write();
00165         }
00166 
00167   return RTC::RTC_OK;
00168 }
00169 
00170 /*
00171 RTC::ReturnCode_t SimViewCam::onAborting(RTC::UniqueId ec_id)
00172 {
00173   return RTC::RTC_OK;
00174 }
00175 */
00176 
00177 /*
00178 RTC::ReturnCode_t SimViewCam::onError(RTC::UniqueId ec_id)
00179 {
00180   return RTC::RTC_OK;
00181 }
00182 */
00183 
00184 /*
00185 RTC::ReturnCode_t SimViewCam::onReset(RTC::UniqueId ec_id)
00186 {
00187   return RTC::RTC_OK;
00188 }
00189 */
00190 
00191 /*
00192 RTC::ReturnCode_t SimViewCam::onStateUpdate(RTC::UniqueId ec_id)
00193 {
00194   return RTC::RTC_OK;
00195 }
00196 */
00197 
00198 /*
00199 RTC::ReturnCode_t SimViewCam::onRateChanged(RTC::UniqueId ec_id)
00200 {
00201   return RTC::RTC_OK;
00202 }
00203 */
00204 
00205 
00206 
00207 extern "C"
00208 {
00209  
00210   void SimViewCamInit(RTC::Manager* manager)
00211   {
00212     coil::Properties profile(SimViewCam_spec);
00213     manager->registerFactory(profile,
00214                              RTC::Create<SimViewCam>,
00215                              RTC::Delete<SimViewCam>);
00216   }
00217   
00218 };
00219 
00220 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines


RS003
Author(s):
autogenerated on Thu Jun 27 2013 14:58:49