HeYijia
HeYijia
里面有几个函数名之类的和opencv3冲突了,你可以改改,不复杂。
你好,不是的。
不好意思,这个问题好像是opencv版本方面的问题?我看网上也有很多人在问,你可以谷歌下。
The rolling shutter camera model is not used in the code. But, you can use this code if your camera is not moving so fast.
In SVO, we will detect the feature when a new keyframe is selected. You can find the code at depth_filter.cpp [line 123](https://github.com/HeYijia/svo_edgelet/blob/master/src/depth_filter.cpp#L123).
no, I just use canny to detect edge.
you can save the pose with " vo_->lastFrame()->T_f_w_.inverse() ". Furthermore, the translation vector is “vo_->lastFrame()->T_f_w_.inverse().translation()”, the rotation matrix is "vo_->lastFrame()->T_f_w_.inverse().rotationMatrix()"
不好意思,没看明白你的问题?
我当时的理解是,无论是point还是edgelet,他虽然在之前的帧被detect。但是当他收敛的时候,他们会被立马挂到最新的观测帧上,而不是挂到之前detect他们的帧上。在frame_handler_mono.cpp代码的356-360行。所以我这里不断修改他们的方向,当收敛的时候,直接挂到新的帧上去。不过你可以再仔细看看,一起讨论讨论。目前的代码,edgelet在快速旋转的时候,edgelet从三维空间重投影到新图像里的直线方向跟实际的边缘方向有点匹配不上,当然大部分时候,edgelet的方向还是投影的比较准的。
刚刚重新读了下,确实是挂在detect的帧上。之前被.addCandidatePointToFrame(new_frame_)这句误解了。下面整理代码过程: it->second->frame->addFeature(it->second); 这句的关键是it->second,it是candidates_的迭代器,是pair类型,it->second它是个fts,也就是要找到fts->frame的这个frame指向的是啥?那就得看candidates_的初始化。candidates_的初始化是在depth_filter.cpp中,每当seed收敛以后,会调用seed_converged_cb_(point, it->sigma2);这个seed_converged_cb_实际上对应函数MapPointCandidates::newCandidatePoint。这个函数里对收敛的seed将其初始化成candidates,candidates_.push_back(PointCandidate(point, point->obs_.front())); 也就是说 point->obs_.front()就是前面的it->second。这时候 point刚刚在depthfilter.cpp里完成初始化,这个point->obs_里还只有一个观测量, Point* point = new Point(xyz_world, it->ftr);他的obs_.front对应的就是detect时候的图像帧。所以point是挂在detect帧上。frame_handler_mono.cpp中的357-359行只是在point已经成为point后,将新的关键帧帧上的观测量fts连到point上。