|
From: <jl...@us...> - 2008-11-12 21:00:28
|
Revision: 6603
http://personalrobots.svn.sourceforge.net/personalrobots/?rev=6603&view=rev
Author: jleibs
Date: 2008-11-12 21:00:22 +0000 (Wed, 12 Nov 2008)
Log Message:
-----------
Fixes to dcam_node and CvBridge to support color pipeline and automated rgb 2 bgr conversion.
Modified Paths:
--------------
pkg/trunk/drivers/cam/dcam_node/CMakeLists.txt
pkg/trunk/drivers/cam/dcam_node/dcam_node.cpp
pkg/trunk/image_msgs/include/image_msgs/CvBridge.h
pkg/trunk/vision/stereo_view/stereo_view.cpp
Modified: pkg/trunk/drivers/cam/dcam_node/CMakeLists.txt
===================================================================
--- pkg/trunk/drivers/cam/dcam_node/CMakeLists.txt 2008-11-12 20:28:21 UTC (rev 6602)
+++ pkg/trunk/drivers/cam/dcam_node/CMakeLists.txt 2008-11-12 21:00:22 UTC (rev 6603)
@@ -1,4 +1,6 @@
cmake_minimum_required(VERSION 2.6)
include(rosbuild)
+set(ROS_BUILD_TYPE Release)
rospack(dcam_node)
+
rospack_add_executable(dcam_node dcam_node.cpp)
Modified: pkg/trunk/drivers/cam/dcam_node/dcam_node.cpp
===================================================================
--- pkg/trunk/drivers/cam/dcam_node/dcam_node.cpp 2008-11-12 20:28:21 UTC (rev 6602)
+++ pkg/trunk/drivers/cam/dcam_node/dcam_node.cpp 2008-11-12 21:00:22 UTC (rev 6603)
@@ -126,7 +126,7 @@
string str_mode;
dc1394video_mode_t mode;
- videre_proc_mode_t videre_mode;
+ videre_proc_mode_t videre_mode = PROC_MODE_NONE;
stereo_cam_ = false;
param("~video_mode", str_mode, string("640x480_mono8"));
@@ -317,10 +317,10 @@
cam_info_.has_image = false;
}
- if (img_data->imColorType != COLOR_CODING_NONE)
+ if (img_data->imColorType != COLOR_CODING_NONE && img_data->imColorType == COLOR_CODING_RGB8)
{
fillImage(img_, "image_color",
- img_data->imHeight, img_data->imWidth, 4,
+ img_data->imHeight, img_data->imWidth, 3,
"rgba", "byte",
img_data->imColor );
@@ -344,9 +344,22 @@
cam_info_.has_image_rect = false;
}
- if (img_data->imRectColorType != COLOR_CODING_NONE)
+ if (img_data->imRectColorType != COLOR_CODING_NONE && img_data->imRectColorType == COLOR_CODING_RGB8)
{
fillImage(img_, "image_rect_color",
+ img_data->imHeight, img_data->imWidth, 3,
+ "rgb", "byte",
+ img_data->imRectColor );
+ img_.header.stamp = ros::Time(cam_->camIm->im_time * 1000);
+ publish(base_name + std::string("image_rect_color"), img_);
+ cam_info_.has_image_rect_color = true;
+ } else {
+ cam_info_.has_image_rect_color = false;
+ }
+
+ if (img_data->imRectColorType != COLOR_CODING_NONE && img_data->imRectColorType == COLOR_CODING_RGBA8)
+ {
+ fillImage(img_, "image_rect_color",
img_data->imHeight, img_data->imWidth, 4,
"rgba", "byte",
img_data->imRectColor );
Modified: pkg/trunk/image_msgs/include/image_msgs/CvBridge.h
===================================================================
--- pkg/trunk/image_msgs/include/image_msgs/CvBridge.h 2008-11-12 20:28:21 UTC (rev 6602)
+++ pkg/trunk/image_msgs/include/image_msgs/CvBridge.h 2008-11-12 21:00:22 UTC (rev 6603)
@@ -45,21 +45,41 @@
class CvBridge
{
IplImage* img_;
- bool owns_data_;
+ IplImage* rosimg_;
+ IplImage* cvtimg_;
+ void reallocCvtIfNeeded(CvSize sz, int depth, int channels)
+ {
+ if (cvtimg_ != 0)
+ if (cvtimg_->width != sz.width ||
+ cvtimg_->height != sz.height ||
+ cvtimg_->depth != depth ||
+ cvtimg_->nChannels != channels)
+ {
+ cvReleaseImage(&cvtimg_);
+ cvtimg_ = 0;
+ }
+
+ if (cvtimg_ == 0)
+ {
+ cvtimg_ = cvCreateImage(sz, depth, channels);
+ }
+ }
+
public:
- CvBridge() : img_(0), owns_data_(false)
+ CvBridge() : img_(0), rosimg_(0), cvtimg_(0)
{
- img_ = cvCreateImageHeader( cvSize(0,0), IPL_DEPTH_8U, 1 );
+ rosimg_ = cvCreateImageHeader( cvSize(0,0), IPL_DEPTH_8U, 1 );
}
~CvBridge()
{
- if (owns_data_)
- cvReleaseData(&img_);
+ if (rosimg_)
+ cvReleaseImageHeader(&rosimg_);
- cvReleaseImageHeader(&img_);
+ if (cvtimg_)
+ cvReleaseImage(&cvtimg_);
}
@@ -68,21 +88,35 @@
return img_;
}
- bool fromImage(Image& rosimg)
+ bool fromImage(Image& rosimg, std::string encoding = "")
{
if (rosimg.depth == "byte")
{
- cvInitImageHeader(img_, cvSize(rosimg.byte_data.layout.dim[1].size, rosimg.byte_data.layout.dim[0].size), IPL_DEPTH_8U, 1);
- cvSetData(img_, &(rosimg.byte_data.data[0]), rosimg.byte_data.layout.dim[1].stride);
+ cvInitImageHeader(rosimg_, cvSize(rosimg.byte_data.layout.dim[1].size, rosimg.byte_data.layout.dim[0].size),
+ IPL_DEPTH_8U, rosimg.byte_data.layout.dim[2].size);
+ cvSetData(rosimg_, &(rosimg.byte_data.data[0]), rosimg.byte_data.layout.dim[1].stride);
+ img_ = rosimg_;
} else if (rosimg.depth == "uint16") {
- cvInitImageHeader(img_, cvSize(rosimg.uint16_data.layout.dim[1].size, rosimg.uint16_data.layout.dim[0].size), IPL_DEPTH_16U, 1);
- cvSetData(img_, &(rosimg.uint16_data.data[0]), rosimg.uint16_data.layout.dim[1].stride*sizeof(uint16_t));
+ cvInitImageHeader(rosimg_, cvSize(rosimg.uint16_data.layout.dim[1].size, rosimg.uint16_data.layout.dim[0].size),
+ IPL_DEPTH_16U, rosimg.uint16_data.layout.dim[2].size);
+ cvSetData(rosimg_, &(rosimg.uint16_data.data[0]), rosimg.uint16_data.layout.dim[1].stride*sizeof(uint16_t));
+ img_ = rosimg_;
} else {
return false;
}
-
+
+ if (encoding != "" && (encoding != rosimg.encoding))
+ {
+ if (encoding == "bgr" && rosimg.encoding == "rgb")
+ {
+ reallocCvtIfNeeded(cvGetSize(rosimg_), IPL_DEPTH_8U, 3);
+ cvCvtColor(rosimg_, cvtimg_, CV_RGB2BGR);
+ img_ = cvtimg_;
+ } else {
+ return false;
+ }
+ }
return true;
-
}
private:
Modified: pkg/trunk/vision/stereo_view/stereo_view.cpp
===================================================================
--- pkg/trunk/vision/stereo_view/stereo_view.cpp 2008-11-12 20:28:21 UTC (rev 6602)
+++ pkg/trunk/vision/stereo_view/stereo_view.cpp 2008-11-12 21:00:22 UTC (rev 6603)
@@ -67,17 +67,17 @@
cvNamedWindow("right", CV_WINDOW_AUTOSIZE);
cvNamedWindow("disparity", CV_WINDOW_AUTOSIZE);
- sync.subscribe("dcam/left/image_rect", limage, 1);
- sync.subscribe("dcam/right/image_rect", rimage, 1);
+ sync.subscribe("dcam/left/image_rect_color", limage, 1);
+ sync.subscribe("dcam/right/image_rect_color", rimage, 1);
sync.subscribe("dcam/disparity", dimage, 1);
}
void image_cb_all(ros::Time t)
{
- if (lbridge.fromImage(limage))
+ if (lbridge.fromImage(limage, "bgr"))
cvShowImage("left", lbridge.toIpl());
- if (rbridge.fromImage(rimage))
+ if (rbridge.fromImage(rimage, "bgr"))
cvShowImage("right", rbridge.toIpl());
if (dbridge.fromImage(dimage))
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|