libeblearntools
/home/rex/ebltrunk/tools/libeblearntools/include/camera_opencv.hpp
00001 /***************************************************************************
00002  *   Copyright (C) 2010 by Pierre Sermanet   *
00003  *   pierre.sermanet@gmail.com   *
00004  *   All rights reserved.
00005  *
00006  * Redistribution and use in source and binary forms, with or without
00007  * modification, are permitted provided that the following conditions are met:
00008  *     * Redistributions of source code must retain the above copyright
00009  *       notice, this list of conditions and the following disclaimer.
00010  *     * Redistributions in binary form must reproduce the above copyright
00011  *       notice, this list of conditions and the following disclaimer in the
00012  *       documentation and/or other materials provided with the distribution.
00013  *     * Redistribution under a license not approved by the Open Source 
00014  *       Initiative (http://www.opensource.org) must display the 
00015  *       following acknowledgement in all advertising material:
00016  *        This product includes software developed at the Courant
00017  *        Institute of Mathematical Sciences (http://cims.nyu.edu).
00018  *     * The names of the authors may not be used to endorse or promote products
00019  *       derived from this software without specific prior written permission.
00020  *
00021  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED 
00022  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
00023  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
00024  * DISCLAIMED. IN NO EVENT SHALL ThE AUTHORS BE LIABLE FOR ANY
00025  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
00026  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
00027  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
00028  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
00029  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
00030  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00031  ***************************************************************************/
00032 
00033 #ifndef CAMERA_OPENCV_HPP_
00034 #define CAMERA_OPENCV_HPP_
00035 
00036 namespace ebl {
00037 
00039   // constructors & initializations
00040 
00041   template <typename Tdata>
00042   camera_opencv<Tdata>::camera_opencv(int id, int height_, int width_)
00043     : camera<Tdata>(height_, width_) {
00044 #ifndef __OPENCV__
00045   eblerror("opencv not found, install and recompile");
00046 #else
00047     cout << "Initializing OpenCV camera..." << endl;
00048     capture = cvCaptureFromCAM(id);
00049     if (!capture) {
00050       fprintf( stderr, "ERROR: capture is NULL \n" );
00051       getchar();
00052       eblerror("failed to initialize camera_opencv");
00053     }
00054     cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, width_);
00055     cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, height_);
00056     cvSetCaptureProperty(capture, CV_CAP_PROP_FPS, 30);
00057 #endif /* __OPENCV__ */
00058   }
00059   
00060   template <typename Tdata>
00061   camera_opencv<Tdata>::~camera_opencv() {
00062 #ifdef __OPENCV__
00063     // release camera_opencv
00064     cvReleaseCapture(&capture);
00065 #endif /* __OPENCV__ */
00066   }
00067   
00069   // frame grabbing
00070 
00071   template <typename Tdata>
00072   idx<Tdata> camera_opencv<Tdata>::grab() {
00073 #ifdef __OPENCV__
00074     ipl_frame = cvQueryFrame(capture);
00075     if (!ipl_frame)
00076       eblerror("failed to grab frame");
00077     // convert ipl to idx image
00078     if (grabbed)
00079       ipl_to_idx(ipl_frame, frame);
00080     else // first time, allocate frame
00081       frame = ipl_to_idx<Tdata>(ipl_frame);
00082 #endif /* __OPENCV__ */
00083     frame_id_++;
00084     return this->postprocess();
00085   }
00086     
00087 } // end namespace ebl
00088 
00089 #endif /* CAMERA_OPENCV_HPP_ */