4 #include <image_geometry/pinhole_camera_model.h>
12 float old_depth =
image_.at<
float>(y, x);
13 if (old_depth == 0 || old_depth > depth) {
14 image_.at<
float>(y, x) = depth;
32 sensor_msgs::CameraInfo cam_info;
33 cam_info.D.resize(5, 0);
76 cam_info.width =
width;
88 image_geometry::PinholeCameraModel cam_model;
89 cam_model.fromCameraInfo(cam_info);
109 return rasterize(shape, cam_pose.
inverse() * obj_pose, image, pointer_map, pointer, triangle_map);
146 bool in_view =
false;
147 for (
unsigned int i = 0; i < points.
size(); ++i) {
148 points_t[i] = pose * points[i];
150 points_2d[i] = project3Dto2D<double, float>(points_t[i]);
151 if (!in_view && points_t_in_view[i])
162 const geo::Vec3d& p1_3d = points_t[it_tri->i1_];
163 const geo::Vec3d& p2_3d = points_t[it_tri->i2_];
164 const geo::Vec3d& p3_3d = points_t[it_tri->i3_];
166 uchar n_verts_in = 0;
172 if (points_t_in_view[it_tri->i1_]) {
177 if (points_t_in_view[it_tri->i2_]) {
182 if (points_t_in_view[it_tri->i3_]) {
187 if (n_verts_in == 1) {
188 if (v1_in) { vIn[0] = &(p1_3d); vIn[1] = &(p2_3d); vIn[2] = &(p3_3d); }
189 else if (v2_in) { vIn[0] = &(p2_3d); vIn[1] = &(p3_3d); vIn[2] = &(p1_3d); }
190 else { vIn[0] = &(p3_3d); vIn[1] = &(p1_3d); vIn[2] = &(p2_3d); }
207 drawTriangle<double, float>(*vIn[0], new2, new3, opt, res, i_triangle);
208 }
else if (n_verts_in == 2) {
209 if (!v1_in) { vIn[0]=&(p2_3d); vIn[1]=&(p3_3d); vIn[2]=&(p1_3d); }
210 else if (!v2_in) { vIn[0]=&(p3_3d); vIn[1]=&(p1_3d); vIn[2]=&(p2_3d); }
211 else { vIn[0]=&(p1_3d); vIn[1]=&(p2_3d); vIn[2]=&(p3_3d); }
228 drawTriangle<double, float>(*vIn[0], *vIn[1], new2, opt, res, i_triangle);
230 drawTriangle<double, float>(new2, *vIn[1], new3, opt, res, i_triangle);
232 }
else if (n_verts_in == 3) {
233 const cv::Point2f& p1_2d = points_2d[it_tri->i1_];
234 const cv::Point2f& p2_2d = points_2d[it_tri->i2_];
235 const cv::Point2f& p3_2d = points_2d[it_tri->i3_];
237 drawTriangle2D<float>(
geo::Vec3f(p1_2d.x, p1_2d.y, 1.0f / -p1_3d.
z),
240 opt, res, i_triangle);
253 template<
typename Tin,
typename Tout>
256 cv::Point_<Tout> p1_2d = project3Dto2D<Tin, Tout>(p1_3d);
257 cv::Point_<Tout> p2_2d = project3Dto2D<Tin, Tout>(p2_3d);
258 cv::Point_<Tout> p3_2d = project3Dto2D<Tin, Tout>(p3_3d);
263 opt, res, i_triangle);
274 int min_y = std::min<int>(p1.
y, std::min<int>(p2.
y, p3.
y));
275 int max_y = std::max<int>(p1.
y, std::max<int>(p2.
y, p3.
y));
276 int min_x = std::min<int>(p1.
x, std::min<int>(p2.
x, p3.
x));
277 int max_x = std::max<int>(p1.
x, std::max<int>(p2.
x, p3.
x));
279 if (min_x < res.
getWidth() && max_x > 0 && min_y < res.
getHeight() && max_y > 0) {
284 if (min_y == max_y) {
285 sort(p_min, p_mid, p_max, 0);
288 p_min->
x, 0, p_max->
x, 0,
289 p_min->
z, 0, p_max->
z, 0,
290 opt, res, i_triangle);
292 sort(p_min, p_mid, p_max, 1);
294 int y_min_mid =
static_cast<int>(p_mid->
y) -
static_cast<int>(p_min->
y);
295 int y_mid_max =
static_cast<int>(p_max->
y) -
static_cast<int>(p_mid->
y);
296 int y_min_max =
static_cast<int>(p_max->
y) -
static_cast<int>(p_min->
y);
298 geo::Vec3T<T> p_prime = (y_mid_max * *p_min + y_min_mid * *p_max) / y_min_max;
302 if (p_prime.
x > p_mid->
x)
306 p_min->
x, (p_a->
x - p_min->
x) / y_min_mid, p_min->
x, (p_b->
x - p_min->
x) / y_min_mid,
307 p_min->
z, (p_a->
z - p_min->
z) / y_min_mid, p_min->
z, (p_b->
z - p_min->
z) / y_min_mid,
308 opt, res, i_triangle);
311 p_a->
x, (p_max->
x - p_a->
x) / y_mid_max, p_b->
x, (p_max->
x - p_b->
x) / y_mid_max,
312 p_a->
z, (p_max->
z - p_a->
z) / y_mid_max, p_b->
z, (p_max->
z - p_b->
z) / y_mid_max,
313 opt, res, i_triangle);
323 float x_start,
float x_start_delta,
float x_end,
float x_end_delta,
324 float d_start,
float d_start_delta,
float d_end,
float d_end_delta,
328 d_start += d_start_delta * -y_start;
329 d_end += d_end_delta * -y_start;
330 x_start += x_start_delta * -y_start;
331 x_end += x_end_delta * -y_start;
337 for(
int y = y_start; y <= y_end; ++y) {
339 float d_delta = (d_end - d_start) / (x_end - x_start);
343 d += d_delta * -x_start;
351 for(
int x = x_start2; x <= x_end2; ++x) {
352 float depth = 1.0f / d;
358 d_start+= d_start_delta;
359 d_end += d_end_delta;
360 x_start += x_start_delta;
361 x_end += x_end_delta;
370 if (p_min->
m[i] > p_max->
m[i])
373 if (p_min->
m[i] > p_mid->
m[i])
376 if (p_mid->
m[i] > p_max->
m[i])