hv_process_frame.cpp
上传用户:lijia5631
上传日期:2008-11-10
资源大小:1214k
文件大小:9k
源码类别:

视频捕捉/采集

开发平台:

MultiPlatform

  1. #include <cv.h>
  2. #include "Common.h"
  3. #include "HandVu.h"
  4. //#include "LinuxDC1394CameraController.h"
  5. #include "hv_ARtk_demo.h"
  6. #include <time.h>
  7. static IplImage* m_pImage = NULL;
  8. static int m_cxImage = -1;
  9. static int m_cyImage = -1;
  10. static bool m_is_initialized = false;
  11. static bool m_img_bottom_up = false;
  12. //static LinuxDC1394CameraController* m_pCamController = NULL;
  13. static CvFont m_font;
  14. static string m_msg = "";
  15. static clock_t m_save_frame_after;
  16. static clock_t m_show_until;
  17. static clock_t m_permit_next_color_change_at;
  18. bool Initialize(int img_width, int img_height, int iPixelSize,
  19. string conductor_fname,
  20. string save_fname_root);
  21. void Draw(IplImage* pImage);
  22. void DrawMessage();
  23. void ChangeObjectColor();
  24. void hv_init(const char* conductor_fname, 
  25.      const char* save_fname_root,
  26.      int width, int height)
  27. {
  28.   if (!m_is_initialized) {
  29.     string cf = "", sf = "";
  30.     if (conductor_fname) {
  31.       cf = conductor_fname;
  32.     }
  33.     if (save_fname_root) {
  34.       sf = save_fname_root;
  35.     }
  36.     bool success = Initialize(width, height, 8, cf, sf);
  37.     if (!success) {
  38.       fprintf(stderr, "could not initializen");
  39.       exit(-1);
  40.     }
  41.   }
  42. }
  43. void hv_process_frame(char* pData, int width, int height)
  44. {
  45.   if (!m_is_initialized) {
  46.     fprintf(stderr, "hv_process_frame called before initializationn");
  47.     exit(-1);
  48.   } else { 
  49.     // test if change from initialization
  50.     bool img_bottom_up = true;
  51.     if (height<0) {
  52.       // norm for RGB images
  53.       img_bottom_up = false;
  54.       height = -height;
  55.     }
  56.     if (width!=m_cxImage || height!=m_cyImage || 
  57. img_bottom_up!=m_img_bottom_up) {
  58.       fprintf(stderr, "hv_process_frame: format changed since init!n");
  59.       exit(-1);
  60.     }
  61.   }
  62.   m_pImage->imageData = (char*) pData;
  63.   m_pImage->imageSize = width*height;
  64.   hvState state;
  65.   // ------- main library call ---------
  66.   hvAction action = 
  67.     hvProcessFrame(m_pImage);
  68.   // -------
  69.   
  70.   if (action==HV_DROP_FRAME) {
  71.     // HandVu recommends dropping the frame entirely
  72.     //    VERBOSE0(3, "HandVuFilter: dropping frame");
  73.   } else if (action==HV_SKIP_FRAME) {
  74.     //    VERBOSE0(3, "HandVuFilter: supposed to skip frame");
  75.     // HandVu recommends displaying the frame, but not doing any further
  76.     // processing on it - keep going
  77.   } else if (action==HV_PROCESS_FRAME) {
  78.     //    VERBOSE0(3, "HandVuFilter: processed frame");
  79.     // full processing was done and is recommended for following steps;
  80.     // keep going
  81.   } else {
  82.     fprintf(stderr, "unknown HVActionn");
  83.     exit(-1);
  84.   }
  85.   
  86.   hvGetState(0, state);
  87.   
  88.   //
  89.   // use HandVu state as "mouse" input
  90.   //
  91.   int button_action = HV_PTR_NO_BUTTON_ACTION;
  92.   static int was_tracked = false; 
  93.   // in order to not always turn off the pointer again and again
  94.   if (state.recognized) {
  95.     if (state.posture=="Lback") {
  96.       button_action = HV_PTR_LBUTTON_PRESSED;
  97.     } else if (state.posture=="open") {
  98.       button_action = HV_PTR_BUTTON_RELEASED;
  99.     } else if (state.posture=="sidepoint") {
  100.       button_action = HV_PTR_RBUTTON_PRESSED;
  101.     } else if (state.posture=="Lpalm") {
  102.       if (m_permit_next_color_change_at<clock()) {
  103. ChangeObjectColor();
  104. m_permit_next_color_change_at = clock() + 1*CLOCKS_PER_SEC;
  105.       }
  106.     }
  107.   }
  108.   if (state.tracked) {
  109.     int x = (int) ((m_cxImage-1)*state.center_xpos);
  110.     int y = (int) ((m_cyImage-1)*state.center_ypos);
  111.     hv_pointer_update(HV_PTR_SHOW, button_action, x, y);
  112.     was_tracked = true;
  113.     
  114.   } else if (was_tracked) {
  115.     hv_pointer_update(HV_PTR_NO_SHOW, button_action, -1, -1);
  116.     was_tracked = false;
  117.   }
  118. #if 0
  119.   int apertureSize = 3;
  120.   double lowThresh = 50;
  121.   double highThresh = 150;
  122.   static IplImage* pGray = NULL;
  123.   static IplImage* pEdges = NULL;
  124.   static IplImage* pAngles = NULL;
  125.   if (pEdges==NULL) {
  126.     pGray = cvCreateImage(cvSize(m_pImage->width, m_pImage->height), IPL_DEPTH_8U, 1);
  127.     pEdges = cvCreateImage(cvSize(m_pImage->width, m_pImage->height), IPL_DEPTH_8U, 1);
  128.     pAngles = cvCreateImage(cvSize(m_pImage->width, m_pImage->height), IPL_DEPTH_8U, 1);
  129.   }
  130.   cvCvtColor(m_pImage, pGray, CV_BGR2GRAY);
  131.   cvCanny(pGray, pEdges, lowThresh, highThresh, apertureSize);
  132.   
  133.   unsigned char* pPix = (unsigned char*) pEdges->imageData;
  134.   CvPixelPosition8u position;
  135.   CV_INIT_PIXEL_POS(position, 
  136.                     (unsigned char*)(m_pImage->imageData),
  137.                     m_pImage->widthStep, 
  138.                     cvSize(m_pImage->width, m_pImage->height), 0, 0,
  139.                     m_pImage->origin);
  140.   for (int y=0; y<m_pImage->height/2; y++) {
  141.     CV_MOVE_TO(position, 0, y, 3);
  142.     for (int x=0; x<m_pImage->width; x++) {
  143.       unsigned char* curr = CV_GET_CURRENT(position, 3);
  144.       curr[1] = *pPix;
  145.       curr[0] = *pPix;
  146.       curr[2] = *pPix++;
  147.       CV_MOVE_RIGHT(position, 3);
  148.     }
  149.   }
  150. #endif
  151.   // Draw(m_pImage);
  152.   
  153.   DrawMessage();
  154. }
  155. void hv_save_frame(char* pData, int width, int height, bool fullimg)
  156. {
  157.   if (!m_is_initialized) {
  158.     fprintf(stderr, "not initializedn");
  159.     exit(-1);
  160.   }
  161.   if (!fullimg) {
  162.     if (clock()<=m_save_frame_after) {
  163.       return;
  164.     }
  165.     m_save_frame_after = clock()+CLOCKS_PER_SEC/2;
  166.   }
  167.   
  168.   if (hvGetOverlayLevel()>0) {
  169.     static bool have_warned = false;
  170.     if (!have_warned) {
  171.       hv_show_message("WARNING: NOT SAVING IMAGES (overlay > 0)");
  172.       have_warned = true;
  173.     }
  174.     return;
  175.   }
  176.   { 
  177.     // test if change from initialization
  178.     bool img_bottom_up = true;
  179.     if (height<0) {
  180.       // norm for RGB images
  181.       img_bottom_up = false;
  182.       height = -height;
  183.     }
  184.     if (width!=m_cxImage || height!=m_cyImage || 
  185. img_bottom_up!=m_img_bottom_up) {
  186.       fprintf(stderr, "hv_process_frame: format changed since init!n");
  187.       exit(-1);
  188.     }
  189.   }
  190.   m_pImage->imageData = (char*) pData;
  191.   m_pImage->imageSize = width*height;
  192.   string f("");
  193.   if (fullimg) {
  194.     hvSaveImageArea(m_pImage, 0, 0, m_cxImage, m_cyImage, f);
  195.   } else {
  196.     // hack for ARtk_demo
  197.     m_pImage->channelSeq[0] = 'R';
  198.     m_pImage->channelSeq[1] = 'G';
  199.     m_pImage->channelSeq[2] = 'B';
  200.     hvSaveScannedArea(m_pImage, f);
  201.   }
  202. }
  203. void Draw(IplImage* pImage) 
  204. {
  205.   cvRectangle(pImage, cvPoint(5, 100),
  206.       cvPoint(15, 200), CV_RGB(255,255,0), 3);
  207.   cvCircle(pImage, cvPoint(50, 80), 10, CV_RGB(0,255,0), CV_FILLED);
  208. }
  209. extern int g_verbose;
  210. extern FILE* g_ostream;
  211. bool Initialize(int img_width, int img_height, int iPixelSize,
  212. string conductor_fname, 
  213. string save_fname_root)
  214. {
  215.   if (m_is_initialized) {
  216.     return false;
  217.   }
  218.   m_cxImage = img_width;
  219.   if (img_height<0) {
  220.     // norm for RGB images
  221.     m_img_bottom_up = false;
  222.     m_cyImage = -img_height;
  223.   } else {
  224.     m_img_bottom_up = true;
  225.     m_cyImage = img_height;
  226.   }
  227.   if (m_pImage!=NULL) {
  228.     fprintf(stderr, "m_pImage had already been initialized?!?n");
  229.   }
  230.   m_pImage = 
  231.     cvCreateImageHeader(cvSize(m_cxImage, m_cyImage), IPL_DEPTH_8U, 3);
  232.   g_verbose = 3;
  233.   g_ostream = fopen("HVout.txt", "aw+");
  234.   string version;
  235.   hvGetVersion(version, 3);
  236.   printf("%sn", version.c_str());
  237.   hvInitialize(m_cxImage, m_cyImage);
  238.   
  239.   hvLoadConductor(conductor_fname);
  240.   hvSetSaveFilenameRoot(save_fname_root);
  241.   
  242.   hvSetOverlayLevel(0);
  243.   hvStartRecognition();
  244.   
  245.   cvInitFont( &m_font, CV_FONT_VECTOR0, 0.5f /* hscale */, 
  246.       0.5f /* vscale */, 0.1f /*italic_scale */, 
  247.       1 /* thickness */);
  248.   m_save_frame_after = clock();
  249.   //  m_show_until;
  250.   m_permit_next_color_change_at = clock();
  251.   m_is_initialized = true;
  252.   return true;
  253. }
  254. void hv_key_pressed(char c)
  255. {
  256.   if (!m_is_initialized) {
  257.     return;
  258.   }
  259.   int overlay;
  260.   switch (c) {
  261.   case '0':
  262.   case '1':
  263.   case '2':
  264.   case '3':
  265.     overlay = c-'0';
  266.     hvSetOverlayLevel(overlay);
  267.     break;
  268.     
  269.   case 'r':
  270.     hvStopRecognition();
  271.     hvStartRecognition();
  272.     break;
  273.     
  274.   case 'u':
  275.     if (hvCanCorrectDistortion()) {
  276.       bool enabled = hvIsCorrectingDistortion();
  277.       hvCorrectDistortion(!enabled);
  278.     }
  279.     break;
  280.     
  281.   default:
  282.     break;
  283.   }
  284. }
  285. void hv_show_message(const char* msg)
  286. {
  287.   if (msg) {
  288.     // reset timer
  289.     m_show_until = clock() + 2*CLOCKS_PER_SEC;
  290.     // set new message
  291.     m_msg = string(msg);
  292.     fprintf(stderr, "%sn", msg);
  293.   } else {
  294.     m_msg = "";
  295.   }
  296. }
  297. void DrawMessage()
  298. {
  299.   if (m_msg=="" || m_show_until<clock()) {
  300.     m_msg = "";
  301.     return;
  302.   }
  303.   CvSize textsize;
  304.   int underline;
  305.   cvGetTextSize( m_msg.c_str(), &m_font, &textsize, &underline );
  306.   int x = 10;
  307.   int y = m_pImage->height-textsize.height-20;
  308.   CvPoint pos = cvPoint(x, y);
  309.   cvPutText(m_pImage, m_msg.c_str(), pos, &m_font, CV_RGB(0, 255, 0));
  310. }
  311. void hv_toggle_adjust_exposure()
  312. {
  313.   if (hvCanAdjustExposure()) {
  314.     bool on = hvIsAdjustingExposure();
  315.     on = !on;
  316.     hvSetAdjustExposure(on);
  317.     if (on) {
  318.       hv_show_message("HandVu is adjusting exposure");
  319.     } else {
  320.       hv_show_message("camera is adjusting exposure");
  321.     }
  322.   } else {
  323.     hv_show_message("cannot toggle exposure control");
  324.   }
  325. }