|
From: <jl...@us...> - 2008-06-17 20:47:05
|
Revision: 834
http://personalrobots.svn.sourceforge.net/personalrobots/?rev=834&view=rev
Author: jleibs
Date: 2008-06-17 13:47:07 -0700 (Tue, 17 Jun 2008)
Log Message:
-----------
Axis_cam takes a ride on the rosbus, cv_bridge modified with options for optionally correcting colorspace and maxdepth issues.
Modified Paths:
--------------
pkg/trunk/drivers/cam/axis_cam/manifest.xml
pkg/trunk/drivers/cam/axis_cam/src/Makefile
pkg/trunk/drivers/cam/axis_cam/src/axis_cam/Makefile
pkg/trunk/drivers/cam/axis_cam/src/axis_cam/axis_cam.cpp
pkg/trunk/util/image_utils/include/image_utils/cv_bridge.h
pkg/trunk/util/image_utils/include/image_utils/jpeg_wrapper.h
pkg/trunk/vision/cv_view/cv_view.cpp
Modified: pkg/trunk/drivers/cam/axis_cam/manifest.xml
===================================================================
--- pkg/trunk/drivers/cam/axis_cam/manifest.xml 2008-06-17 18:48:53 UTC (rev 833)
+++ pkg/trunk/drivers/cam/axis_cam/manifest.xml 2008-06-17 20:47:07 UTC (rev 834)
@@ -11,12 +11,12 @@
<author>Morgan Quigley (email: mqu...@cs...)</author>
<license>BSD</license>
<url>http://stair.stanford.edu</url>
+<depend package="roscpp"/>
<depend package="std_msgs"/>
-<!--<depend package="image_viewer"/>-->
<depend package="rosthread"/>
<depend package="string_utils"/>
<export>
- <cpp cflags="-I${prefix}/include" lflags="-L${prefix}/lib -laxis_cam"/>
+ <cpp cflags="-I${prefix}/include" lflags="-L${prefix}/lib -laxis_cam -lcurl"/>
</export>
</package>
Modified: pkg/trunk/drivers/cam/axis_cam/src/Makefile
===================================================================
--- pkg/trunk/drivers/cam/axis_cam/src/Makefile 2008-06-17 18:48:53 UTC (rev 833)
+++ pkg/trunk/drivers/cam/axis_cam/src/Makefile 2008-06-17 20:47:07 UTC (rev 834)
@@ -1,3 +1,3 @@
-SUBDIRS = libaxis_cam
+SUBDIRS = axis_cam libaxis_cam
include $(shell rospack find mk)/recurse_subdirs.mk
Modified: pkg/trunk/drivers/cam/axis_cam/src/axis_cam/Makefile
===================================================================
--- pkg/trunk/drivers/cam/axis_cam/src/axis_cam/Makefile 2008-06-17 18:48:53 UTC (rev 833)
+++ pkg/trunk/drivers/cam/axis_cam/src/axis_cam/Makefile 2008-06-17 20:47:07 UTC (rev 834)
@@ -1,4 +1,4 @@
SRC = axis_cam.cpp
OUT = ../../nodes/axis_cam
PKG = axis_cam
-include $(shell $(ROS_ROOT)/rospack find roscpp)/make_include/node.mk
+include $(shell rospack find mk)/node.mk
Modified: pkg/trunk/drivers/cam/axis_cam/src/axis_cam/axis_cam.cpp
===================================================================
--- pkg/trunk/drivers/cam/axis_cam/src/axis_cam/axis_cam.cpp 2008-06-17 18:48:53 UTC (rev 833)
+++ pkg/trunk/drivers/cam/axis_cam/src/axis_cam/axis_cam.cpp 2008-06-17 20:47:07 UTC (rev 834)
@@ -27,68 +27,75 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
-#include "ros/ros_slave.h"
-#include "common_flows/FlowImage.h"
+#include "ros/node.h"
+#include "std_msgs/Image.h"
+
#include "axis_cam/axis_cam.h"
-class AxisCamNode : public ROS_Slave
+class Axis_cam_node : public ros::node
{
public:
- FlowImage *image;
+ std_msgs::Image image;
+
string axis_host;
AxisCam *cam;
int frame_id;
- AxisCamNode() : ROS_Slave(), cam(NULL), frame_id(0)
+ Axis_cam_node() : ros::node("axis_ptz"), cam(NULL), frame_id(0)
{
- register_source(image = new FlowImage("image"));
- register_with_master();
- if (!get_string_param(".host", axis_host))
- {
- printf("host parameter not specified; defaulting to 192.168.0.90\n");
- axis_host = "192.168.0.90";
- }
+ advertise<std_msgs::Image>("image");
+
+ param("host", axis_host, string("192.168.0.90"));
printf("axis_cam host set to [%s]\n", axis_host.c_str());
- get_int_param(".frame_id", &frame_id);
+
cam = new AxisCam(axis_host);
- printf("package path is [%s]\n", get_my_package_path().c_str());
}
- virtual ~AxisCamNode()
+
+ virtual ~Axis_cam_node()
{
if (cam)
delete cam;
}
+
bool take_and_send_image()
{
uint8_t *jpeg;
uint32_t jpeg_size;
+
if (!cam->get_jpeg(&jpeg, &jpeg_size))
{
- log(ROS::ERROR, "woah! AxisCam::get_jpeg returned an error");
+ log(ros::ERROR, "woah! AxisCam::get_jpeg returned an error");
return false;
}
- //printf("sending %d-byte jpeg block\n", jpeg_size);
- image->set_data_size(jpeg_size);
- memcpy(image->data, jpeg, jpeg_size);
- image->width = 704;
- image->height = 480;
- image->compression = "jpeg";
- image->colorspace = "rgb24";
- image->frame_id = frame_id;
- image->publish();
+
+ image.set_data_size(jpeg_size);
+ memcpy(image.data, jpeg, jpeg_size);
+
+ //TODO: Read width and height from somewhere else
+ image.width = 704;
+ image.height = 480;
+ image.compression = "jpeg";
+ image.colorspace = "rgb24";
+
+ publish("image", image);
+
return true;
}
};
int main(int argc, char **argv)
{
- AxisCamNode a;
- while (a.happy())
+ ros::init(argc, argv);
+
+ Axis_cam_node a;
+ while (a.ok())
if (!a.take_and_send_image())
{
- a.log(ROS::ERROR,"couldn't take image.");
+ a.log(ros::ERROR,"couldn't take image.");
break;
}
+
+ ros::fini();
return 0;
}
Modified: pkg/trunk/util/image_utils/include/image_utils/cv_bridge.h
===================================================================
--- pkg/trunk/util/image_utils/include/image_utils/cv_bridge.h 2008-06-17 18:48:53 UTC (rev 833)
+++ pkg/trunk/util/image_utils/include/image_utils/cv_bridge.h 2008-06-17 20:47:07 UTC (rev 834)
@@ -35,12 +35,16 @@
template <class T>
class CvBridge : public ImageCodec<T>
{
+ uint32_t options;
+
public:
- CvBridge(T *msg) :
- ImageCodec<T>(msg)
- {
- }
+ static const uint32_t CORRECT_BGR = 0x0001;
+ static const uint32_t MAXDEPTH_8U = 0x0002;
+ CvBridge(T *msg, uint32_t _options = 0) :
+ ImageCodec<T>(msg),
+ options(_options) { }
+
bool from_cv(IplImage *cv_image, int compression_quality = 90)
{
this->msg->width = cv_image->width;
@@ -77,11 +81,14 @@
int channels = 1;
int depth = IPL_DEPTH_8U;
int elem_size = 1;
+ bool needs_swap_rb = false;
+ bool needs_depth_reduced = false;
if (this->msg->colorspace == "rgb24") {
channels = 3;
elem_size = 1;
depth = IPL_DEPTH_8U;
+ needs_swap_rb = true;
} else if (this->msg->colorspace == "mono8") {
channels = 1;
elem_size = 1;
@@ -90,14 +97,30 @@
channels = 1;
elem_size = 2;
depth = IPL_DEPTH_16U;
+ needs_depth_reduced = true;
}
*cv_image = cvCreateImage(cvSize(this->msg->width, this->msg->height),
depth, channels);
+
// todo: ensure row alignment is ok (copy in one scanline at a time)
for (size_t row = 0; row < this->msg->height; row++)
memcpy((*cv_image)->imageData + row * (*cv_image)->widthStep,
this->raster + row * this->msg->width * channels * elem_size, this->msg->width*channels * elem_size);
+
+ if ((options & CORRECT_BGR) && needs_swap_rb)
+ cvCvtColor(*cv_image, *cv_image, CV_RGB2BGR);
+
+ if ((options & MAXDEPTH_8U) && needs_depth_reduced)
+ {
+ IplImage* cv_image_sc = cvCreateImage(cvSize(this->msg->width, this->msg->height),
+ IPL_DEPTH_8U, channels);
+ cvCvtScale(*cv_image, cv_image_sc, 0.0625, 0);
+ cvReleaseImage(cv_image);
+ *cv_image = cv_image_sc;
+ }
+
+
return true;
}
};
Modified: pkg/trunk/util/image_utils/include/image_utils/jpeg_wrapper.h
===================================================================
--- pkg/trunk/util/image_utils/include/image_utils/jpeg_wrapper.h 2008-06-17 18:48:53 UTC (rev 833)
+++ pkg/trunk/util/image_utils/include/image_utils/jpeg_wrapper.h 2008-06-17 20:47:07 UTC (rev 834)
@@ -64,7 +64,7 @@
if (dinfo.out_color_space == JCS_GRAYSCALE) {
raster_type = RT_MONO8;
}
- else if (dinfo.out_color_space == JCS_GRAYSCALE)
+ else if (dinfo.out_color_space == JCS_RGB)
{
raster_type = RT_RGB24;
}
Modified: pkg/trunk/vision/cv_view/cv_view.cpp
===================================================================
--- pkg/trunk/vision/cv_view/cv_view.cpp 2008-06-17 18:48:53 UTC (rev 833)
+++ pkg/trunk/vision/cv_view/cv_view.cpp 2008-06-17 20:47:07 UTC (rev 834)
@@ -20,13 +20,13 @@
ros::thread::mutex cv_mutex;
IplImage *cv_image;
- IplImage *cv_image_sc;
char dir_name[256];
int img_cnt;
bool made_dir;
- CvView() : node("cv_view"), cv_bridge(&image_msg), cv_image(0), cv_image_sc(0), img_cnt(0), made_dir(false)
+ CvView() : node("cv_view"), cv_bridge(&image_msg, CvBridge<std_msgs::Image>::CORRECT_BGR | CvBridge<std_msgs::Image>::MAXDEPTH_8U),
+ cv_image(0), img_cnt(0), made_dir(false)
{
cvNamedWindow("cv_view", CV_WINDOW_AUTOSIZE);
subscribe("image", image_msg, &CvView::image_cb, 1);
@@ -43,30 +43,19 @@
~CvView()
{
- free_images();
- }
-
- void free_images()
- {
if (cv_image)
cvReleaseImage(&cv_image);
- if (cv_image_sc)
- cvReleaseImage(&cv_image_sc);
}
void image_cb()
{
cv_mutex.lock();
- free_images();
+ if (cv_image)
+ cvReleaseImage(&cv_image);
+
if (cv_bridge.to_cv(&cv_image))
{
- cv_image_sc = cvCreateImage(cvSize(cv_image->width, cv_image->height),
- IPL_DEPTH_8U, 1);
- if (cv_image->depth == IPL_DEPTH_16U)
- cvCvtScale(cv_image, cv_image_sc, 0.0625, 0);
- else
- cvCvtScale(cv_image, cv_image_sc, 1, 0);
- cvShowImage("cv_view", cv_image_sc);
+ cvShowImage("cv_view", cv_image);
}
cv_mutex.unlock();
}
@@ -93,7 +82,7 @@
}
std::ostringstream oss;
oss << dir_name << "/Img" << img_cnt++ << ".png";
- cvSaveImage(oss.str().c_str(), cv_image_sc);
+ cvSaveImage(oss.str().c_str(), cv_image);
}
};
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|