Go to the documentation of this file.00001 #include "bitwise_and_alg_node.h"
00002
00003
00004 using namespace cv;
00005
00006 BitwiseAndAlgNode::BitwiseAndAlgNode(void) :
00007 algorithm_base::IriBaseAlgorithm<BitwiseAndAlgorithm>()
00008 {
00009
00010 this->loop_rate_ = 2;
00011 has_image1_ = false;
00012 has_image2_ = false;
00013
00014
00015 this->image_out_publisher_ = this->public_node_handle_.advertise<sensor_msgs::Image>("image_out", 1);
00016
00017
00018 this->image_in1_subscriber_ = this->public_node_handle_.subscribe("image_in1", 1, &BitwiseAndAlgNode::image_in1_callback, this);
00019 this->image_in2_subscriber_ = this->public_node_handle_.subscribe("image_in2", 1, &BitwiseAndAlgNode::image_in2_callback, this);
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 }
00030
00031 BitwiseAndAlgNode::~BitwiseAndAlgNode(void)
00032 {
00033
00034 }
00035
00036 void BitwiseAndAlgNode::mainNodeThread(void)
00037 {
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047 }
00048
00049
00050 void BitwiseAndAlgNode::image_in1_callback(const sensor_msgs::Image::ConstPtr& msg)
00051 {
00052 cv_bridge::CvImagePtr cv_ptr;
00053 try
00054 {
00055 cv_ptr = cv_bridge::toCvCopy(msg, sensor_msgs::image_encodings::BGR8);
00056 }
00057 catch (cv_bridge::Exception& e)
00058 {
00059 ROS_ERROR("cv_bridge exception: %s", e.what());
00060 return;
00061 }
00062 last_image1_ = cv_ptr->image;
00063 has_image1_ = true;
00064
00065 publish_bitwise_and_last_images();
00066 }
00067
00068 void BitwiseAndAlgNode::image_in2_callback(const sensor_msgs::Image::ConstPtr& msg)
00069 {
00070 cv_bridge::CvImagePtr cv_ptr;
00071 try
00072 {
00073 cv_ptr = cv_bridge::toCvCopy(msg, sensor_msgs::image_encodings::BGR8);
00074 }
00075 catch (cv_bridge::Exception& e)
00076 {
00077 ROS_ERROR("cv_bridge exception: %s", e.what());
00078 return;
00079 }
00080 last_image2_ = cv_ptr->image;
00081 has_image2_ = true;
00082
00083 publish_bitwise_and_last_images();
00084 }
00085
00086
00087
00088
00089
00090
00091
00092
00093 void BitwiseAndAlgNode::publish_bitwise_and_last_images()
00094 {
00095 Mat dst;
00096
00097
00098 if (has_image1_ && has_image2_) {
00099 cv::bitwise_and(last_image1_, last_image2_, dst);
00100 has_image1_ = false;
00101 has_image2_ = false;
00102 this->image_out_publisher_.publish( cvimage_to_rosimage(dst));
00103 }
00104 else {
00105 ROS_WARN("BitwiseAndAlgNode: Input images aren't ready!");
00106 }
00107 }
00108
00109 void BitwiseAndAlgNode::node_config_update(Config &config, uint32_t level)
00110 {
00111 this->alg_.lock();
00112
00113
00114 this->alg_.config_=config;
00115
00116 this->alg_.unlock();
00117 }
00118
00119 void BitwiseAndAlgNode::addNodeDiagnostics(void)
00120 {
00121 }
00122
00123 sensor_msgs::ImagePtr BitwiseAndAlgNode::cvimage_to_rosimage(cv::Mat cvimage)
00124 {
00125 cv_bridge::CvImage out_msg;
00126 out_msg.encoding = sensor_msgs::image_encodings::BGR8;
00127 out_msg.image = cvimage;
00128 out_msg.header.stamp = ros::Time::now();
00129
00130 return out_msg.toImageMsg();
00131 }
00132
00133
00134 int main(int argc,char *argv[])
00135 {
00136 return algorithm_base::main<BitwiseAndAlgNode>(argc, argv, "bitwise_and_alg_node");
00137 }