43 DiagnosticNodelet::onInit();
45 this->
pub_image_ = advertise<sensor_msgs::Image>(
46 *pnh_,
"image_output", 1);
52 this->
sub_ = pnh_->subscribe(
64 const sensor_msgs::Image::ConstPtr& image_msg)
72 ROS_ERROR(
"cv_bridge exception: %s", e.what());
75 cv::Mat image = cv_ptr->image;
78 out_msg->header = cv_ptr->header;
80 out_msg->image = image.clone();
91 if (image.type() == CV_8UC3) {
92 cv::cvtColor(image, image, CV_BGR2GRAY);
95 image.convertTo(img, CV_32F, 1/255.0);
96 cv::Mat prev = cv::Mat::zeros(
img.size(), CV_32F);
101 cv::absdiff(img, prev, difference);
103 }
while (cv::countNonZero(difference) > 0);
108 cv::Mat& img,
int iter)
111 ROS_ERROR(
"--CANNOT THIN EMPTY DATA...");
114 cv::Mat marker = cv::Mat::zeros(
img.size(), CV_32F);
116 #pragma omp parallel for collapse(2) num_threads(this->num_threads_)
118 for (
int i = 1;
i <
img.rows-1;
i++) {
119 for (
int j = 1; j <
img.cols-1; j++) {
122 for (
int y = -1; y <= 1; y++) {
123 for (
int x = -1;
x <= 1;
x++) {
124 val[icounter] =
img.at<
float>(
i + y, j +
x);
128 int A = ((val[1] == 0 && val[2] == 1) ?
ODD :
EVEN)
129 + ((val[2] == 0 && val[5] == 1) ?
ODD :
EVEN)
130 + ((val[5] == 0 && val[8] == 1) ?
ODD :
EVEN)
131 + ((val[8] == 0 && val[7] == 1) ?
ODD :
EVEN)
132 + ((val[7] == 0 && val[6] == 1) ?
ODD :
EVEN)
133 + ((val[6] == 0 && val[3] == 1) ?
ODD :
EVEN)
134 + ((val[3] == 0 && val[0] == 1) ?
ODD :
EVEN)
135 + ((val[0] == 0 && val[1] == 1) ?
ODD :
EVEN);
136 int B = val[0] + val[1] + val[2] + val[3]
137 + val[5] + val[6] + val[7] + val[8];
138 int m1 = iter ==
EVEN ? (val[1] * val[5] * val[7])
139 : (val[1] * val[3] * val[5]);
140 int m2 = iter ==
EVEN ? (val[3] * val[5] * val[7])
141 : (val[1] * val[3] * val[7]);
142 if (
A == 1 && (B >= 2 && B <= 6) && !m1 && !m2) {
143 marker.at<
float>(
i, j) =
sizeof(
char);
147 cv::bitwise_not(marker, marker);
148 cv::bitwise_and(img, marker, img);