我想尝试做类似的事情:https://www.youtube.com/watch?v=D2Kb3ryfGNc
我成功地检测到了激光位置,但是现在我无法弄清楚如何绘制激光的位置?
我是否需要在一帧中绘制激光线的线条并将其添加到相机流帧中以确保线条被绘制?
答案 0 :(得分:1)
这就是事情 - 当我们使用openCV Mat对象流式传输连续视频时,它会逐帧显示,因此当收到第(n + 1)帧时,第n帧的信息会丢失。
你需要的是2个Mat对象 - 一个用于流式摄像机(比如Mat_cam),另一个用于绘制激光轨迹(Mat_traj)。 Mat_cam将用于使用任何标准颜色阈值算法逐帧跟踪激光位置。甚至视频都说激光应该是明亮的,这意味着jimez86可能会使用白色阈值,然后是最大的斑点定位。
当在第n帧中接收到新的激光位置时,在Mat_traj上绘制相应的圆。当接收到下一帧时,Mat_cam将被更新并且它将具有新的激光位置,但Mat_traj将是相同的,因为它不会被每次'for'循环迭代清除/刷新,因此它将包含整个弹道。使用加权加法添加Mat_traj和Mat_cam将为您提供所需的结果。按照下面的算法:
Mat Mat_traj(640,480,CV_8UC1,Scalar(0)),Mat_cam,Mat_res;
VideoCapture cam(0);
for(;;)
{
cam>>Mat_cam;
Point laserCentre=getLaserCentre(Mat_cam);//you'll be defining this function;
drawCircle(Mat_traj,laserCentre);
addWeighted(Mat_cam,Mat_traj,other_params,Mat_res);
imshow("out",Mat_res);
waitKey(10);
}