Revision: 6674
http://playerstage.svn.sourceforge.net/playerstage/?rev=6674&view=rev
Author: gbiggs
Date: 2008-06-24 06:54:42 -0700 (Tue, 24 Jun 2008)
Log Message:
-----------
Added cvcam driver from Paul Osmialowski
Modified Paths:
--------------
code/player/trunk/config/CMakeLists.txt
code/player/trunk/server/drivers/camera/CMakeLists.txt
Added Paths:
-----------
code/player/trunk/config/cvcam.cfg
code/player/trunk/server/drivers/camera/cvcam/
code/player/trunk/server/drivers/camera/cvcam/CMakeLists.txt
code/player/trunk/server/drivers/camera/cvcam/cvcam.cc
Modified: code/player/trunk/config/CMakeLists.txt
===================================================================
--- code/player/trunk/config/CMakeLists.txt 2008-06-24 12:00:04 UTC (rev
6673)
+++ code/player/trunk/config/CMakeLists.txt 2008-06-24 13:54:42 UTC (rev
6674)
@@ -2,6 +2,7 @@
amigobot_tcp.cfg
amtecM5.cfg
b21r_rflex_lms200.cfg
+ cvcam.cfg
dummy.cfg
erratic.cfg
gazebo.cfg
Added: code/player/trunk/config/cvcam.cfg
===================================================================
--- code/player/trunk/config/cvcam.cfg (rev 0)
+++ code/player/trunk/config/cvcam.cfg 2008-06-24 13:54:42 UTC (rev 6674)
@@ -0,0 +1,13 @@
+driver
+(
+ name "cvcam"
+ plugin "cvcam.so"
+ provides ["camera:1"]
+ size [384 288]
+)
+driver
+(
+ name "cameracompress"
+ requires ["camera:1"]
+ provides ["camera:0"]
+)
Modified: code/player/trunk/server/drivers/camera/CMakeLists.txt
===================================================================
--- code/player/trunk/server/drivers/camera/CMakeLists.txt 2008-06-24
12:00:04 UTC (rev 6673)
+++ code/player/trunk/server/drivers/camera/CMakeLists.txt 2008-06-24
13:54:42 UTC (rev 6674)
@@ -1,6 +1,7 @@
ADD_SUBDIRECTORY (v4l)
ADD_SUBDIRECTORY (1394)
ADD_SUBDIRECTORY (compress)
+ADD_SUBDIRECTORY (cvcam)
ADD_SUBDIRECTORY (imageseq)
ADD_SUBDIRECTORY (sphere)
ADD_SUBDIRECTORY (uvc)
Added: code/player/trunk/server/drivers/camera/cvcam/CMakeLists.txt
===================================================================
--- code/player/trunk/server/drivers/camera/cvcam/CMakeLists.txt
(rev 0)
+++ code/player/trunk/server/drivers/camera/cvcam/CMakeLists.txt
2008-06-24 13:54:42 UTC (rev 6674)
@@ -0,0 +1,7 @@
+PLAYERDRIVER_OPTION (cvcam build_cvcam ON)
+PLAYERDRIVER_REQUIRE_PKG (cvcam build_cvcam opencv cvcam_includeDir
+ cvcam_libDir cvcam_linkFlags cvcam_cFlags)
+PLAYERDRIVER_ADD_DRIVER (cvcam build_cvcam
+ INCLUDEDIRS "${cvcam_includeDir}" LIBDIRS "${cvcam_libDir}"
+ LINKFLAGS "${cvcam_linkFlags}" CFLAGS "${cvcam_cFlags}"
+ SOURCES cvcam.cc)
Added: code/player/trunk/server/drivers/camera/cvcam/cvcam.cc
===================================================================
--- code/player/trunk/server/drivers/camera/cvcam/cvcam.cc
(rev 0)
+++ code/player/trunk/server/drivers/camera/cvcam/cvcam.cc 2008-06-24
13:54:42 UTC (rev 6674)
@@ -0,0 +1,265 @@
+/*
+ * Player - One Hell of a Robot Server
+ * Copyright (C) 2000 Brian Gerkey et al.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+///////////////////////////////////////////////////////////////////////////
+//
+// Desc: OpenCV capture driver
+// Author: Paul Osmialowski
+// Date: 24 Jun 2008
+//
+///////////////////////////////////////////////////////////////////////////
+
+/** @ingroup drivers */
+/** @{ */
+/** @defgroup driver_cvcam cvcam
+ * @brief OpenCV camera capture
+
+The cvcam driver captures images from cameras through OpenCV infrastructure.
+
[EMAIL PROTECTED] Compile-time dependencies
+
+- OpenCV
+
[EMAIL PROTECTED] Provides
+
+- @ref interface_camera
+
[EMAIL PROTECTED] Requires
+
+- none
+
[EMAIL PROTECTED] Configuration requests
+
+- none
+
[EMAIL PROTECTED] Configuration file options
+
+- camindex (integer)
+ - Default: CV_CAP_ANY
+ - Index of camera image source (OpenCV specific)
+
+- size (integer tuple)
+ - Default: [0 0]
+ - Desired image size. This may not be honoured if the underlying driver
does
+ not support the requested size.
+ Size [0 0] denotes default device image size.
+
+- sleep_nsec (integer)
+ - Default: 10000000 (=10ms which gives max 100 fps)
+ - timespec value for nanosleep()
+
[EMAIL PROTECTED] Example
+
[EMAIL PROTECTED]
+driver
+(
+ name "cvcam"
+ provides ["camera:0"]
+)
[EMAIL PROTECTED]
+
[EMAIL PROTECTED] Paul Osmialowski
+
+*/
+/** @} */
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <time.h>
+#include <pthread.h>
+#include <libplayercore/playercore.h>
+
+#include <opencv/cv.h>
+#include <opencv/highgui.h>
+
+//---------------------------------
+
+class CvCam : public Driver
+{
+ public: CvCam(ConfigFile * cf, int section);
+ public: virtual ~CvCam();
+
+ public: virtual int Setup();
+ public: virtual int Shutdown();
+
+ // This method will be invoked on each incoming message
+ public: virtual int ProcessMessage(QueuePointer & resp_queue,
+ player_msghdr * hdr,
+ void * data);
+
+ private: virtual void Main();
+
+ private: CvCapture * capture;
+ private: int camindex;
+ private: int desired_width;
+ private: int desired_height;
+ private: int sleep_nsec;
+};
+
+Driver * CvCam_Init(ConfigFile * cf, int section)
+{
+ return reinterpret_cast<Driver *>(new CvCam(cf, section));
+}
+
+void cvcam_Register(DriverTable *table)
+{
+ table->AddDriver("cvcam", CvCam_Init);
+}
+
+CvCam::CvCam(ConfigFile * cf, int section)
+ : Driver(cf, section, true, PLAYER_MSGQUEUE_DEFAULT_MAXLEN,
PLAYER_CAMERA_CODE)
+{
+ this->capture = NULL;
+ this->camindex = cf->ReadInt(section, "camindex", CV_CAP_ANY);
+ this->desired_width = cf->ReadTupleInt(section, "size", 0, 0);
+ this->desired_height = cf->ReadTupleInt(section, "size", 1, 0);
+ if ((this->desired_width < 0) || (this->desired_height < 0))
+ {
+ PLAYER_ERROR("Wrong size");
+ this->SetError(-1);
+ return;
+ }
+ this->sleep_nsec = cf->ReadInt(section, "sleep_nsec", 10000000);
+}
+
+CvCam::~CvCam()
+{
+ if (this->capture) cvReleaseCapture(&(this->capture));
+}
+
+int CvCam::Setup()
+{
+ if (this->capture) cvReleaseCapture(&(this->capture));
+ this->capture = cvCaptureFromCAM(this->camindex);
+ this->StartThread();
+ return 0;
+}
+
+int CvCam::Shutdown()
+{
+ StopThread();
+ if (this->capture) cvReleaseCapture(&(this->capture));
+ this->capture = NULL;
+ return 0;
+}
+
+void CvCam::Main()
+{
+ struct timespec tspec;
+ IplImage * frame;
+ player_camera_data_t * data;
+ int i;
+
+ if ((this->desired_width) > 0)
+ {
+ PLAYER_WARN1("Setting capture width %.4f",
static_cast<double>(this->desired_width));
+ cvSetCaptureProperty(this->capture, CV_CAP_PROP_FRAME_WIDTH,
static_cast<double>(this->desired_width));
+ }
+ if ((this->desired_height) > 0)
+ {
+ PLAYER_WARN1("Setting capture height %.4f",
static_cast<double>(this->desired_height));
+ cvSetCaptureProperty(this->capture, CV_CAP_PROP_FRAME_HEIGHT,
static_cast<double>(this->desired_height));
+ }
+ PLAYER_WARN2("Achieved capture size %.4f x %.4f",
cvGetCaptureProperty(this->capture, CV_CAP_PROP_FRAME_WIDTH),
cvGetCaptureProperty(this->capture, CV_CAP_PROP_FRAME_HEIGHT));
+ for (;;)
+ {
+ // Go to sleep for a while (this is a polling loop).
+ tspec.tv_sec = 0;
+ tspec.tv_nsec = this->sleep_nsec;
+ nanosleep(&tspec, NULL);
+
+ // Test if we are supposed to cancel this thread.
+ pthread_testcancel();
+
+ ProcessMessages();
+ pthread_testcancel();
+
+ frame = cvQueryFrame(this->capture);
+ if (!frame)
+ {
+ PLAYER_ERROR("No frame!");
+ continue;
+ }
+ if (frame->depth != IPL_DEPTH_8U)
+ {
+ PLAYER_ERROR1("Unsupported depth %d", frame->depth);
+ continue;
+ }
+ data = reinterpret_cast<player_camera_data_t
*>(malloc(sizeof(player_camera_data_t)));
+ if (!data)
+ {
+ PLAYER_ERROR("Out of memory");
+ continue;
+ }
+ assert((frame->nChannels) > 0);
+ data->image_count = frame->width * frame->height * frame->nChannels;
+ assert(data->image_count > 0);
+ data->image = reinterpret_cast<unsigned char *>(malloc(data->image_count));
+ if (!(data->image))
+ {
+ PLAYER_ERROR("Out of memory");
+ continue;
+ }
+ data->width = frame->width;
+ data->height = frame->height;
+ data->bpp = frame->nChannels * 8;
+ data->fdiv = 0;
+ switch (data->bpp)
+ {
+ case 8:
+ data->format = PLAYER_CAMERA_FORMAT_MONO8;
+ memcpy(data->image, frame->imageData, data->image_count);
+ break;
+ case 24:
+ data->format = PLAYER_CAMERA_FORMAT_RGB888;
+ for (i = 0; i < static_cast<int>(data->image_count); i +=
(frame->nChannels))
+ {
+ data->image[i] = frame->imageData[i + 2];
+ data->image[i + 1] = frame->imageData[i + 1];
+ data->image[i + 2] = frame->imageData[i];
+ }
+ case 32:
+ data->format = PLAYER_CAMERA_FORMAT_RGB888;
+ for (i = 0; i < static_cast<int>(data->image_count); i +=
(frame->nChannels))
+ {
+ data->image[i] = frame->imageData[i + 2];
+ data->image[i + 1] = frame->imageData[i + 1];
+ data->image[i + 2] = frame->imageData[i];
+ data->image[i + 3] = frame->imageData[i + 3];
+ }
+ break;
+ default:
+ PLAYER_ERROR1("Unsupported image depth %d", data->bpp);
+ data->bpp = 0;
+ }
+ assert(data->bpp > 0);
+ data->compression = PLAYER_CAMERA_COMPRESS_RAW;
+ this->Publish(device_addr, PLAYER_MSGTYPE_DATA, PLAYER_CAMERA_DATA_STATE,
reinterpret_cast<void *>(data), 0, NULL, false);
+ // copy = false, don't dispose anything here
+ pthread_testcancel();
+ }
+}
+
+int CvCam::ProcessMessage(QueuePointer & resp_queue, player_msghdr * hdr, void
* data)
+{
+ assert(hdr);
+ return -1;
+}
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
-------------------------------------------------------------------------
Check out the new SourceForge.net Marketplace.
It's the best place to buy or sell services for
just about anything Open Source.
http://sourceforge.net/services/buy/index.php
_______________________________________________
Playerstage-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/playerstage-commit