36 #define BOOST_PARAMETER_MAX_ARITY 7
46 DiagnosticNodelet::onInit();
48 pub_ = advertise<jsk_recognition_msgs::BoundingBoxArray>(*pnh_,
"output", 1);
49 pub_target_image_ = advertise<sensor_msgs::Image>(*pnh_,
"output/target_image", 1);
69 const sensor_msgs::CameraInfo::ConstPtr& info_msg)
76 const jsk_recognition_msgs::BoundingBoxArray::ConstPtr& target_boxes_msg)
84 const jsk_recognition_msgs::BoundingBoxArray::ConstPtr& candidate_boxes_msg)
103 std::vector<std::vector<cv::Point2i> >
faces;
110 std::vector<std::vector<cv::Point2i> > projected_faces =
separateIntoFaces(projected_vertices);
111 for (
size_t j = 0; j < projected_faces.size(); j++) {
112 faces.push_back(projected_faces[j]);
115 for (
size_t i = 0;
i <
faces.size();
i++) {
116 std::vector<std::vector<cv::Point2i> > one_face;
117 one_face.push_back(
faces[
i]);
118 cv::fillPoly(image, one_face, cv::Scalar(255));
131 std::vector<size_t> candidate_indices;
132 for (
size_t i = 0;
i < candidate_boxes_msg->boxes.size();
i++) {
135 jsk_recognition_msgs::BoundingBox
box = candidate_boxes_msg->boxes[
i];
139 std::vector<std::vector<cv::Point2i> > projected_faces =
separateIntoFaces(projected_vertices);
140 for (
size_t j = 0; j < projected_faces.size(); j++) {
141 std::vector<std::vector<cv::Point2i> > one_face;
142 one_face.push_back(projected_faces[j]);
143 cv::fillPoly(candidate_image, one_face, cv::Scalar(255));
149 cv::bitwise_and(image, candidate_image, candidate_image);
150 if (cv::countNonZero(candidate_image) == 0) {
151 candidate_indices.push_back(
i);
154 jsk_recognition_msgs::BoundingBoxArray rejected_boxes;
155 rejected_boxes.header = candidate_boxes_msg->header;
156 for (
size_t i = 0;
i < candidate_indices.size();
i++) {
157 rejected_boxes.boxes.push_back(candidate_boxes_msg->boxes[candidate_indices[
i]]);
163 const std::vector<cv::Point2i>& vertices)
166 std::vector<std::vector<cv::Point2i> > ret;
167 std::vector<cv::Point2i> face0, face1, face2, face3, face4, face5;
168 cv::Point2i
a = vertices[0];
169 cv::Point2i
b = vertices[1];
170 cv::Point2i
c = vertices[2];
171 cv::Point2i
d = vertices[3];
172 cv::Point2i e = vertices[4];
173 cv::Point2i
f = vertices[5];
174 cv::Point2i
g = vertices[6];
175 cv::Point2i h = vertices[7];
176 face0.push_back(
a); face0.push_back(e); face0.push_back(
f); face0.push_back(
b);
177 face1.push_back(
b); face1.push_back(
f); face1.push_back(
g); face1.push_back(
c);
178 face2.push_back(
c); face2.push_back(
g); face2.push_back(h); face2.push_back(
d);
179 face3.push_back(
d); face3.push_back(h); face3.push_back(e); face3.push_back(
a);
180 face4.push_back(
a); face4.push_back(
b); face4.push_back(
c); face4.push_back(
d);
181 face5.push_back(e); face5.push_back(h); face5.push_back(
g); face5.push_back(
f);
183 ret.push_back(face0);
184 ret.push_back(face1);
185 ret.push_back(face2);
186 ret.push_back(face3);
187 ret.push_back(face4);
188 ret.push_back(face5);
195 std::vector<cv::Point2i> ret;
196 for (
size_t i = 0;
i < vertices.size();
i++) {
197 ret.push_back(
model.project3dToPixel(vertices[
i]));
204 Eigen::Affine3f
pose;
206 Eigen::Vector3f local_a(
box.dimensions.x / 2,
box.dimensions.y / 2,
box.dimensions.z / 2);
207 Eigen::Vector3f local_b(-
box.dimensions.x / 2,
box.dimensions.y / 2,
box.dimensions.z / 2);
208 Eigen::Vector3f local_c(-
box.dimensions.x / 2, -
box.dimensions.y / 2,
box.dimensions.z / 2);
209 Eigen::Vector3f local_d(
box.dimensions.x / 2, -
box.dimensions.y / 2,
box.dimensions.z / 2);
210 Eigen::Vector3f local_e(
box.dimensions.x / 2,
box.dimensions.y / 2, -
box.dimensions.z / 2);
211 Eigen::Vector3f local_f(-
box.dimensions.x / 2,
box.dimensions.y / 2, -
box.dimensions.z / 2);
212 Eigen::Vector3f local_g(-
box.dimensions.x / 2, -
box.dimensions.y / 2, -
box.dimensions.z / 2);
213 Eigen::Vector3f local_h(
box.dimensions.x / 2, -
box.dimensions.y / 2, -
box.dimensions.z / 2);
214 Eigen::Vector3f
a =
pose * local_a;
215 Eigen::Vector3f
b =
pose * local_b;
216 Eigen::Vector3f
c =
pose * local_c;
217 Eigen::Vector3f
d =
pose * local_d;
218 Eigen::Vector3f e =
pose * local_e;
219 Eigen::Vector3f
f =
pose * local_f;
220 Eigen::Vector3f
g =
pose * local_g;
221 Eigen::Vector3f h =
pose * local_h;
222 cv::Point3d cv_a(
a[0],
a[1],
a[2]);
223 cv::Point3d cv_b(
b[0],
b[1],
b[2]);
224 cv::Point3d cv_c(
c[0],
c[1],
c[2]);
225 cv::Point3d cv_d(
d[0],
d[1],
d[2]);
226 cv::Point3d cv_e(e[0], e[1], e[2]);
227 cv::Point3d cv_f(
f[0],
f[1],
f[2]);
228 cv::Point3d cv_g(
g[0],
g[1],
g[2]);
229 cv::Point3d cv_h(h[0], h[1], h[2]);
230 std::vector<cv::Point3d> ret;